机器学习

【实践篇】决策树参数选择和 GridSearchCV

2022-01-14  本文已影响0人  山药鱼儿

注:本节,小鱼将继续使用连载上一篇文章 【实践篇】决策树的可视化展示 使用的加利福尼亚房屋价值预测的数据集,关于数据集的介绍这里不再赘述。

Sklearn 为我们提供了 DecisionTreeRegressor 来构建决策树回归模型:

from sklearn.model_selection import train_test_split

data_train, data_test, target_train, target_test = train_test_split(
    housing.data,
    housing.target,
    test_size=0.2,
    random_state=0
)

dtr = DecisionTreeRegressor(random_state=0)
dtr.fit(data_train,target_train)
dtr.score(data_test,target_test)

使用决策树默认的参数,在测试集得到评分为:

0.5924304824636766

模型的评分还是很低的,不足 0.6 。接下来,我们使用 Sklearn 提供的随机森林回归模型 RandomForestRegressor ,同样使用默认的参数训练和评估模型:

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(random_state=0)
rfr.fit(data_train,target_train)
rfr.score(data_test,target_test)

RandomForestRegressor:我们可以暂时理解为很多棵决策树,一棵决策树不行,那我多一些树,结果就会越可靠。

随机森林在测试集得到的评分:

0.7979950876327253

这就是随机森林的威力,在没进行任何调参的情况下,评分就提高了 20 个百分点。RandomForestRegressor 默认为我们训练了 100 棵决策树。

详见:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html#sklearn.ensemble.RandomForestRegressor

接下来,小鱼将使用 RandomForestRegressor 模型介绍决策树回归模型的参数以及如何调参的问题。

决策树参数

现在,决策树有哪些参数,我们已经清楚了,那这么多参数,如何选出最优的参数值组合呢?

小鱼在介绍逻辑回归模型的时候,为了找到最优的正则化惩罚力度参数,使用了 model_selection 模块中的 KFold 进行了 5 折的交叉验证,将交叉验证的结果作为当前正则化惩罚力度的模型评估结果。

那现在,我们有这么多特征,将各个特征的候选参数值进行组合,将会组合出非常多的参数~不过,这些过程并不需要我们手动完成,GridSearchCV 帮我们轻松搞定~

GridSearchCV

时间关系,小鱼这里只选择了 min_samples_splitn_estimators 两个参数,来展示 GridSearchCV 的用法:

from sklearn.model_selection import GridSearchCV

tree_param_grid = {
    "min_samples_split": [3,6,9],
    "n_estimators": [10,50,100]
}

grid = GridSearchCV(
    RandomForestRegressor(),
    param_grid=tree_param_grid,
    cv=5
)

grid.fit(data_train, target_train)

GridSearchCV 的参数非常简单,传入构建的模型;param_grid 为模型的参数和参数取值组成的字典;cv=5 表示做 5 折的交叉验证。

训练结果:

GridSearchCV(cv=5, estimator=RandomForestRegressor(),
             param_grid={'min_samples_split': [3, 6, 9],
                         'n_estimators': [10, 50, 100]})

由于 min_samples_splitn_estimators 都有 3 个待选值,因此组合之后共有 9 组值,这 9 组值构建的随机森林模型,将分别进行 5 折的交叉验证。

获取结果最好的一组值:

>> grid.best_params_
{'min_samples_split': 6, 'n_estimators': 100}

最好的这组值,验证集得分是多少呢?

>> grid.best_score_
0.8004570387240992

使用最佳参数建模,并以测试集进行模型评估:

>> rfr = RandomForestRegressor(min_samples_split=6, n_estimators=100, random_state=0)
>> rfr.fit(data_train, target_train)
>> rfr.score(data_test, target_test)
0.7977553401920536

还可以打印决策树构造时,评估出的特征重要性(重要的特征,切分能力越强):

>> pd.Series(rfr.feature_importances_, index=housing.feature_names).sort_values(ascending=False)
MedInc        0.539850
AveOccup      0.135402
Latitude      0.083998
Longitude     0.082741
HouseAge      0.054384
AveRooms      0.045247
Population    0.030297
AveBedrms     0.028082
dtype: float64
上一篇 下一篇

猜你喜欢

热点阅读