Jas*_*ler 5 python regression scikit-learn
我是统计方法的新手,所以请原谅任何天真。使用 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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
此交叉验证的结果始终返回负值。根据 sklearn 指南,我假设它们是 R 平方值:默认情况下,每次 CV 迭代计算的分数是估计器的分数方法 (两个回归器的分数方法都是 R 平方)。基本 KFold 交叉验证指南给出的解释是:然后将每个折叠用作验证一次,而剩余的 k - 1 个折叠形成训练集。
当使用 10 个旧的 cv 时,我的理解是:我的数据集被分成 10 个相等的部分,对于每个部分,其余 9 个部分用于训练(我不确定这是拟合操作还是评分操作)并且剩余部分用于验证(不确定验证做什么)。这些回归量对我来说是一个完整的“黑匣子”,所以我不知道如何使用树进行回归以及交叉验证从哪里获取其 R 平方值。
总而言之,我很难理解交叉验证如何如此显着地降低准确性(R 平方)?我是否使用了回归量的交叉验证?对决策树回归器使用交叉验证是否有意义?我应该使用另一种交叉验证方法吗?
谢谢
整理了一个小代码片段,阐明了如何使用 DecisionTreeRegressor 和交叉验证。
A. 在第一个代码片段中使用了“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))
Run Code Online (Sandbox Code Playgroud)
B. 在下一节中,使用交叉验证对参数“min_samples_split”执行 GridSerach,然后使用最佳估计器对验证/保留集进行评分。# 使用GridSearch: from sklearn.model_selection import GridSearchCV from sklearn.metrics import make_scorer from sklearn.metrics importmean_absolute_error from 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))
Run Code Online (Sandbox Code Playgroud)
希望这有用。
https://www.programcreek.com/python/example/75177/sklearn.cross_validation.cross_val_score
| 归档时间: |
|
| 查看次数: |
20549 次 |
| 最近记录: |