如何处理过拟合

数据挖掘 分类 逻辑回归 过拟合 正则化
2021-09-28 23:56:44

我正在研究两个类(0/1)的机器学习分类问题。我想建立一个预测模型。问题是我有一个shape=(89, 21)可能导致过度拟合的小数据集。问题(20 个自变量)。我注意到结果受训练数据和测试数据大小的影响很大(即拆分是如何完成的)。LR 最好的结果是0.90,最差的结果是0.74

算法

我使用此指令拆分数据:

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.37, random_state=2)

然后我对训练集进行了简化,因为它不平衡 {0}=62 {1}=27

下表包含我得到的测试集的最佳结果(测试错误)。

AccuracyROC LogisticRegression 0.9090910.928571DecisionTree 0.9393940.934524adaBoost 0.8484850.845238RandomForest 0.8787880.928571GradientBoosting 0.8484850.827381
下表包含训练错误
AccuracyROC LogisticRegression 0.9634150.963415DecisionTree 1.001.00adaBoost 1.001.00RandomForest 1.001.00GradientBoosting 1.001.00
我需要一些关于如何管理过度拟合问题的指南(想法、教程……)。谢谢

2个回答

这是一个非常普遍的问题,但是,有许多不同的解决方案,如下所述。对于您的情况,可能不是第 2 项,因为您无法收集大量数据点。我建议使用解决方案 1、3、5 和 6(我看到您使用了这种方法,但尝试将其与其他解决方案结合使用,例如交叉验证、正则化和特征选择)。

  1. 交叉验证:使用初始训练数据集生成多个迷你训练测试拆分。使用这些拆分来调整您的模型。

例如,在 k 折交叉验证中,将数据划分为 k 个子集。然后,在 k-1 折上迭代训练模型,同时使用剩余的折作为测试集。通过这种方式,您可以使用交叉验证仅使用原始训练集来调整超参数。

  1. 使用更多数据进行训练:如果可能,尝试使用更多数据点。

  2. 执行特征选择:您可以使用许多算法来执行特征选择并防止过度拟合

  3. 提前停止:当您迭代地训练学习算法时,您可以衡量模型的每次迭代的执行情况。

直到一定数量的迭代,新的迭代才能改进模型。然而,在那之后,模型的泛化能力可能会减弱,因为它开始过度拟合训练数据。

  1. 使用正则化。正如第 7 项中所讨论的那样,模型的复杂度越高,过拟合的可能性就越大。例如,在逻辑回归的情况下,当权重很大时,模型会变得复杂,并且可能无法在看不见的测试数据集上工作。正则化有助于降低权重,从而降低模型的复杂性。

  2. 使用随机森林和梯度提升等集成方法。决策树的主要问题之一是它们容易过度拟合。即,高方差,这意味着它们在训练数据上工作得很好,但在看不见的测试数据集上却不行。防止决策树过度拟合的一种解决方案是使用集成方法,例如随机森林,该方法使用对在数据的不同随机子集上训练的大量决策树进行多数投票。

  3. 简化模型:非常复杂的模型容易过拟合。降低模型的复杂度以避免过度拟合。例如,在深度神经网络中,当数据量不大时,过拟合的几率非常高。因此,降低神经网络的复杂性(例如,减少隐藏层的数量)有助于防止过度拟合。

  4. 退出方法。在深度神经网络中,通过乘以从伯努利分布中采样的噪声随机删除层之间的一些连接可以帮助防止过度拟合。

有一些通用方法可以避免过度拟合,但我想解决您的具体问题。

就像您说的那样,与特征数量相比,您的数据集没有很多示例。
这本身会增加过度拟合的风险,特别是如果您使用更复杂的模型,例如 GradientBoost 或 RandomForest(当我的样本数量仅为特征数量的 4 倍时,我不确定是否会使用) .

因此,首先要做的是尝试减少功能的数量。
任何具有正则化的模型都可以帮助您,最好是 L1 正则化而不是 L2。在 Logistic Regression 的 sklearn 实现中(请参阅文档),您只需设置penalty='l1',并尝试通过减少参数来使正则化更强C(或者您可以C通过交叉验证自动选择,我会这样做;请参阅LogisticRegressionCV

拟合这样的模型后(不要忘记缩放特征!),您可以检查哪些特征的系数最小(希望有些可能为零)并删除它们。

这一步将有助于任何模型,包括那些比逻辑回归更复杂的模型......不过,同样,一个简单的模型比一个复杂的模型具有更小的过度拟合风险,并且你的错误就是它们(如果我正确理解你的帖子) ),我认为没有动力去使用比逻辑回归更复杂的东西......直到你获得更多数据来训练更复杂的模型!