如何规划避免过拟合的模型分析?

数据挖掘 机器学习 项目计划
2021-10-11 16:39:21

来自统计学,我正在尝试学习机器学习。我已经阅读了很多关于 ML 的教程,但没有接受过真正的培训。

我正在做一个小项目,我的数据集有 6k 行和大约 300 个特征。

正如我在教程中所读到的,我将数据集分成训练样本 (80%) 和测试样本 (20%),然后使用交叉验证 (5 折) 在训练样本上训练我的算法。

当我重新运行我的程序两次时(我只测试了我现在知道不太合适的 KNN),我得到了非常不同的结果,具有不同的灵敏度、特异性和精度。

我猜如果我重新运行程序直到指标良好,我的算法会过度拟合,我也猜这可能是因为测试/训练样本的重新采样,但如果我错了,请纠正我。

如果我要尝试很多算法来看看我能得到什么,我应该在某个地方修复我的样本吗?尝试几种算法甚至可以吗?(它并不总是在统计中)

万一这很重要,我正在使用 python 的 scikit-learn 模块。

*PS:我的结果是二元的,我的特征主要是二元的,很少有分类和数字。我正在考虑逻辑,但哪种算法是最好的?

1个回答

我想如果我重新运行程序直到指标良好,我的算法将过度拟合

重新运行算法不会导致过度拟合。重新运行并选择最佳模型没有问题。但是,当我们尝试比较两种算法时,我们必须对足够多的重新运行次数进行平均。然而,在实践中,我们想要最好的模型而不是最好的算法

我也猜这可能是因为测试/训练样本的重新采样,但如果我错了,请纠正我。

对训练集重新采样只会产生所谓的模型方差,这表示不同的训练样本会产生不同的模型。

当我重新运行我的程序两次时(我只测试了我现在知道不合适的 KNN),我得到了非常不同的结果

你的观察很自然。降低 KNN 方差的一般方法是增加参数ķ, 更高ķ表示 KNN 查看查询点周围的更多点(请参阅这些图)。

如果我要尝试很多算法来看看我能得到什么,我应该在某个地方修复我的样本吗?

随机抽样是可以的。

在 python 中,sklearn.model_selection.cross_validate将为给定算法构建和验证 K 个模型并返回 K 个结果;假设我们将 80% 的数据提供给 K-fold CV,它将 80% 分成 80(K-1)/K% 训练集和 80/K% 验证集 K 次。

综上所述,首先将数据拆分 20%-80%,对每种算法的 80% 的数据进行交叉验证(算法会是 1-NN、2-NN、SVM 等),然后选择具有最佳 [验证]准确度(设置return_estimator = True为从K-fold CV中获得每个算法的K个模型,因此我们在3K个模型中选择3个算法),最后在保留的20%上测试最佳模型以获得测试准确度;交叉验证在这里没有任何意义,因为已经建立了最好的模型。最终的结果是测试的准确性。

另外,看看这个关于 train, validation, test sets 的答案

尝试几种算法甚至可以吗?(它并不总是在统计中)

是的。总是尝试各种算法。

关于参数查找的旁注

我们可以将上述过程应用于(1-NN,2-NN,3-NN),如果获胜者模型总是从 3-NN 算法中选择,那么我们可以将我们的实验限制为仅(3-NN,SVM)而不是全部四个。否则,如果获胜者不是始终来自 3-NN,我们可以对所有四个进行试验。