机器学习 - scikit-learn 中的“train_test_split”函数:我应该重复几次吗?

数据挖掘 机器学习 Python scikit-学习
2021-10-03 03:55:27

我是机器学习的初学者,希望有人能帮助我。

在 Python 的“scikit-learn”库中,函数“train_test_split”将数据集拆分为训练集和测试集。这是以随机方式完成的(可能使用种子在重复执行中获得相同的结果)。但是,对于单个随机拆分,我们可以在多大程度上信任通过“拟合”方法获得的结果(分类准确度)?我的意思是……如果我们“不走运”,我们可能会得到一个非常糟糕的结果(或者相反,如果我们“走运”)。我们不应该多次重复拆分/拟合过程(例如,100 次),然后平均获得的分类准确度吗?(可能在通过交叉验证进行参数调整之后)。

我问这个是因为之前我使用了 Python 的 Orange Data Mining 库,其中包括一个方法('proportion_test'),它将数据集拆分为训练集和测试集,然后根据特定的分类器对其进行评估,重复操作指定的次数次(例如,它执行 100 次 70:30 测试的迭代)。我的问题是:我是否也应该使用 scikit-learn 中的拆分/拟合功能手动执行此操作?(例如,使用 100 个不同的随机种子进行 100 次迭代)。结果会更好吗?

我对此感到非常困惑......

我想强调一下,我知道交叉验证、遗漏一个等。但是,如果我理解正确,这些技术将用于模型验证(即模型参数调整)。我的问题是模型的最终评估是否应该基于重复的拆分/拟合操作。例如,在《Introduction to Machine Learning with Python》一书中(Andreas C. Müller 和 Sarah Guido,O'Reilly),建议的操作流程是:(1)将原始数据集拆分为训练集和测试集;(2)在训练集上使用交叉验证进行参数调优(即最佳参数选择);(3) 使用刚刚找到的最佳参数与训练集重新训练;(4) 使用训练好的模型和(单个)测试集进行最终评估(计算分类精度)。我的问题是:这够了吗?或者,一旦使用最佳参数训练了分类器(上面的第 3 步),我是否应该在整个数据集(原始训练 + 测试集)上多次重复拆分/拟合过程以获得更可靠的结果?我使用 Orange 库做到了这一点,但也许没有必要(上面引用的书中没有这样做)。

非常感谢您的帮助!

1个回答

如果要平均训练结果,可以使用KFold 交叉验证。

sklearn.model_selection.KFold

这会将您的数据拆分为指定的折叠数 (k),并在除一个折叠之外的所有折叠上训练您的数据,然后在最后一折叠上进行验证。此操作执行 k 次,结果取平均值。

通常,我的做法是:

  1. 训练/测试拆分
  2. 在训练集上使用 KFold 进行模型选择 + 超参数调整
  3. 在整个训练集上重新训练最终模型
  4. 在测试集上评估

请注意,如果您想检查您的拆分是“幸运”还是“不幸”,您仍然可以更改种子,或者根本不提供种子并比较不同运行的结果。

[编辑] 正如下面的评论中所述,种子由 random_state 参数控制,主要用于重现性。如果您想在每次运行时使用不同的训练/测试拆分,只需保留默认值即可。至少检查两次以查看您是否特别幸运总是好的,但它从未发生在我身上!:)