首页 文章

在sklearn中使用决策树回归和交叉验证

提问于
浏览
2

我是统计方法的新手所以请原谅任何天真 . 当使用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平方值: By default, the score computed at each CV iteration is the score method of the estimator (两个回归量的得分方法是R平方) . 基本KFold交叉验证指南给出的解释是: Each fold is then used once as a validation while the k - 1 remaining folds form the training set.

当我使用10个旧的cv时,我的理解是:我的数据集被分成10个相等的部分,每个部分剩余的9个部分用于训练(我不确定这是一个合适的操作还是得分操作)和剩下的部分用于验证(不确定验证是做什么的) . 这些回归量对我来说是一个完整的“黑盒子”,所以我不知道如何使用树进行回归以及交叉验证从哪里获得R平方值 .

总而言之,我很难理解交叉验证如何显着降低准确度(R平方)?我是否使用了交叉验证权利来进行回归?对决策树回归程序使用交叉验证是否有意义?我应该使用其他交叉验证方法吗?

谢谢

2 回答

  • 0

    汇总了一个小代码片段,阐述了如何使用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))
    

    B.在下一节中,使用交叉验证对参数'min_samples_split'执行GridSerach,然后使用最佳估计器对valiation / holdout集进行评分 . #使用GridSearch:从sklearn.model_selection导入来自sklearn.metrics的GridSearchCV从sklearn.metrics导入make_scorer导入来自sklearn.metrics的mean_absolute_error导入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

    决策树会根据您的要素值进行分割,从而生成纯度最高的组 . 当我说纯度时,我的意思是该组中的所有成员都分享所有相似或几乎所有相似的东西(例如所有白人,35岁,所有男性等) . 它将继续执行此操作,直到所有叶节点完全纯净,或满足某些停止机制(例如,分割所需的节点中的最小样本数) . 您将在sklearn documentation中看到的参数基本上就是那些停止参数 . 现在,就回归而言,树将做的是将每个叶子的所有真实 y (不再有分裂的节点)的平均值作为该特定路径的估计 y-hat ,以便在预测测试时数据集中,来自该测试数据集的每条记录将基本沿着树的一些路径直到它到达叶节点,并且该记录的估计 y-hat 将是该叶节点中所有观测值的平均值 y .

    随机森林基本上是决策树的集合,它使用您的训练数据的子集来进行训练 . 这些树通常不像单个决策树模型那么深,这有助于缓解单个决策树的过度拟合症状 . RF的想法是你正在使用许多能够很好地推广数据的弱学习者 . 因此,减少过度 .

    R平方指标基本上是 1 - (SS_res / SS_tot) . 打破这个公式,你基本上看的是残差平方和总和的平方和 . 因此,您只需知道真正的 y 值,估计的 y-hat 值以及真实 y 值的平均值 y-bar .

相关问题