过度拟合总是一件坏事吗?
Is overfitting always a bad thing?
我目前正在参加几个机器学习竞赛,因为我正在尝试学习这个领域。
对于回归问题,我使用 xgboost
。
这是我使用的程序:
在特征工程之后,我像往常一样将我的数据分成 2 组,一组训练集和一组测试集。然后我将 xgboost
拟合到训练集上并在测试集上进行验证。这是我得到的结果:(我还显示了 public 集结果,当我使用经过训练的算法来预测提交目标时,指标是 mae)。
Iteration training score testing score public score
100 8.05 12.14 17.50
150 7.10 11.96 17.30
备注:
所有数据集(train/test/public组)大小大致相同,大约200 000个样本。
这是一个时间序列,所以我在拆分时没有打乱数据,即使打乱它不会改变结果..
我也尝试在暂时接近 public 数据集的样本上训练我的 xgboost,但结果并不好。
当我在提交之前对所有数据(训练+测试)进行训练时,我的 public 分数提高了 0.35。
这是我的问题:
我们真的可以仅通过查看训练和测试分数之间的差异来估计过拟合吗?还是只是过拟合的指标?
为什么我的提交分数通过增加迭代次数提高了,即使它表明我越来越过拟合?
为什么提交分数的提高比测试分数的提高还要好?
为什么测试分数和提交分数不接近?为什么无论超参数或 "over-fitting rate".
,我的测试和提交分数之间存在系统性的巨大差异
这个说法是否正确:如果学到的有用信息与无用信息(训练集特定信息)的比率大于 1,那么您可以继续过度拟合并仍然改进模型?
我希望它不会太混乱,很抱歉我可能没有正确的词汇。
不得不提的是,即使有过拟合和测试与 public 分数的巨大差异,我目前仍然是 50 人参与的排行榜第二名。
首先要明白over-fitting是什么
当训练分数增加(或错误减少)而你的测试集分数减少(或错误增加)时,你可以看到过拟合
过拟合是指您的训练模型过于精确,无法概括您尝试解决的问题。换句话说,它对于训练来说太适合了,而且单独训练,所以它不能 solve/predict 不同的数据集。
在你的例子中,火车和测试的错误似乎都在减少,这意味着你没有过拟合。
过度拟合总是不好的事情。
关于你现在的问题。如果你想 运行 多重交叉验证,或手动拆分你的数据用于许多训练和许多测试集,你可以执行以下操作:
- 将训练和测试数据拆分为(50%、50%)或(70%、30%),您认为适合您的方式
- 然后,从你的训练数据中随机抽取X%作为训练集。
- 测试数据随机抽取Y%作为测试集
- 我建议 X = Y = 75%。上面的分割是 70% 的训练和 30% 的测试。
关于您的问题:
- 它只是过拟合的一个指标。
- 你的例子并没有过度拟合
- 不同数据集的分数会有所不同
- 与 3 相同的答案
添加图片描述过拟合:
在复杂度中有一个点 (10),继续训练会减少训练误差,但会增加测试误差。
一些可能对您有帮助的想法...
Kaggle 比赛的最终结果是私人排行榜,您的模型将在您尚未见过的数据上进行测试。优化您的模型以在 public 排行榜(提交数据集)上进行良好预测然后下降 10 个位置是没有用的,因为您过度拟合并且没有 cross-validate,所以您的模型没有很好地泛化。你必须做一些 cross-validation,我建议你相信结果。
请注意,按百分比计算,您的 MAE 下降了 11.8%、1.5% 和 1.1%,因此您的提交分数提高最少。
有时你必须小心处理时间序列数据——数据的哪一部分与 public/private 排行榜数据最相似?例如,如果你有一年的数据,你在 Jan-Jun 16 上训练,在 Jul-Dec 16 上测试,然后在 Jan-Jun 17 上验证(提交),那么你可能会期望更好您提交的结果比您测试数据集。在这种情况下,您可能会完全丢弃 Jul-Dec 16 条数据,而 train/test 仅丢弃 Jan-Jun 16.
如果你排在第二位,你显然做对了,但请记住cross-validate。过去有比赛,人们因为他们的模型没有很好地泛化而掉了几百个名次!
查看这张试图拟合数据点的图片:
您的函数将完美拟合给定数据点,导致 Xi 平方小于 1。
进一步查看:https://en.wikipedia.org/wiki/Reduced_chi-squared_statistic
本质上:
- 你的模型不会泛化
- 在测试集上表现良好
P.S 检查 kaggle 排行榜,post 获胜。他们评估不同的数据子集。大多数领先的算法在 'not seen before' 数据上表现不佳。
我目前正在参加几个机器学习竞赛,因为我正在尝试学习这个领域。
对于回归问题,我使用 xgboost
。
这是我使用的程序:
在特征工程之后,我像往常一样将我的数据分成 2 组,一组训练集和一组测试集。然后我将 xgboost
拟合到训练集上并在测试集上进行验证。这是我得到的结果:(我还显示了 public 集结果,当我使用经过训练的算法来预测提交目标时,指标是 mae)。
Iteration training score testing score public score
100 8.05 12.14 17.50
150 7.10 11.96 17.30
备注:
所有数据集(train/test/public组)大小大致相同,大约200 000个样本。
这是一个时间序列,所以我在拆分时没有打乱数据,即使打乱它不会改变结果..
我也尝试在暂时接近 public 数据集的样本上训练我的 xgboost,但结果并不好。
当我在提交之前对所有数据(训练+测试)进行训练时,我的 public 分数提高了 0.35。
这是我的问题:
我们真的可以仅通过查看训练和测试分数之间的差异来估计过拟合吗?还是只是过拟合的指标?
为什么我的提交分数通过增加迭代次数提高了,即使它表明我越来越过拟合?
为什么提交分数的提高比测试分数的提高还要好?
为什么测试分数和提交分数不接近?为什么无论超参数或 "over-fitting rate".
,我的测试和提交分数之间存在系统性的巨大差异
这个说法是否正确:如果学到的有用信息与无用信息(训练集特定信息)的比率大于 1,那么您可以继续过度拟合并仍然改进模型?
我希望它不会太混乱,很抱歉我可能没有正确的词汇。 不得不提的是,即使有过拟合和测试与 public 分数的巨大差异,我目前仍然是 50 人参与的排行榜第二名。
首先要明白over-fitting是什么
当训练分数增加(或错误减少)而你的测试集分数减少(或错误增加)时,你可以看到过拟合
过拟合是指您的训练模型过于精确,无法概括您尝试解决的问题。换句话说,它对于训练来说太适合了,而且单独训练,所以它不能 solve/predict 不同的数据集。
在你的例子中,火车和测试的错误似乎都在减少,这意味着你没有过拟合。
过度拟合总是不好的事情。
关于你现在的问题。如果你想 运行 多重交叉验证,或手动拆分你的数据用于许多训练和许多测试集,你可以执行以下操作:
- 将训练和测试数据拆分为(50%、50%)或(70%、30%),您认为适合您的方式
- 然后,从你的训练数据中随机抽取X%作为训练集。
- 测试数据随机抽取Y%作为测试集
- 我建议 X = Y = 75%。上面的分割是 70% 的训练和 30% 的测试。
关于您的问题:
- 它只是过拟合的一个指标。
- 你的例子并没有过度拟合
- 不同数据集的分数会有所不同
- 与 3 相同的答案
添加图片描述过拟合:
在复杂度中有一个点 (10),继续训练会减少训练误差,但会增加测试误差。
一些可能对您有帮助的想法...
Kaggle 比赛的最终结果是私人排行榜,您的模型将在您尚未见过的数据上进行测试。优化您的模型以在 public 排行榜(提交数据集)上进行良好预测然后下降 10 个位置是没有用的,因为您过度拟合并且没有 cross-validate,所以您的模型没有很好地泛化。你必须做一些 cross-validation,我建议你相信结果。
请注意,按百分比计算,您的 MAE 下降了 11.8%、1.5% 和 1.1%,因此您的提交分数提高最少。
有时你必须小心处理时间序列数据——数据的哪一部分与 public/private 排行榜数据最相似?例如,如果你有一年的数据,你在 Jan-Jun 16 上训练,在 Jul-Dec 16 上测试,然后在 Jan-Jun 17 上验证(提交),那么你可能会期望更好您提交的结果比您测试数据集。在这种情况下,您可能会完全丢弃 Jul-Dec 16 条数据,而 train/test 仅丢弃 Jan-Jun 16.
如果你排在第二位,你显然做对了,但请记住cross-validate。过去有比赛,人们因为他们的模型没有很好地泛化而掉了几百个名次!
查看这张试图拟合数据点的图片:
您的函数将完美拟合给定数据点,导致 Xi 平方小于 1。
进一步查看:https://en.wikipedia.org/wiki/Reduced_chi-squared_statistic
本质上:
- 你的模型不会泛化
- 在测试集上表现良好
P.S 检查 kaggle 排行榜,post 获胜。他们评估不同的数据子集。大多数领先的算法在 'not seen before' 数据上表现不佳。