回归树理论与波士顿房价案例
- 一、回归树理论
- (1)回归树
- (2)回归树的建立
- (3)基于回归树的预测
- (4)剪枝
- 二、K 近邻(回归)具体案例操作
- 参考文献
一、回归树理论
(1)回归树
当数据拥有众多特征并且特征之间关系复杂时,构建全局模型变得困难而笨拙,并且很多实际问题都是非线性的,不可能使用全局线性模型来拟合任何数据。一种可行的方法是将数据集切分成很多份易建模的数据,然后利用线性回归技术来建模和拟合。如果首次切分后仍然难以拟合线性模型就继续切分。在这种切分方式下,树结构的回归法就相当有用。
回归树与分类树的思路类似,但叶节点的数据类型不是离散型,而是连续型(即因变量 y 是连续性数值变量),其适用场景是:标签值是连续分布的,但又是可以划分群落的,群落之间是有比较鲜明的区别的,即每个群落内部是相似的连续分布,群落之间分布却是不同的。所以回归树既算回归,也称得上分类。
解释:回归是为了处理预测值是连续分布的情景,其返回值应该是一个具体的连续预测值。回归树的叶子是一个个具体的值,从预测值连续这个意义上严格来说,回归树不能称之为“回归算法”。因为回归树返回的是“一团”数据的均值,而不是具体的、连续的预测值(即训练数据的标签值虽然是连续的,但回归树的预测值却只能是离散的)。所以回归树其实也可以算为“分类”算法,其适用场景要具备“物以类聚”的特点,即特征的组合会使标签属于某一个“群落”,群落之间会有相对鲜明的“鸿沟”。
(2)回归树的建立
a. 寻找当前最佳待切特征和切分点并返回
b. 如果当前最佳特征没有找到,不可切分,则把当前结点的样本标签(label)的均值作为叶子节点
c.否则用最佳特征和特征值构建当前结点,按照最佳待切分特征将数据集切分成左右子树(这里为了方便,假设大于切分点则为左,小于则归为右)
d. 切分后的左右节点分别递归以上算法
**注意:**回归树的构造过程类似分类树的构造,不同之处在于度量性能的测度不同:
a. 分类树使用信息增益或增益比率来划分节点;每个节点样本的类别情况投票决定测试样本的类别。
b. 回归树使用最小均方差划分节点;每个节点样本的均值作为测试样本的回归预测值。
(3)基于回归树的预测
a.判断当前回归树是否为叶子节点,如果是则[预测](取算术平均数),如果不是则执行 b
b.将测试数据相应特征的取值与当前回归树进行比较,如果测试数据特征数值大,则判别当前回归树的左子树是否为叶子节点,如果不是叶子节点则进行[b],如果是叶子节点,则进行[a];反之,判别当前回归树的右子树是否为叶子节点,如果不是叶子节点则进行[a],如果是叶子节点,则进行[b]
误差、叶子节点和预测三者有相关的关联关系,一种相对简单的是误差采用的是 y 值均方差,叶子节点相应的建立为该节点下所有样本的 y 值平均值,预测的时候根据判断返回该叶子节点下 y 值平均值即可。基于回归树的预测方法如下图:
在进行最佳待切分特征选取的时候,一般还有两个参数,一个是允许的误差(或者均方误差)下降值,一个是切分最小样本数或者说节点最小数。对于允许误差下降值,在实际过程中,需要在分割之后其误差减少应该至少大于该 bound ;对于切分最小样本数,也就是说切分后的子树中包含的样本数应该多于该 bound 。其实这两种策略都是为了避免过拟合。
(4)剪枝
决策树为什么(WHY)要剪枝?原因是避免决策树过拟合(Overfitting)样本。前面的算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。Quinlan 教授试验,在数据集中,过拟合的决策树的错误率比经过简化的决策树的错误率要高。
剪枝可以分为两种:预剪枝(Pre-Pruning)和后剪枝(Post-Pruning)。
Pre-Pruning 可以事先指定决策树的最大深度,或最小样本量,以防止决策树过度生长。前提是用户对变量具有较为清晰的把握,且要反复尝试调整,否则无法给出一个合理值。
Post-pruning 是一个边修剪边检验的过程,即在决策树充分生长的基础上,设定一个允许的最大错误率,然后一边修剪子树,一边计算输出结果的精度或误差(注意:当错误率高于最大值后,立即停止剪枝)。
为了获得最佳模型,树剪枝常采用预剪枝和后剪枝结合的方法进行。
二、K 近邻(回归)具体案例操作
# 从 sklearn.datasets 导入波士顿房价数据读取器。
from sklearn.datasets import load_boston
# 从读取房价数据存储在变量 boston 中。
boston = load_boston()
# 从sklearn.cross_validation 导入数据分割器。
from sklearn.model_selection import train_test_split
X = boston.data
y = boston.target
# 随机采样 25% 的数据构建测试样本,其余作为训练样本。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.25)
# 从 sklearn.preprocessing 导入数据标准化模块。
from sklearn.preprocessing import StandardScaler
# 分别初始化对特征和目标值的标准化器。
ss_X = StandardScaler()
ss_y = StandardScaler()
# 分别对训练和测试数据的特征以及目标值进行标准化处理。
X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
y_train = ss_y.fit_transform(y_train.reshape(-1,1))
y_test = ss_y.transform(y_test.reshape(-1,1))
# 从 sklearn.tree 中导入 DecisionTreeRegressor 。
from sklearn.tree import DecisionTreeRegressor
# 使用默认配置初始化 DecisionTreeRegressor 。
dtr = DecisionTreeRegressor()
# 用波士顿房价的训练数据构建回归树。
dtr.fit(X_train, y_train)
# 使用默认配置的单一回归树对测试数据进行预测,并将预测值存储在变量 dtr_y_predict 中。
dtr_y_predict = dtr.predict(X_test)
# 使用 R-squared、MSE 以及 MAE 指标对默认配置的回归树在测试集上进行性能评估。
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
print('R-squared value of DecisionTreeRegressor:', dtr.score(X_test, y_test))
print('The mean squared error of DecisionTreeRegressor:', mean_squared_error(
ss_y.inverse_transform(y_test), ss_y.inverse_transform(dtr_y_predict)))
print('The mean absoluate error of DecisionTreeRegressor:', mean_absolute_error(
ss_y.inverse_transform(y_test), ss_y.inverse_transform(dtr_y_predict)))
由以上结果可知,采用回归树模型在本例中性能表现优于简单线性回归器和随机梯度下降法,因此可初步判断特征与目标值之间存在一定的非线性关系。
参考文献
[1] 李航. 统计学习方法[M]. 清华大学出版社, 北京, 2012.
[2] 范淼,李超.Python 机器学习及实践[M].清华大学出版社, 北京, 2016.