MachineLearning-5.(回归)决策树回归
条评论决策树回归核心:划分点选择 + 输出值确定 [1]。
决策树是一种基本的分类与回归方法,回归决策树主要指CART(classification and regression tree)算法,内部结点特征的取值为“是”和“否”, 为二叉树结构。
回归树
Cart决策树
sklearn提供的决策树底层为Cart树(Classification and Regression Tree),Cart回归树在解决回归问题时的步骤如下:
- 原始数据集S,此时树的深度depth=0;
- 针对集合S,遍历每一个特征的每一个value(遍历数据中的所有离散值(12个))
用该value将原数据集S分裂成2个集合:左集合left(<=value的样本)、右集合right(>value的样本),
分别计算这2个集合的mse(均方误差),找到使(left_mse+right_mse)最小的那个value,记录下此时的特征名称和value,这个就是最佳分割特征以及最佳分割值; - 找到最佳分割特征以及最佳分割value之后,用该value将集合S分裂成2个集合,depth+=1;
- 针对集合left、right分别重复步骤2,3,直到达到终止条件。
决策树底层结构为二叉树
1 | 终止条件有如下几种: |
决策树回归器模型相关API:
1 | import sklearn.tree as st |
案例:预测波士顿地区房屋价格。
读取数据(划分训练集和测试集)
1 | import sklearn.datasets as sd |
创建决策树回归器模型
使用训练集训练模型,使用测试集测试模型。
1 | import sklearn.tree as st |
集合算法
单个模型得到的预测结果总是片面的,根据多个不同模型给出的预测结果,利用平均(回归)或者投票(分类)的方法,得出最终预测结果。
基于决策树的集合算法,就是按照某种规则,构建多棵彼此不同的决策树模型,分别给出针对未知样本的预测结果,最后通过平均或投票得到相对综合的结论。常用的集合模型包括Boosting类模型(AdaBoost、GBDT)与Bagging(自助聚合、随机森林)类模型。
Boosting类模型
AdaBoost模型(正向激励)
首先为样本矩阵中的样本随机分配初始权重,由此构建一棵带有权重的决策树,在由该决策树提供预测输出时,通过加权平均或者加权投票的方式产生预测值。
将训练样本代入模型,预测其输出,对那些预测值与实际值不同的样本,提高其权重,由此形成第二棵决策树。重复以上过程,构建出不同权重的若干棵决策树。
正向激励相关API:
1 | import sklearn.tree as st |
案例:基于正向激励训练预测波士顿地区房屋价格的模型。
1 | # 创建基于决策树的正向激励回归器模型 |
特征重要性
作为决策树模型训练过程的副产品,根据划分子表时选择特征的顺序标志了该特征的重要程度,此即为该特征重要性指标。训练得到的模型对象提供了属性:feature_importances_来存储每个特征的重要性。
获取样本矩阵特征重要性属性:
1 | model.fit(train_x, train_y) |
案例:获取普通决策树与正向激励决策树训练的两个模型的特征重要性值,按照从大到小顺序输出绘图。
1 | import matplotlib.pyplot as mp |
GBDT
GBDT(Gradient Boosting Decision Tree 梯度提升树)通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差(残差在数理统计中是指实际观察值与估计值(拟合值)之间的差)基础上进行训练。基于预测结果的残差设计损失函数。GBDT训练的过程即是求该损失函数最小值的过程。
1 | import sklearn.tree as st |
1 | boosting : Adaboost GBDT |
Bagging类模型
自助聚合
每次从总样本矩阵中以有放回抽样的方式随机抽取部分样本构建决策树,这样形成多棵包含不同训练样本的决策树,以削弱某些强势样本对模型预测结果的影响,提高模型的泛化特性。
随机森林
在自助聚合的基础上,每次构建决策树模型时,不仅随机选择部分样本,而且还随机选择部分特征,这样的集合算法,不仅规避了强势样本对预测结果的影响,而且也削弱了强势特征的影响,使模型的预测能力更加泛化。
随机森林相关API:
1 | import sklearn.ensemble as se |
案例:分析共享单车的需求,从而判断如何进行共享单车的投放。
1 | 1。加载并整理数据集 |
1 | import numpy as np |
画图显示两组样本数据的特征重要性:
1 | mp.figure('Bike', facecolor='lightgray') |