前面的文章讨论的都是用决策树解决分类问题:模型参数训练结束后,对每个“叶子”节点的样本数据进行投票,规定数量最多的样本的类型为该“叶子”的预测类型。其实用决策树解决回归问题的思路也很类似,本文就简单探讨一下,并总结决策树的局限性。
一、决策树解决回归问题的基本思路
决策树解决回归问题的思路与解决分类问题非常接近:当模型参数划分结束后,把每个“叶子”节点处的相应的数据输出值的平均值,作为该“叶子”的预测值(也就是训练结束后,每个“叶子”处可能有多个数值,取多个数值的平均值作为该“叶子”的预测值。根据特征值预测未知的样本数据时,如果最终计算结果在该“叶子”上,认为该“叶子”的预测值为该特征值对应的样本的数据)。
二、使用sklearn封装的决策树回归算法解决回归问题
新建一个工程,创建一个main.py文件,实现如下代码:
from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
from sklearn.tree import DecisionTreeRegressor
#创建决策树回归器
dt_reg = DecisionTreeRegressor()
from sklearn.model_selection import GridSearchCV
param_grid = [
{
'max_depth': [i for i in range(2, 20)],
'min_samples_split': [i for i in range(2, 20)],
'max_leaf_nodes': [i for i in range(2, 20)],
'min_samples_leaf': [i for i in range(2, 20)],
'max_features': [i for i in range(2, 14)]
}
]
grid_search = GridSearchCV(dt_reg, param_grid, n_jobs=-1, verbose=1) #进行对超参数的网格搜索
grid_search.fit(X_train, y_train)
print(grid_search.best_params_) #打印最佳超参数
best_dt_reg = grid_search.best_estimator_
print(best_dt_reg.score(X_test, y_test))
在我的计算机上经过近20分钟的搜索后,打印结果如下:
三、决策树的局限性
● 决策树模型的决策边界都是与坐标轴平行的,永远不会产生斜线,决策边界可能不准确。
● 对个别数据比较敏感:对某一个样本的增减,对模型的训练影响较大(是非参数学习的共同缺陷)。