Scikit-learn:训练/测试拆分以在列中包含两种不同类型值的相同表示

数据挖掘 Python scikit-学习 熊猫 数据
2022-02-23 14:59:57

我有一个在线采购订单数据集,其中包含两种类型的客户:

  • 拥有帐户的客户因此是具有唯一客户编号的已知客户。
  • 没有账户并以客人身份进行购买的客户;因此,这些是未知客户并被赋予一个默认号码(在 50 个预定义号码的列表中)。这意味着它不是唯一的编号,此处区分交易的唯一方法是通过唯一的订单编号。

为了避免失真并确保我的训练/测试数据集在已知和未知客户方面具有相同的分布,我想选择一个训练/测试集,如下所示:

包含要拆分的已知客户的数据集部分 80/20。

包含未知客户的数据集部分将被拆分 80/20(此处子数据集的选择将取决于订单未链接到客户(= 链接到默认客户编号)的规则。

在 Scikit-learn 中,我需要设置 X(features) 和 Y(target) 才能进行 train_test_split。我的问题是将我的数据框拆分为:

  • df1 包含所有已知客户。
  • df2 包含所有未知客户。

然后为 df1 和 df2 分别设置 X、Y 和 x_train、x_test、y_train、y_test,然后将结果合并为一个并继续构建模型的其余部分?

这是一个好方法还是有其他解决方案?

4个回答

只保留一个数据框
添加一列(如果不可用)来标记 - 访客或客户
然后,只需在该列上使用分层标志进行拆分

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=19, stratify=data['guest'])

stratify : 类似数组,默认 = None
如果不是 None,则数据以分层方式拆分,将其用作类标签

我同意前面所说的意见。作为替代方案,如果您发现客户的行为是否是客人,也取决于您使用的模型,那么使用两种不同的模型可能是有意义的。例如,如果您知道将使用 LogisticRegression 而不是常规客户的行为分布在更大范围内,那么您可能通过使用两个 Logistic 回归(一个用于常规客户,另一个用于访客客户)获得更好的分数。

欢迎来到 StackExchange 的数据科学,

实现此目的的一种方法是使用 train_test_split 中的 stratify 选项,因为您已经在使用该功能(这也可以确保您的标签均匀分布,在建模不平衡数据集时非常有用):

训练,测试 = train_test_split(df, test_size=0.50, stratify=df['B'])

在我的示例中,您可以看到 B 列中有 2 个值,它们平均分布在 2 个数据集中。在您的情况下,B 将是指示拥有帐户和没有帐户的客户的列。

在此处输入图像描述

是否有可能执行以下操作:

保留一个数据集,但为这些未知客户提供每个唯一订单号的唯一编号。

比如用相同的代码更新客户代码列,比如唯一的订单号,前面加上一些表明它以前是未知客户的东西。