Machine learning 列车试验拆分的弊端

Machine learning 列车试验拆分的弊端,machine-learning,statistics,data-science,cross-validation,Machine Learning,Statistics,Data Science,Cross Validation,“列车/测试分离确实有其危险 — 如果我们所做的划分不是随机的呢?如果我们的数据的一个子集只有来自某个州的人,有某个收入水平但没有其他收入水平的员工,只有女性或只有某个年龄的人呢?(想象一个由其中一个排序的文件)。这将导致过度拟合,即使我们试图避免它!这就是交叉验证的原因。”上面提到的大多数博客我都不理解。我认为缺点不在于过于合身,而在于不合身。当我们分割数据时,假设状态A和B成为训练数据集,并尝试预测状态C,它与训练数据完全不同,这将导致拟合不足。有人能告诉我为什么大多数博客都说“测试拆分”会

“列车/测试分离确实有其危险 — 如果我们所做的划分不是随机的呢?如果我们的数据的一个子集只有来自某个州的人,有某个收入水平但没有其他收入水平的员工,只有女性或只有某个年龄的人呢?(想象一个由其中一个排序的文件)。这将导致过度拟合,即使我们试图避免它!这就是交叉验证的原因。”上面提到的大多数博客我都不理解。我认为缺点不在于过于合身,而在于不合身。当我们分割数据时,假设状态A和B成为训练数据集,并尝试预测状态C,它与训练数据完全不同,这将导致拟合不足。有人能告诉我为什么大多数博客都说“测试拆分”会导致过度拟合。

你的问题描述了这一点

选择偏差不能真正与过度拟合联系在一起,而是与拟合有偏差的集合联系在一起,因此该模型将无法正确概括/预测

换句话说,无论“装配”或“过度装配”适用于偏置列车组,这仍然是错误的

“over”前缀的语义紧张就是这样。这意味着偏见


假设你没有选择偏见。在这种情况下,即使是一个健康的集,如果过度拟合,根据过度拟合的定义,仍然会使模型偏向于火车集


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

事实上,训练/测试分割确实有一些随机性。请参见下面的sci套件学习
train\u test\u split

from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(data, test_size=0.2, random_state=42)
在这里,为了获得一些初始直觉,您可以将随机_状态值更改为某个随机整数,并多次训练模型,以查看是否可以在每次运行中获得可比的测试精度。如果数据集很小(约为100秒),则测试精度可能会显著不同。但是,当您有一个更大的数据集(以10000s为顺序)时,测试精度会变得或多或少类似,因为序列集至少会包含来自所有样本的一些示例

当然,交叉验证是为了最小化过度拟合的影响,并使结果更加通用。但是对于太大的数据集,进行交叉验证的成本非常高。

如果只对数据集执行一次“训练测试分割”功能,则不一定会有偏差。我的意思是,通过为函数的“random_state”特性选择一个值,您可以创建不同的训练和测试数据集组。 假设您有一个数据集,在应用train_test_分割并训练您的模型后,您的测试数据的准确度得分较低。 如果您更改随机_状态值并重新训练模型,您将在数据集上获得不同的精度分数。 因此,您基本上可以尝试为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)

在您的示例中,模型将过度拟合到状态A和B,因此无法预测状态C。当培训数据未提供代表性样本时,您可以推断出有关总体的错误假设。是的,完全正确。因此,当大多数博客提到并过多关注过度拟合作为“列车测试”分裂的缺点时,他们只是主要指出模型将过度拟合状态A和B?假设你没有选择偏差。在这种情况下,即使是一个健康的列车组,您也会使模型偏向于您的列车组。在这里,你有一个开始有偏见的训练集,因此,即使是适度的拟合也会模仿过度拟合的结果。(补充到我的回答中)当你的训练集有偏差时,你会建立一个模型,该模型很好地拟合训练集,但不能推广到人群中,因此过度拟合。问题是,您对数据的推断太多,而不是在拟合不足的情况下所暗示的太少。