【发布时间】:2017-11-24 17:22:54
【问题描述】:
我是统计方法的新手,所以请原谅任何天真。在使用来自 sklearn 的决策树回归(例如 DecisionTreeRegressor 和 RandomForestRegressor)时,我无法理解交叉验证的执行。我的数据集从具有多个预测变量(y = 单个因变量;X = 多个自变量)到具有单个预测变量并且包含足够多的案例(> 10k)。以下解释适用于所有情况。
使用标准方法对回归变量进行拟合和评分时:
dt = DecisionTreeRegressor()
rf = RandomForestRegressor()
dt.fit(X,y)
rf.fit(X,y)
dt_score = dt.score(X,y)
rf_score = rf.score(X,y)
dt_score 和 rf_score 返回有希望的 R 平方值 (> 0.7),但是我知道 DT 的过拟合属性以及较小程度的 RF。因此,我尝试通过交叉验证(10 倍)对回归变量进行评分,以获得更真实的准确性表示:
dt = DecisionTreeRegressor()
rf = RandomForestRegressor()
dt.fit(X,y)
rf.fit(X,y)
dt_scores = cross_val_score(dt, X, y, cv = 10)
rf_scores = cross_val_score(rf, X, y, cv = 10)
dt_score = round(sum(dt_scores )/len(dt_scores ), 3)
rf_score = round(sum(rf_scores )/len(rf_scores ), 3)
这种交叉验证的结果总是返回负值。我假设它们是根据 sklearn 指导原则的 R 平方值:默认情况下,每次 CV 迭代计算的分数是估计器的 score 方法(两者的 score 方法回归量是 R 的平方)。基本 KFold 交叉验证指南给出的解释是:每个折叠都被用作一次验证,而剩余的 k - 1 个折叠形成训练集。
当使用 10 个旧 cv 时,我对此的理解是:我的数据集被分成 10 个相等的部分,对于每个部分,其余 9 个部分用于训练(我不确定这是拟合操作还是得分操作),其余部分用于验证(不确定为验证做了什么)。这些回归器对我来说是一个完整的“黑匣子”,所以我不知道如何将树用于回归以及交叉验证从何处获取其 R 平方值。
总而言之,我很难理解交叉验证如何显着降低准确性(R 平方)?我是否对回归器使用交叉验证权?对决策树回归器使用交叉验证是否有意义?我应该使用其他交叉验证方法吗?
谢谢
【问题讨论】:
-
交叉验证是一种计算通用度量的技术,在本例中为 R^2。当您在某些数据上训练(即拟合)您的模型,然后在相同的训练数据上计算您的指标(即验证)时,您收到的指标可能存在偏差,因为您的模型对训练过度拟合数据。换句话说,交叉验证旨在估计您的模型在可见数据上的表现。所以,这告诉你,如果你做得正确,你的模型在看不见的数据上表现不佳,可能是由于过度拟合。
-
正如您所说,DT 是臭名昭著的过度拟合者。您可以尝试调整 sklearn 中决策树回归器可用的各种参数。一个好的起点通常是最大深度。
-
总而言之,“交叉验证如何显着降低准确性(R 平方)”的答案?是“因为你的模型在看不见的数据上表现很差”。
-
感谢您的意见@juanpa.arrivillaga。您的评论“如果您做得正确”,您是指我如何在 python 中调用 sklearn 方法吗?所以你同意完全可以想象决策树和随机森林回归器过度预测如此严重以至于在应用交叉验证时它会将 R 平方从 0.8 降至
标签: python scikit-learn regression