决策树回归与交叉验证在sklearn中的应用

2024-05-19 07:06:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我是统计方法的新手,请原谅我的幼稚。在使用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迭代中计算的分数是估计器的分数方法(两个回归器的分数方法都是R平方)。基本KFold交叉验证指南给出的解释是:然后将每个折叠作为验证使用一次,而剩余的k-1折叠构成训练集。

在使用10个旧的cv时,我的理解是:我的数据集被分成10个相等的部分,对于每个部分,剩余的9个部分用于培训(我不确定这是适合操作还是得分操作),剩余的部分用于验证(不确定为验证做了什么)。这些回归函数对我来说是一个完整的“黑盒”,所以我不知道树是如何用于回归的,交叉验证从何处获得其R平方值。

总之,我很难理解交叉验证是如何显著降低准确性(R平方)的?我用交叉验证法做回归分析对吗?对决策树回归器使用交叉验证有意义吗?我应该使用另一种交叉验证方法吗?

谢谢你


Tags: 数据方法决策树dt情况sklearn交叉分数
2条回答

决策树根据您的功能的值进行拆分,生成一个具有最高纯度的组。当我说纯洁的时候,我的意思是在某种意义上,这个群体中的所有成员都分享所有或几乎所有相似的东西(例如,全白人、35岁、全男性等等)。它将一直这样做,直到您的所有叶节点都是完全纯的,或者满足某些停止机制(例如,一个节点中需要拆分的最小样本数)。您将在sklearn documentation中看到的参数基本上是那些停止参数。现在,就回归而言,树要做的是取每个叶(不再有分裂的节点)的所有真值的平均值作为该特定路径的估计值,以便在预测测试数据集时,该测试数据集中的每个记录基本上都会沿着树的某个路径一直到它到达一个叶节点,而该记录的估计值y-hat将是该叶节点中所有观测值的平均真值y

随机林基本上是决策树的集合,它使用训练数据的子集来进行训练。这些树通常没有单个决策树模型那么深,这有助于缓解单个决策树的过度拟合症状。RF的概念是,你正在使用许多弱学习者,他们可以很好地概括你的数据。因此,不太过分。

R平方度量基本上是1 - (SS_res / SS_tot)。把这个公式分解,基本上就是求残差平方和和和总和平方。因此,您只需知道真正的y值、估计的y-hat值和真正y值的平均值,y-bar

整理了一个小代码片段,阐述了如何使用DecisionTreeRegressor和交叉验证。

A.在第一段代码中,使用了“cross-val_score”。但是,r2úu分数可能为负,这让我们了解到模型的学习效果不佳。

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”执行网格搜索,然后使用最佳估计量对有效/保持集进行评分。 #使用GridSearch: 从sklearn.model_selection导入GridSearchCV 从sklearn.metrics导入make-scorer 来自sklearn.metrics import mean_absolute_error 从sklearn.metrics导入r2_分数

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

相关问题 更多 >

    热门问题