火车测试拆分的缺点

时间:2019-02-27 11:41:52

标签: machine-learning statistics data-science cross-validation

“培训/测试拆分确实有其危险……-如果我们进行的拆分不是随机的,该怎么办?如果我们的数据子集中只有来自某个州的人员,具有一定收入水平的员工却没有其他收入水平,该怎么办,是只有女性还是只有某个年龄的人?(想象一个文件由其中一个命令排序)。即使我们正试图避免这种情况,也会导致过拟合!这就是交叉验证的作用。”以上是提到的大多数博客,我不理解。我认为缺点不是过度拟合而是不足。当我们分割数据时,假设状态A和B成为训练数据集,并尝试预测状态C,该状态与将导致拟合不足的训练数据完全不同。有人可以解释我为什么大多数博客都指出“测试分裂”会导致过拟合。

3 个答案:

答案 0 :(得分:2)

谈论您的问题所描述的selection bias会更正确。

选择偏差并不能真正地与过度拟合相关,而只能与偏差集合拟合,因此模型将无法正确地概括/预测。

换句话说,无论是“拟合”还是“过度拟合”都适用于有偏见的火车,这仍然是错误的。

“ over”前缀上的语义压力就是这样。这意味着偏见。

想象一下,您没有选择偏见。在这种情况下,即使您过度拟合一个健康的集合,根据过度拟合的定义,您仍然会使模型偏向您的火车集合。

在这里,您的开始训练集已经有偏差。因此,即使是“正确的拟合”,任何拟合都会有偏差,就像在过度拟合中一样。

答案 1 :(得分:1)

实际上,训练/测试拆分确实具有一定的随机性。参见下面的sci-kit学习train_test_split

from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(data, test_size=0.2, random_state=42)

在这里,为了具有一些初步的直觉,您可以将random_state值更改为某个随机整数,并多次训练模型,以查看每次运行是否可以获得可比较的测试精度。如果数据集很小(约100 s),则测试精度可能会显着不同。但是,当您拥有更大的数据集(约10000s)时,测试准确性或多或少会变得相似,因为训练集将至少包括所有样本中的一些示例。

当然,执行交叉验证是为了最大程度地减少过度拟合的影响并使结果更通用。但是,如果数据集太大,交叉验证的确会非常昂贵。

答案 2 :(得分:0)

如果仅对数据集执行一次,则“ train_test_split”函数不一定会带有偏见。我的意思是,通过为函数的“ random_state”功能选择一个值,可以组成不同的训练和测试数据集组。 假设您有一个数据集,并且在应用train_test_split并训练了模型之后,对测试数据的准确性得分就很低。 如果更改random_state值并重新训练模型,则数据集的准确性得分将有所不同。 因此,您可能会很想为random_state功能找到最佳值,从而以最准确的方式训练模型。好吧,你猜怎么着?,您刚刚对模型引入了偏见。因此,您已经找到了一个训练集,该训练集可以以在测试集上最有效的方式训练模型。 但是,当我们使用诸如KFold交叉验证之类的方法时,我们会将数据集分为五组或十组(取决于大小)训练和测试数据集。每次我们训练模型时,我们都会看到不同的分数。当对整个数据集进行训练时,所有分数的平均值对于模型而言可能会更现实。看起来像这样:

from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression 
kfold = KFold(5, True, 1)
R_2 = []
  for train_index, test_index in kfold.split(X):

     X_train, X_test = X.loc[train_index], X.loc[test_index]
     y_train, y_test = y.loc[train_index], y.loc[test_index]
     Model = LinearRegression().fit(X_train, y_train)

     r2 = metrics.r2_score(y_test, Model.predict(X_test))
     R_2.append(r2)

  R_2mean = np.mean(R_2)