我是统计方法的新手所以请原谅任何天真。当使用sklearn的Decision tree regression(例如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迭代计算的得分是估算器的得分方法 (两者的得分方法)回归量是R平方)。基本KFold交叉验证指南给出的解释是: 然后每次折叠使用一次作为验证,而k-1剩余折叠形成训练集。 < / p>
当我使用10个旧的cv时,我的理解是:我的数据集被分成10个相等的部分,每个部分剩余的9个部分用于训练(我不确定这是一个合适的操作还是分数操作),剩下的部分用于验证(不确定验证是做什么的)。这些回归量是一个完整的黑盒子&#34;对我来说,所以我不知道如何使用树进行回归以及交叉验证从何处获得其R平方值。
总而言之,我很难理解交叉验证如何显着降低准确度(R平方)?我是否使用了交叉验证权利来进行回归?对决策树回归程序使用交叉验证是否有意义?我应该使用其他交叉验证方法吗?
谢谢
答案 0 :(得分:1)
汇总了一个小代码片段,阐明了如何使用DecisionTreeRegressor和交叉验证。
一个。在第一个代码片段中使用'cross_val_score'。但是,r2_score可能会得分为负,从而可以深入了解模型的不良学习情况。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.20, random_state=0)
dt = DecisionTreeRegressor(random_state=0, criterion="mae")
dt_fit = dt.fit(X_train, y_train)
dt_scores = cross_val_score(dt_fit, X_train, y_train, cv = 5)
print("mean cross validation score: {}".format(np.mean(dt_scores)))
print("score without cv: {}".format(dt_fit.score(X_train, y_train)))
# on the test or hold-out set
from sklearn.metrics import r2_score
print(r2_score(y_test, dt_fit.predict(X_test)))
print(dt_fit.score(X_test, y_test))
B中。在下一节中,使用交叉验证在参数'min_samples_split'上执行GridSerach,然后使用最佳估计器对valiation / holdout集进行评分。 #使用GridSearch: 来自sklearn.model_selection导入GridSearchCV 来自sklearn.metrics导入make_scorer 来自sklearn.metrics import mean_absolute_error 来自sklearn.metrics import r2_score
scoring = make_scorer(r2_score)
g_cv = GridSearchCV(DecisionTreeRegressor(random_state=0),
param_grid={'min_samples_split': range(2, 10)},
scoring=scoring, cv=5, refit=True)
g_cv.fit(X_train, y_train)
g_cv.best_params_
result = g_cv.cv_results_
# print(result)
r2_score(y_test, g_cv.best_estimator_.predict(X_test))
希望,这很有用。
https://www.programcreek.com/python/example/75177/sklearn.cross_validation.cross_val_score
答案 1 :(得分:0)
决策树会分割您的要素值,以生成纯度最高的组。当我说纯度时,我的意思是该组中的所有成员都分享所有相似或几乎所有相似的东西(例如所有白人,35岁,所有男性等)。它将继续执行此操作,直到所有叶节点完全纯净,或满足某些停止机制(例如,分割所需的节点中的最小样本数)。您在sklearn documentation中看到的参数基本上就是那些停止参数。现在,就回归而言,树将做的是将每个叶子的所有真y
的平均值(不再有分裂的节点)作为该特定路径的估计y-hat
,因此,当您预测测试数据集时,该测试数据集中的每条记录将基本沿着树的一些路径直到它到达叶节点,并且该记录的估计y-hat
将是平均值{{1该叶节点中所有观察结果。
随机森林基本上是决策树的集合,它使用您的训练数据的子集来进行训练。这些树通常不像单个决策树模型那么深,这有助于缓解单个决策树的过度拟合症状。 RF的想法是你正在使用许多能够很好地推广数据的弱学习者。因此,过度适应。
R平方指标基本上是y
。打破这个公式,你基本上看的是残差平方和总和的平方和。因此,您只需知道真实的1 - (SS_res / SS_tot)
值,估算的y
值以及真实y-hat
值的平均值y
。