我将特征分成X
和y
,然后在使用K折交叉验证分割数据后,对训练和测试数据进行预处理。之后,我将训练数据拟合到我的随机森林回归模型中,并计算置信分数。为什么我在分割后进行预处理?因为人们告诉我这样做更正确,为了模型性能的考虑,我一直遵循这一原则。
这是我第一次使用K折交叉验证,因为我的模型分数过拟合,我以为可以通过交叉验证来解决这个问题。我仍然对如何使用它感到困惑,我已经阅读了文档和一些文章,但我并没有真正理解如何将其应用到我的模型中,但我还是尝试了,我的模型仍然过拟合。无论是使用训练测试分割还是交叉验证,我的模型分数仍然是0.999,我不知道我的错误在哪里,因为我对这种方法非常陌生,但我认为可能是我的操作有误,所以它无法解决过拟合问题。请告诉我我的代码有什么问题以及如何修复这个问题
回答:
你过拟合的原因是未经正则化的基于树的模型会调整数据直到所有训练样本都被正确分类。例如,请看这张图片:
如你所见,这样的模型泛化效果不佳。如果你不指定正则化树的参数,模型将无法很好地拟合测试数据,因为它基本上只会学习训练数据中的噪声。在sklearn
中,有许多正则化树的方法,你可以在这里找到它们:这里。例如:
- max_features
- min_samples_leaf
- max_depth
通过适当的正则化,你可以得到一个对测试数据泛化效果良好的模型。例如,看看这个正则化后的模型:
要正则化你的模型,像这样实例化RandomForestRegressor()
模块:
rfr = RandomForestRegressor(max_features=0.5, min_samples_leaf=4, max_depth=6)
这些参数值是任意的,具体选择哪些值适合你的数据取决于你。你可以使用领域特定知识来选择这些值,或者使用超参数调优搜索如GridSearchCV
或RandomizedSearchCV
。
此外,填补均值和中位数可能会给你的数据带来很多噪声。除非没有其他选择,我建议不要这样做。