前言
前几个小节一直在使用决策树解决分类问题,其实决策树这种思想也可以非常容易的解决回归问题。使用 CART 这种方式构建决策树之后,训练好的决策树中的每一个叶子节点中都会有很多样本点。在预测阶段,如果一个新的测试样本点输入到决策树中,最终会到达某一个叶子节点上。
- 对于分类问题。测试样本点到达的叶子节点上所有类别中样本点最多的类别,即为测试样本点的类别;
- 对于回归问题。测试样本点到达的叶子节点上所有样本点输出值的平均值,即为测试样本点的输出值;
使用决策树解决回归问题
导入 NumPy 和 Matplotlib 两个模块。
代码语言:javascript复制In[1]: import numpy as np
import matplotlib.pyplot as plt
本小节使用决策树来解决回归问题,因此使用回归数据集波士顿房价。在 sklearn 中使用波士顿房价数据集,只需要在 sklearn.datasets 模块中导入 load_boston 函数。
代码语言:javascript复制In[2]: from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target
由于本小节需要评估决策树在回归问题中的性能,所以使用 train_test_split 函数将数据集划分为训练集和测试集。
代码语言:javascript复制In[3]: from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X
,y
,random_state = 666)
接下来使用 sklearn 封装好的 DecisionTreeRegressor 类来创建决策树的回归器,实例化决策树回归器全部使用默认的参数。
代码语言:javascript复制 In[4]: from sklearn.tree import DecisionTreeRegressor
dt_reg = DecisionTreeRegressor()
dt_reg.fit(X_train, y_train)
Out[4]: DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=None, splitter='best')
实际上 DecisionTreeRegressor(决策树回归器)和 DecisionTreeClassifier(决策树分类器)的构造参数是完全一样的。DecisionTreeRegressor 使用决策树解决回归问题,而 DecisionTreeClassifier 使用决策树解决分类问题。对于决策树来说,回归和分类唯一的区别在于最终通过叶子节点(预测阶段,测试样本点所到达决策树的叶子节点)得到的是一个具体数值的回归结果(叶子节点上所有样本点输出值的平均值),还是一个类别的分类结果(叶子节点上所有类别中样本点最多的类别)。
训练好了决策树,接下来可以调用 score 函数来计算回归模型的准确度。sklearn 中的 score 函数使用的是 R Squared,R Squared 值越大越好,当预测模型不犯任何错误的时候,R Squared 达到最大值 1。
代码语言:javascript复制 In[5]: dt_reg.score(X_test, y_test)
Out[5]: 0.58605479243964098
计算在训练集上的 R Squared 值。
代码语言:javascript复制 In[6]: dt_reg.score(X_train, y_train)
Out[6]: 1.0
此时训练好的决策树在训练集上的 R Squared 值为 1.0,而在测试集上的 R Squared 值为 0.58。模型在训练集上表现很好,预测结果没有任何偏差,而模型在测试集上表现却很差,并且模型在训练集和测试集上的表现相差非常大,显然模型已经过拟合。这也从侧面印证了,像决策树这种无参数的机器学习算法,非常容易产生过拟合。 如果想要减轻过拟合,需要使用上一小节介绍的那些参数。
两个判断过拟合曲线
在第 8 章中介绍了一些用于判断过拟合和欠拟合的方法,学习曲线和模型复杂度曲线。
- 学习曲线。学习曲线其实非常简单,可以想象一下,我们在学习知识的时候是不断的将新的内容放入我们的大脑中去消化理解,而对于模型来说,所谓的这些知识就是已知的样本信息,学习曲线描述的就是随着训练样本的逐渐增多,算法训练出的模型的表现能力。
- 模型复杂度曲线。当模型复杂度逐渐提高,训练集的准确率会呈现逐渐递增的趋势,而测试集的准确率先逐渐增高之后到达某一临界点之后,开始之间降低,而我们需要找的就是模型在测试集上准确率最高的临界点。
References:
- Python3入门机器学习 经典算法与应用: https://coding.imooc.com/class/chapter/169.html#Anchor