XGBOOST - train_test_split 和手动拆分之间的不同结果

数据挖掘 决策树 xgboost
2021-10-13 01:12:29

我正在尝试训练 XGBOOST 模型。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=43, stratify=y)

当我使用 train_test_split 并传递模型 X_train、Y_train 和 eval_set X_test、Y_test 时,模型似乎是一个非常好的模型。

厘米示例:

在此处输入图像描述

但是当我手动拆分数据集时:

splitValidationIndex = round(dataset.shape[0]*0.6)
splitTestIndex = round(dataset.shape[0]*0.8)
X_train = X[:splitValidationIndex]
y_train = y[:splitValidationIndex]

通过它以适应

X_val = X[splitValidationIndex:splitTestIndex]
y_val = y[splitValidationIndex:splitTestIndex]

将其传递给 eval_set

X_test = X[splitTestIndex:]
y_test = y[splitTestIndex:]

检查模型预测

产生了一个更糟糕的模型

例子:

在此处输入图像描述

我错过了什么/做错了什么?

2个回答

一切看起来都是正确的,但你必须了解一些细节。

train_test_split 将数组或矩阵拆分为随机训练和测试子集。如果您不指定 random_state,您将得到不同的结果,这意味着每次运行代码训练和测试数据集时,每次都会有不同的值。

如果您固定了诸如random_state = 42 之类的特定值,那么您在测试和训练集中的数据将保留相同的值。

因此,在第一种方式拆分中,模型正在学习特定(始终相同)的数据块,这可能会产生良好的结果,而第二种方式每次模型都在学习不同的数据块时,因此结果可能会更糟(通过顺便说一句,它看起来像块上的过度拟合(在第一种分割方式中)。

一般来说,无论你选择哪种方式,但你必须使用交叉验证来创建性能良好的模型。

要检查的三件事:

  1. train_test_split默认情况下随机拆分数据集,而您的手动拆分拆分为连续的索引块。如果您的数据没有被打乱并且索引顺序有一些意义(例如,如果它们是按时间排序的,特别是如果您的数据中存在概念漂移),那么这些可能会产生非常不同的结果。

  2. 您已设置stratify=y,因此train_test_split将拆分数据集以使每个折叠中每个类的比例大致相等。如上所述,如果您的数据集早期与晚期相比具有更高的一类浓度,这将显着影响测试。

  3. 也许您的数据和/或模型相当不稳定,因此不同的拆分只会产生相当不同的结果;在这种情况下,在新的train_test_split(不指定种子)之后重新运行所有内容也会给您带来截然不同的结果。