一. 决策树简介
主要用于分类
概述
简介
概念
决策树是一种树形结构,树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果, 根节点尤为重要.
构建决策树步骤
特征选择:选取有较强分类能力的特征。
决策树生成:根据选择的特征生成决策树。
★决策树也易过拟合,采用剪枝的方法缓解过拟合。
二. ID3决策树
ID3 树是基于信息增益构建的决策树.
信息熵
定义
熵在信息论中代表随机变量不确定度的度量。
熵越大,数据的不确定性度越高, 稳定性越低
熵越小,数据的不确定性越低, 稳定性越高
举例说明
数据α 包含了 8 种信息,数据 β 包含了 4 种信息,
特征α 的信息熵大于特征 β 的信息熵。
计算方式
公式
例子
信息增益
信息增益越大, 则该特征越重要, 同时, 信息增益是ID3决策树的分裂依据
概念
特征a对训练数据集D的信息增益𝐺𝑎𝑖𝑛(𝐷, 𝑎)或g(D,a),定义为集合D的熵H(D)与特征a给定条件下D的熵H(D |a)之差。
公式
举例
ID3树的构建过程
流程
计算每个特征的信息增益
使用信息增益最大的特征将数据集 拆分为子集
使用该特征(信息增益最大的特征)作为决策树的一个节点
使用剩余特征对子集重复上述(1,2,3)过程
举例
三. C4.5决策树
解决: ID3偏向于选择种类多的特征作为分裂依据
信息增益率
信息增益率越大越好
计算方法
信息增益率本质
特征的信息增益 ➗ 特征的内在信息
相当于对信息增益进行修正,增加一个惩罚系数
特征取值个数较多时,惩罚系数较小;特征取值个数较少时,惩罚系数较大。
惩罚系数:数据集D以特征a作为随机变量的熵的倒数
举例
总结
四. CART决策树
CART决策树(Classification and Regression Tree)
Cart模型是一种决策树模型,它即可以用于分类,也可以用于回归。
Cart回归树使用平方误差最小化策略,
Cart分类生成树采用的基尼指数最小化策略。
基尼指数
用来确定分裂点, 越小越好, 越小的越靠近根节点
基尼值
从数据集D中随机抽取两个样本,其类别标记不一致的概率。
Gini(D)值越小,数据集D的纯度越高。
基尼指数
选择使划分后基尼系数最小的属性作为最优化分属性。
注意
信息增益(ID3)、信息增益率值越大(C4.5),则说明优先选择该特征。
基尼指数值越小(CART),则说明优先选择该特征。
举例
需求
分析是否有房
分析婚姻状况
只能二叉树, 因此分情况统计
分析年收入
结果
总结
名称 | 提出时间 | 分支方式 | 特点 |
---|---|---|---|
ID3 | 1975 | 信息增益 | 1.ID3只能对离散属性的数据集构成决策树 <br />2.倾向于选择取值较多的属性 |
C4.5 | 1993 | 信息增益率 | 1.缓解了ID3分支过程中总喜欢偏向选择值较多的属性 <br />2.可处理连续数值型属性,也增加了对缺失值的处理方法 <br />3.只适合于能够驻留于内存的数据集,大数据集无能为力 |
CART | 1984 | 基尼指数 | 1.可以进行分类和回归 ,可处理离散属性,也可以处理连续属性 <br />2.采用基尼指数,计算量减小 <br />3.一定是二叉树 |
五. 泰坦尼克号案例
决策树API
sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None) Criterion: 特征选择标准 "gini"或"entropy",前者(默认)代表基尼系数(CART),后者代表信息增益(ID3)。 min_samples_split:内部节点再划分所需最小样本数 min_samples_leaf:叶子节点最少样本数 max_depth:决策树最大深度
泰坦尼克号生存案例
代码
# 1.导入依赖包 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier, plot_tree from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, classification_report import matplotlib.pyplot as plt # 2.读取数据及预处理 # 2.1 读取数据 data = pd.read_csv('data/train.csv') # data.info() # print(data.head()) # 2.2 数据处理 x = data[['Age', 'Pclass', 'Sex']] y = data.Survived # 2.3 缺失值处理 x.Age.fillna(x['Age'].mean(), inplace=True) print(x.Age) x = pd.get_dummies(x) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=21, random_state=21) # 3.模型训练 model = DecisionTreeClassifier() model.fit(x_train, y_train) # 4.模型预测与评估 # 4.1 模型预测 y_predict = model.predict(x_test) # 4.2 模型评估 print('准确率(直接评估): ', model.score(x_test, y_test)) print('准确率(预测后评估): ', accuracy_score(y_test, y_predict)) print('精确率: ', precision_score(y_test, y_predict)) print('召回率: ', recall_score(y_test, y_predict)) print('f1值: ', f1_score(y_test, y_predict)) print('AUC值: ', roc_auc_score(y_test, y_predict)) myreport = classification_report(y_predict, y_test, target_names=['died', 'survived']) print('myreport-->\n', myreport) # 4.3 可视化 plt.figure(figsize=(20, 20)) plot_tree( model, max_depth=5, filled=True, fontsize=20, feature_names=['Pclass', 'Age', 'Sex_female', 'Sex_male'], class_names=['died', 'survived'] ) plt.show()
结果图
六. CART回归决策树
构建原理
原理
CART 回归树和CART分类树的不同之处在于
CART分类树预测输出的是一个离散值,CART回归树预测输出的是一个连续值
CART分类树使用基尼指数作为划分、构建树的依据,CART 回归树使用平方损失
分类树使用叶子节点多数类别作为预测类别,回归树则采用叶子节点里均值作为预测输出
CART 回归树的平方损失
举例
总结
选择一个特征,将该特征的值进行排序,取相邻点计算均值作为待划分点
根据所有划分点,将数据集分成两部分:R1、R2
R1 和 R2 两部分的平方损失相加作为该切分点平方损失
取最小的平方损失的划分点,作为当前特征的划分点
以此计算其他特征的最优划分点、以及该划分点对应的损失值
在所有的特征的划分点中,选择出最小平方损失的划分点,作为当前树的分裂点
线性回归-回归决策树对比
案例介绍
代码演示
# 导包 import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # 回归决策树 from sklearn.linear_model import LinearRegression # 线性回归 def dm01_回归分类(): # 准备数据 x = np.array(list(range(1, 11))).reshape(-1, 1) # reshape => 重塑 y = np.array([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05]) print(x) print(y) # 模型训练 mode1 = DecisionTreeRegressor(max_depth=1) # 决策树 mode2 = DecisionTreeRegressor(max_depth=3) # 决策树 mode3 = LinearRegression() # 线性回归 mode1.fit(x, y) mode2.fit(x, y) mode3.fit(x, y) # 模型预测 x_test = np.arange(0.0, 10.0, 0.01).reshape(-1, 1) # 生成0 ~ 10 的1000个点 y_predict1 = mode1.predict(x_test) y_predict2 = mode2.predict(x_test) y_predict3 = mode3.predict(x_test) print(y_predict1, y_predict2, y_predict3) # 结果可视化 plt.figure(figsize=(10, 6), dpi=100) plt.scatter(x, y, label='data') # 绘制训练姐数据点 plt.plot(x_test, y_predict1, label='max_depth=1') # 绘制回归决策树的数据点 plt.plot(x_test, y_predict2, label='max_depth=3') # 绘制回归决策树的数据点 plt.plot(x_test, y_predict3, label='linear') # 绘制线性回归的数据点 plt.xlabel('data') plt.ylabel('target') plt.title('DecisionTreeRegressor') plt.legend() plt.show() if __name__ == '__main__': dm01_回归分类()
结果图
七. 决策树剪枝
剪枝介绍
作用
决策树剪枝是一种防止决策树过拟合的一种正则化方法;提高其泛化能力。
原理
把子树的节点全部删掉,使用用叶子节点来替换
剪枝方法
预剪枝(边构建边剪枝):
指在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点;后剪枝(先构建后剪枝, 自底向上):
是先从训练集生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点。
剪枝思想-举例介绍
预剪枝
基于预剪枝策略从上表数据所生成的决策树如上图所示,其验证集精度为71.4%.
后剪枝
先利用训练集完整的生成一颗树,有6个内部节点。分别考察这些节点作为叶子节点模型的准确率,若准确率上升,则剪掉,否则保留。
预-后剪枝对比
预剪枝
优点: 预剪枝使决策树的很多分支没有展开,不但
降低了过拟合风险
,还显著减少了决策树的训练、测试时间开销
缺点: 有些分支的当前划分虽不能提升泛化性能,但后续划分却有可能导致性能的显著提高;预剪枝决策树也
带来了欠拟合的风险
后剪枝
优点: 比预剪枝保留了更多的分支。一般情况下,后剪枝决策树的欠拟合风险很小,
泛化性能往往优于预剪枝
缺点: 后剪枝先生成,后剪枝。自底向上地对树中所有非叶子节点进行逐一考察,
训练时间开销比未剪枝的决策树和预剪枝的决策树都要大得多。