待完成:

  • 参考所有笔记,整理习题
  • 有疑问的地方


步骤

1、先看习题部分有什么问题,带着问题
2、整体过一遍,记录
3、各平台关于该 知识点 的教程
3、做习题,再次整理,补充。

问题:

1、各种决策树划分选择准则的特点、优缺点
2、数据集含冲突数据怎么办?
3、未剪枝、预剪枝、后剪枝决策树有什么区别和联系?
4、统计显著性检验是什么?


第4章 决策树


关键: 第8行 选择最优划分属性。

决策树的生成, 递归过程。

递归返回的三种情形:
1、当前结点包含的样本全属于同一类别,无需划分
2、当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。

  • 当前结点标记为叶结点,类别设定为 该结点所含样本最多的类别。
  • 利用当前结点的后验分布。

3、当前结点包含的样本集合为空,不能划分。

  • 当前结点标记为叶结点,类别设定为 其父结点所含样本最多的 类别。(因为当前结点的样本集合是空的。。。所以只能看父结点的情况)
  • 把父结点的样本分布作为当前结点的先验分布。

?上述三种情况的具体情形

4.2 划分选择

如何选择最优划分属性
目标:

  • 决策树的分支结点所包含的样本尽可能属于同一类别。
  • 即结点的“纯度”越来越高。

4.2.1 信息增益

信息熵(information entropy ): 度量 样本集合 纯度 最常用的 指标

样本集合D中第k类样本所占的比例为pk(k=1,2,3,..∣Y∣)样本集合D中第k类样本所占的比例为p_k(k=1,2,3,..|\mathcal{Y}|)样本集合D中第k类样本所占的比例为pk​(k=1,2,3,..∣Y∣)
DDD的信息熵: Ent(D)=−∑k=1∣Y∣pklog2PkEnt(D)=-\sum\limits_{k=1}^{|\mathcal{Y}|}p_klog_2P_kEnt(D)=−k=1∑∣Y∣​pk​log2​Pk​

  • Ent(D)Ent(D)Ent(D)的值越小,D的纯度越高。

离散属性a有V个可能的取值{a1,a2,...,aV}离散属性a有V个可能的取值\left\{a^1,a^2,...,a^V\right\}离散属性a有V个可能的取值{a1,a2,...,aV}
Dv:第v个分支结点包含了D中所有在属性a上的取值为av的样本D^v:第v个分支结点包含了D中所有在属性a上的取值为a^v的样本Dv:第v个分支结点包含了D中所有在属性a上的取值为av的样本

样本数越多,分支结点的影响越大。

属性a对样本集D进行划分获得的"信息增益":Gain(D,a)=Ent(D)−∑v=1V∣Dv∣∣D∣Ent(Dv)属性a对样本集D进行划分获得的"信息增益":Gain(D,a)=Ent(D)-\sum\limits_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v)属性a对样本集D进行划分获得的"信息增益":Gain(D,a)=Ent(D)−v=1∑V​∣D∣∣Dv∣​Ent(Dv)

  • 信息增益越大,使用属性aaa来进行划分所获得的的纯度提升越大。

将4.2 算法中第8行选择属性改为 a∗=arg⁡max⁡a∈AGain(D,a)a_*=\arg\max\limits_{a \in A}Gain(D, a)a∗​=arga∈Amax​Gain(D,a)

ID3 决策树算法

  • ID(Iterative Dichotomiser), 迭代二分器

信息增益_计算示例:


1、计算,选择第一个划分属性

划分:

2、进行第二层划分,以最左的子集为例:
同样计算各属性的信息增益


最大增益的有三个,选其中一个即可。

最终得到的划分方案之一:

4.2.2 增益率

问题:信息增益准则对可选取数目多的属性有偏好

C4.5决策树算法, 增益率

  • 和ID3决策树算法是同一个学者设计

增益率(gain ratio):

Gain_ratio(D,a)=Gain(D,a)IV(a)Gain\_ratio(D, a)=\frac{Gain(D, a)}{IV(a)}Gain_ratio(D,a)=IV(a)Gain(D,a)​
IV(a)=−∑v=1V∣Dv∣∣D∣log2∣Dv∣∣D∣IV(a)=-\sum\limits_{v=1}^V\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}IV(a)=−v=1∑V​∣D∣∣Dv∣​log2​∣D∣∣Dv∣​, 属性a的固有值(intrinsic value)

增益率准则对 可取值数目较少的属性有所偏好。

  • C4.5算法选择划分属性的方法: 先从候选划分属性中找出信息增益 高于 平均水平的属性,再从中选择增益率高

4.2.3 基尼指数(Gini index)

CART(Classification and Regression Tree), 可用于分类回归任务。

数据集DDD的纯度可用基尼值来度量:

Gini(D)=∑k=1∣Y∣∑k′≠kpkpk′=1−∑k=1∣Y∣pk2Gini(D)=\sum\limits_{k=1}^{|\mathcal{Y}|}\sum\limits_{k^{'}\neq k}p_kp_{k^{'}}=1-\sum\limits_{k=1}^{|\mathcal{Y}|}p_k^2Gini(D)=k=1∑∣Y∣​k′​=k∑​pk​pk′​=1−k=1∑∣Y∣​pk2​

Gini(D)Gini(D)Gini(D)反映了从数据集DDD中随机抽取两个样本,其类别不一致的概率。

  • 减去类别一致的概率,剩下的就是类别不一致的概率???

Gini(D)Gini(D)Gini(D)越小,数据集DDD的纯度越高

最优划分属性: 基尼指数小的

  • 图4.2 算法中第8行选择属性改为 a∗=arg⁡min⁡a∈AGini_index(D,a)a_*=\arg\min\limits_{a \in A}Gini\_index(D, a)a∗​=arga∈Amin​Gini_index(D,a)

4.3 剪枝(pruning)处理_ 应对过拟合

决策树算法 对付 过拟合

过拟合: 把训练集自身的一些特点当作所有数据都具有的一般性质

主动去掉一些分支, 降低过拟合的风险。

决策树剪枝的基本策略 特点
预剪枝(prepruning) 1、决策树生成过程中;2、结点划分前进行估计:若当前结点的划分不能带来决策树泛化性能的提升,停止划分。
后剪枝(postpruning) 1、完整的决策树已生成;2、自底向上对非叶结点进行考察: 若将该结点对应的子树替换为叶结点能带来决策树泛化性能的提升,则将该子树替换为叶结点。

如何判断决策树泛化性能是否提升呢?

  • 2.2节 性能评估方法

留出法


4.3.1 预剪枝

注: 类别标记为训练样例最多的类别。

1、对划分前后的泛化性能进行估计。

?结点3的判断是有问题吗?

预剪枝优缺点

1、预剪枝使得决策树的很多分支都没有展开。

  • 降低了过拟合的风险,显著减少了决策树的训练开销和测试时间开销

2、预剪枝基于"贪心"本质禁止分支展开,有欠拟合风险

  • 后续划分有可能性能显著提高。

4.3.2 后剪枝

同样处理图4.5的决策树,其验证集精度为42.9%。

后剪枝:


1、考察结点⑥,训练集包含{7,15},替换成叶结点"好瓜", 再看验证集中{8,9}都将是好瓜。剪枝后,8号判断正确,精确度为4/7=51.7%。

2、考察结点⑤,训练集包括{6,7,15}, 替换成叶结点"好瓜",对验证集无影响,可以不剪枝。

3、考察结点②,训练集包括{1,2,3,14},替换成叶结点"好瓜",对验证集{4,13,5},相比于剪枝前,{5}将判定正确,此时验证集精度为5/7=71.4%,进行剪枝。

①②③④⑤⑥⑦⑧⑨⑩

后剪枝优缺点

后剪枝决策树通常比预剪枝决策树保留了更多的分支。

1、后剪枝决策树的欠拟合风险很小泛化性能往往优于预剪枝决策树。

2、后剪枝过程是在生成完全决策树之后进行的,并且需要自底向上地对树中的所有非叶子结点进行逐一考察

  • 训练时间开销大

4.4 连续与缺失值

4.4.1 连续值处理

决策树学习 使用 连续属性

连续属性离散化。

二分法

样本集D和连续属性a,假定a在D上出现了n个不同的取值,样本集D和连续属性a,假定a在D上出现了n个不同的取值,样本集D和连续属性a,假定a在D上出现了n个不同的取值,
将这些值进行从小到大的排序,记为{a1,a2,...,an}将这些值进行从小到大的排序,记为\left\{a^1,a^2,...,a^n\right\}将这些值进行从小到大的排序,记为{a1,a2,...,an}
相邻的属性取值ai和ai+1相邻的属性取值a^i和a^{i+1}相邻的属性取值ai和ai+1

包含n-1个元素的候选划分点
Ta={ai+ai+12∣1≤i≤n−1}T_a=\left\{\frac{a^i+a^{i+1}}{2}|1\le i\le n-1\right\}Ta​={2ai+ai+1​∣1≤i≤n−1}

像离散属性值一样考察这些划分点。

Gain(D,a)=max⁡t∈TaGain(D,a,t)=max⁡t∈TaEnt(D)−∑λ∈{−,+}∣Dtλ∣∣D∣Ent(Dtλ)Gain(D,a)=\max\limits_{t\in T_a }Gain(D,a,t)=\max\limits_{t\in T_a }Ent(D)-\sum\limits_{\lambda\in\left\{-,+\right\}}\frac{|D_t^{\lambda}|}{|D|}Ent(D_t^{\lambda})Gain(D,a)=t∈Ta​max​Gain(D,a,t)=t∈Ta​max​Ent(D)−λ∈{−,+}∑​∣D∣∣Dtλ​∣​Ent(Dtλ​)

P85

4.4.2 缺失值处理

诊测成本、隐私保护。

4.5 多变量决策树

1、把每个属性视为坐标空间的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点。

  • 轴平行

问题
若是分类边界需要很多段划分,需要进行大量的属性测试,测试时间开销就会很大。

多变量决策树: 实现斜划分甚至更复杂划分的决策树。

  • 不是为每个非叶子结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器


决策树学习算法的三大代表: ID3, C4.5,CART

增量学习: 调整分支路径上的划分属性次序来对树进行重构。

CLS(Concept Learning System)

  • 决策树分而治之
  • 信息增益准则,ID3算法

习题

4.1

4.1 试证明对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集一致(即训练误差为0)的决策树。

4.2

4.2 试析使用"最小训练误差"作为决策树划分选择准则的缺陷。

4.3

4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中的树生成一棵决策树。

4.4

4.4 试编程实现基于基尼指数进行划分选择的决策树算法算法,为表4.2中数据生成预剪枝、后剪枝决策树,并与未剪枝决策树进行比较。

4.5

4.5 试编程实现基于对率回归进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树。

4.6

4.6 试选择4个UCI数据集,对上述3种算法所产生的未剪枝、预剪枝、后剪枝决策树实验进行比较,并进行适当的统计显著性检验。

4.7

4.7 图4.2 是一个递归算法,若面临巨量数据,则决策树的层数会很深,使用递归方法易导致“栈”溢出。试使用“队列”数据结构,以参数MaxDepthMaxDepthMaxDepth控制树的最大深度,写出与图4.2等价、但不使用递归的决策树算法。

4.8

4.8 试将决策树生成的深度优先搜索过程修改为广度优先搜索,以参数MaxNodeMaxNodeMaxNode控制树的最大结点数,将题4.7中基于队列的决策树算法进行改写,对比题4.7中的算法,试析哪种方式更易于控制决策树所需存储不超过内存。

4.9

4.9 试将4.2.2节对缺失值的处理机制推广到基尼指数的计算当中去。

4.10

4.10 从网上下载或自己编程实现任意一种多变量决策树算法,并观察其在西瓜数据集3.0上产生的结果。

Code_天池_基于决策树的分类预测

天池课程链接_决策树分类

金融风控,医疗辅助诊断

基于树结构对数据进行划分

决策树优缺点

优点:
1、解释性好
2、可以发现特征的重要程度
3、模型的计算复杂度较低

缺点:
1、模型易过拟合,需剪枝
2、预测能力有限
3、方差较高,数据分布的轻微改变很容易造成树结构完全不同。

以决策树作为基模型的集成模型:
1、梯度提升树(GBDT)
2 、XGBoost
3、LightGBM

广告计算、CTR(点击通过率)预测、金融风控。

P1 Demo实践

流程:
1、库函数导入
2、模型训练
3、数据和模型可视化
4、模型预测

"""
Step1: 库函数导入
"""import numpy as np import  matplotlib.pyplot as plt
import seaborn as sns ## 可视化库,是对matplotlib进行二次封装而成##  导入 决策树模型函数from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
"""
Step2: 训练模型
"""## 构造数据集
x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
y_label = np.array([0, 1, 0, 1, 0, 1])## 调用决策树回归模型
tree_clf = DecisionTreeClassifier()## 调用决策树模型拟合构造的数据集
tree_clf = tree_clf.fit(x_fearures, y_label)
"""
Step3: 数据和模型可视化
"""## 可视化构造的数据样本点
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()

## 可视化决策树
import graphviz
dot_data = tree.export_graphviz(tree_clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("pengunis")

有一个报错:关于Graphviz,解决链接

  • 可能需要重启IDE
"""
Step4: 模型预测
"""
## 创建新样本
x_fearures_new1 = np.array([[0, -1]])
x_fearures_new2 = np.array([[2, 1]])## 在训练集和测试集上分布利用训练好的模型进行预测
y_label_new1_predict = tree_clf.predict(x_fearures_new1)
y_label_new2_predict = tree_clf.predict(x_fearures_new2)print('The New point 1 predict class:\n',y_label_new1_predict)
print('The New point 2 predict class:\n',y_label_new2_predict)

import graphviz
graphviz.__version__

P2 基于企鹅数据集的决策树分类实践

流程:
1、库函数导入
2、数据读取/载入
3、数据信息简单查看
4、可视化描述
5、利用 决策树模型 在二分类 上进行预测和训练
6、利用 决策树 模型 在三分类(多分类) 上进行 训练和预测

数据载入(网页->本地)
#下载需要用到的数据集
# !wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/6tree/penguins_raw.csv####################  报错## 需要先 pip install wget
"""
在Jupyter Notebook使用
"""
import wget
wget.download('https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/6tree/penguins_raw.csv', 'penguins_raw.csv')
"""
Step1: 库函数导入
"""
##  基础函数库
import numpy as np
import pandas as pd## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns

2、数据读取与载入(本地)
"""
Step2: 数据读取/载入
"""
## 利用Pandas自带的read_csv函数读取并转化为DataFrame格式
data = pd.read_csv('./penguins_raw.csv')## 为了方便,仅选取四个简单的特征
data = data[['Species','Culmen Length (mm)','Culmen Depth (mm)','Flipper Length (mm)','Body Mass (g)']]
3、数据信息查看
"""
Step3: 数据信息简单查看
"""
## 利用.info()查看数据的整体信息
# data.info()
# data.head()    ## 看前5条 信息   , 这里发现存在缺失值 NaN ,填补方法: 补-1, 中位数填补、平均数填补
data.tail()    ## 看最后五条  信息
# data['Species'].unique()  ## 其对应的类别标签为'Adelie Penguin', 'Gentoo penguin', 'Chinstrap penguin'三种不同企鹅的类别。# pd.Series(data['Species']).value_counts()  ## 利用value_counts函数查看每个类别数量data.describe()  ## 对于特征进行一些统计描述
## 用-1填补缺失值
data = data.fillna(-1)
3、可视化描述
"""
Step4: 可视化描述
"""
## 特征与标签组合的散点可视化
sns.pairplot(data=data, diag_kind='hist', hue= 'Species')
plt.show()

从上图可以发现,在2D情况下不同的特征组合对于不同类别的企鹅的散点分布,以及大概的区分能力Culmen Lenth(第1行和第1列)与其他特征的组合散点的重合较少,所以对于数据集的划分能力最好

箱型图:可以得到不同类别在不同特征上的分布差异情况。
'''为了方便我们将标签转化为数字'Adelie Penguin (Pygoscelis adeliae)'        ------0'Gentoo penguin (Pygoscelis papua)'          ------1'Chinstrap penguin (Pygoscelis antarctica)   ------2 '''def trans(x):if x == data['Species'].unique()[0]:return 0if x == data['Species'].unique()[1]:return 1if x == data['Species'].unique()[2]:return 2data['Species'] = data['Species'].apply(trans)for col in data.columns:if col != 'Species':sns.boxplot(x='Species', y=col, saturation=0.5, palette='pastel', data=data)plt.title(col)plt.show()



# 选取其前三个特征绘制三维散点图
from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')data_class0 = data[data['Species']==0].values
data_class1 = data[data['Species']==1].values
data_class2 = data[data['Species']==2].values
# 'setosa'(0), 'versicolor'(1), 'virginica'(2)
ax.scatter(data_class0[:,0], data_class0[:,1], data_class0[:,2],label=data['Species'].unique()[0])
ax.scatter(data_class1[:,0], data_class1[:,1], data_class1[:,2],label=data['Species'].unique()[1])
ax.scatter(data_class2[:,0], data_class2[:,1], data_class2[:,2],label=data['Species'].unique()[2])
plt.legend()plt.show()

决策树 二分类 训练+预测
## 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。
from sklearn.model_selection import train_test_split## 选择其类别为0和1的样本 (不包括类别为2的样本)
data_target_part = data[data['Species'].isin([0,1])][['Species']]
data_features_part = data[data['Species'].isin([0,1])][['Culmen Length (mm)','Culmen Depth (mm)','Flipper Length (mm)','Body Mass (g)']]## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data_features_part, data_target_part, test_size = 0.2, random_state = 2020)
## 从sklearn中导入决策树模型
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
## 定义 决策树模型
clf = DecisionTreeClassifier(criterion='entropy')
# 在训练集上训练决策树模型
clf.fit(x_train, y_train)
## 可视化
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("penguins")

## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
from sklearn import metrics## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()

决策树模型 三分类 训练+预测
## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data[['Culmen Length (mm)','Culmen Depth (mm)','Flipper Length (mm)','Body Mass (g)']], data[['Species']], test_size = 0.2, random_state = 2020)
## 定义 决策树模型
clf = DecisionTreeClassifier()
# 在训练集上训练决策树模型
clf.fit(x_train, y_train)
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)## 由于决策树模型是概率预测模型(前文介绍的 p = p(y=1|x,\theta)),所有我们可以利用 predict_proba 函数预测其概率
train_predict_proba = clf.predict_proba(x_train)
test_predict_proba = clf.predict_proba(x_test)print('The test predict Probability of each class:\n',test_predict_proba)
## 其中第一列代表预测为0类的概率,第二列代表预测为1类的概率,第三列代表预测为2类的概率。## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
## 查看混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()

sklearn_决策树模型重要参数



Code_sklearn_决策树

英文文档:https://scikit-learn.org/stable/modules/tree.html
中文文档:https://www.sklearncn.cn/11/

可用于分类与回归, 无参 监督学习

从数据特征中 学习决策规则 预测目标变量的值。

决策树优缺点

优势:
1、便于理解和解释。 树的结构可以可视化。
2、训练需要的数据少。但不支持缺失值
3、训练模型的时间复杂度是 参与训练的数据点对数 的数量。
4、能够处理数值型数据分类数据

缺点:
1、容易过拟合,导致泛化性能差。

  • 剪枝
  • 设置叶结点所需的最小样本数或设置树的最大深度。

2、数据中的 微小变化可能会导致完全不同的树。

  • 决策树的集成

3、拟合前先对数据进行平衡

简单分类:

二分类_决策树

"""
决策树——简单分类
"""
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)## 预测类别和概率
print(clf.predict([[2., 2.]]))
print(clf.predict_proba([[2., 2.]]))

多分类_决策树

"""
决策树——多分类
"""from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)import graphviz   ## 可视化决策树
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("iris")

决策树可视化_美化
"""
美化决策树_Jupyter Notebook
"""
dot_data = tree.export_graphviz(clf, out_file=None,feature_names=iris.feature_names,class_names=iris.target_names,filled=True, rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("iris2")   ## 到文件目录里找 d对应的pdf文件
graph

决策树可视化_文本导出
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_text
iris = load_iris()
decision_tree = DecisionTreeClassifier(random_state=0, max_depth=2)
decision_tree = decision_tree.fit(iris.data, iris.target)
r = export_text(decision_tree, feature_names=iris['feature_names'])
print(r)

Code例: iris数据集_决策树

可能需要更新版本:

pip install -U scikit-learn
from sklearn.datasets import load_irisiris = load_iris()"""
所有特征对  决策函数
"""
import numpy as np
import matplotlib.pyplot as pltfrom sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.inspection import DecisionBoundaryDisplay# Parameters
n_classes = 3
plot_colors = "ryb"
plot_step = 0.02for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]):# We only take the two corresponding featuresX = iris.data[:, pair]y = iris.target# Trainclf = DecisionTreeClassifier().fit(X, y)# Plot the decision boundaryax = plt.subplot(2, 3, pairidx + 1)plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)DecisionBoundaryDisplay.from_estimator(clf,X,cmap=plt.cm.RdYlBu,response_method="predict",ax=ax,xlabel=iris.feature_names[pair[0]],ylabel=iris.feature_names[pair[1]],)# Plot the training pointsfor i, color in zip(range(n_classes), plot_colors):idx = np.where(y == i)plt.scatter(X[idx, 0],X[idx, 1],c=color,label=iris.target_names[i],cmap=plt.cm.RdYlBu,edgecolor="black",s=15,)plt.suptitle("Decision surface of decision trees trained on pairs of features")
plt.legend(loc="lower right", borderpad=0, handletextpad=0)
_ = plt.axis("tight")

"""
决策树 可视化
"""
from sklearn.tree import plot_treeplt.figure()
clf = DecisionTreeClassifier().fit(iris.data, iris.target)
plot_tree(clf, filled=True)
plt.title("Decision tree trained on all the iris features")
plt.show()


用于理解决策树结构的一些示例

Code例:回归_决策树

from sklearn import tree
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = tree.DecisionTreeRegressor()
clf = clf.fit(X, y)
clf.predict([[1, 1]])

# Import the necessary modules and libraries
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(16))# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)# Predict
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)# Plot the results
plt.figure()
plt.scatter(X, y, s=20, edgecolor="black", c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

  • 如果树的最大深度(由max_depth参数控制)设置得太高,则决策树学习了训练数据的细节过多,并从噪声中学习,将会过拟合

Code例:多输出_决策树回归

多输出问题: 有多个输出需要预测。

输出之间没有相关性: 构建n个独立的模型
与同一输入相关的输出值可能是相关的: 构建能够同时预测所有N输出的单个模型。

"""
决策树   多输出回归 示例输入X: 单个实数值
输出Y: X 的正弦和余弦
"""import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(200 * rng.rand(100, 1) - 100, axis=0)
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y[::5, :] += 0.5 - rng.rand(20, 2)# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_3 = DecisionTreeRegressor(max_depth=8)
regr_1.fit(X, y)
regr_2.fit(X, y)
regr_3.fit(X, y)# Predict
X_test = np.arange(-100.0, 100.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)# Plot the results
plt.figure()
s = 25
plt.scatter(y[:, 0], y[:, 1], c="navy", s=s, edgecolor="black", label="data")
plt.scatter(y_1[:, 0],y_1[:, 1],c="cornflowerblue",s=s,edgecolor="black",label="max_depth=2",
)
plt.scatter(y_2[:, 0], y_2[:, 1], c="red", s=s, edgecolor="black", label="max_depth=5")
plt.scatter(y_3[:, 0], y_3[:, 1], c="orange", s=s, edgecolor="black", label="max_depth=8"
)
plt.xlim([-6, 6])
plt.ylim([-6, 6])
plt.xlabel("target 1")
plt.ylabel("target 2")
plt.title("Multi-output Decision Tree Regression")
plt.legend(loc="best")
plt.show()

Code例: 根据脸的上半部分预测下半部分

import numpy as np
import matplotlib.pyplot as pltfrom sklearn.datasets import fetch_olivetti_faces
from sklearn.utils.validation import check_random_statefrom sklearn.ensemble import ExtraTreesRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import RidgeCV# Load the faces datasets
data, targets = fetch_olivetti_faces(return_X_y=True)train = data[targets < 30]
test = data[targets >= 30]  # Test on independent people# Test on a subset of people
n_faces = 5
rng = check_random_state(4)
face_ids = rng.randint(test.shape[0], size=(n_faces,))
test = test[face_ids, :]n_pixels = data.shape[1]
# Upper half of the faces
X_train = train[:, : (n_pixels + 1) // 2]
# Lower half of the faces
y_train = train[:, n_pixels // 2 :]
X_test = test[:, : (n_pixels + 1) // 2]
y_test = test[:, n_pixels // 2 :]# Fit estimators
ESTIMATORS = {"Extra trees": ExtraTreesRegressor(n_estimators=10, max_features=32, random_state=0),"K-nn": KNeighborsRegressor(),"Linear regression": LinearRegression(),"Ridge": RidgeCV(),
}y_test_predict = dict()
for name, estimator in ESTIMATORS.items():estimator.fit(X_train, y_train)y_test_predict[name] = estimator.predict(X_test)# Plot the completed faces
image_shape = (64, 64)n_cols = 1 + len(ESTIMATORS)
plt.figure(figsize=(2.0 * n_cols, 2.26 * n_faces))
plt.suptitle("Face completion with multi-output estimators", size=16)for i in range(n_faces):true_face = np.hstack((X_test[i], y_test[i]))if i:sub = plt.subplot(n_faces, n_cols, i * n_cols + 1)else:sub = plt.subplot(n_faces, n_cols, i * n_cols + 1, title="true faces")sub.axis("off")sub.imshow(true_face.reshape(image_shape), cmap=plt.cm.gray, interpolation="nearest")for j, est in enumerate(sorted(ESTIMATORS)):completed_face = np.hstack((X_test[i], y_test_predict[est][i]))if i:sub = plt.subplot(n_faces, n_cols, i * n_cols + 2 + j)else:sub = plt.subplot(n_faces, n_cols, i * n_cols + 2 + j, title=est)sub.axis("off")sub.imshow(completed_face.reshape(image_shape),cmap=plt.cm.gray,interpolation="nearest",)plt.show()

输入X是面的上半部分的像素,并且输出Y是这些面的下半部分的像素。

论文:M. Dumont et al, Fast multi-class image annotation with random subwindows and multiple output randomized trees, International Conference on Computer Vision Theory and Applications 2009

决策树 使用技巧

1、合适的样本比例和特征数量。

  • 高维空间、少量样本很容易过拟合

2、事先进行降维(PCA, ICA)
3、使用 max_depth=3 作为初始树深度,让决策树知道如何适应您的数据,然后再增加树的深度。

4、使用 max_depth 来控制输的大小防止过拟合。

5、尝试 min_samples_leaf=5 作为初始值。如果样本的变化量很大,可以使用浮点数作为这两个参数中的百分比。两者之间的主要区别在于 min_samples_leaf 保证叶结点中最少的采样数,而 min_samples_split 可以创建任意小的叶子,尽管在文献中 min_samples_split 更常见。

  • 通过使用 min_samples_split 和 min_samples_leaf 来控制叶节点上的样本数量。

6、训练之前平衡数据集

7、如果输入的矩阵X为稀疏矩阵,建议您在调用fit之前将矩阵X转换为稀疏的csc_matrix ,在调用predict之前将 csr_matrix 稀疏。当特征在大多数样本中具有零值时,与密集矩阵相比,稀疏矩阵输入的训练时间可以快几个数量级。

决策树算法: ID3,C4.5,C5.0,CART

1、ID3(Iterative Dichotomiser 3)由 Ross Quinlan 在1986年提出。该算法创建一个多路树,找到每个节点(即以贪心的方式)分类特征,这将产生分类目标的最大信息增益。决策树发展到其最大尺寸,然后通常利用剪枝来提高树对未知数据的泛化能力。
4、CART 使用在每个节点产生最大信息增益的特征和阈值来构造二叉树。

scikit-learn 使用 CART 算法的优化版本。

后剪枝一些参考资料

#《机器学习》_周志华(西瓜书)南瓜书_第4章 决策树相关推荐

  1. 《机器学习》(周志华)西瓜书读书笔记

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 第1章 绪论 第2章 模型评估与选择 第3章 线性模型 第4章 决策树 第5章 神经网络 第6章 神经网络 第7章 贝 ...

  2. #《机器学习》_周志华(西瓜书)南瓜书_第6章 支持向量机

    待做: P134-P139理论部分 整理习题,补充 问题: 1.距离计算 2.线性核和高斯核? 第6章 支持向量机 6.1 间隔与支持向量 基于训练集DDD在样本空间中找到一个划分超平面. 对训练样本 ...

  3. 《机器学习》周志华(西瓜书)学习笔记 第十一章 特征选择与稀疏学习

    机器学习 总目录 第十一章 特征选择与稀疏学习 11.1 子集搜索与评价 给定属性集,其中有些属性可能很关键.很有用,另一些 属性则可能没什么用.我们将属性称为"特征" (feat ...

  4. 机器学习_周志华(西瓜书) 课后习题答案 第一章 Chapter1

    机器学习_周志华 课后习题答案 第一章 Chapter1 习题1.1 Q:表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间. 由所给出的数据集(训练集)可知,属性3个:色泽.根蒂.敲声, ...

  5. 周志华西瓜书《机器学习》习题提示——第2章

    2.1:分层采样, [ ( 500 500 × 70 % ) ] 2 \left[ \binom{500}{500\times 70\%} \right]^2 [(500×70%500​)]2 2.2 ...

  6. 机器学习(周志华)西瓜书 课后习题4.3 信息熵决策树算法——python实现(包括树的可视化)

    机器学习(周志华)西瓜书 课后习题4.3 信息熵决策树算法--python实现(包括树的可视化) 算法原理 1.信息熵 2.信息增益 我们所以要做的就是不断地从当前剩余的属性当中选取最佳属性对样本集进 ...

  7. 机器学习_周志华_问题汇总_第2周

    问题 Q1 如果我想分析一下文本分类错误的原因,应该从哪些方面入手? 可以去分析一下哪个类别错误率高,然后看看这个类别的是否不平衡,针对这个类别看看能不能进行改进. 还有就是数据量过少,或是数据质量较 ...

  8. 周志华西瓜书课后习题答案总目录

    https://blog.csdn.net/icefire_tyh/article/details/52064910 机器学习(周志华西瓜书)参考答案总目录 从刚开始学习机器学习到现在也有几个月了,期 ...

  9. 周志华西瓜书学习笔记(一)

    周志华西瓜书学习笔记 第一章 绪论 数据处理分为三个阶段:收集,分析,预测. 一.基本概念 机器学习致力于研究如何通过计算的手段,利用经验来改善系统自身的性能. Mitchell给出的更形式化的定义为 ...

  10. 周志华西瓜书3.4题——用十折交叉验证法和留一法估计对率回归的误差

    周志华西瓜书3.4题. 本文所编写的代码均使用python3.7进行调试,依靠的sklearn进行的实验. 第一步,导入iris数据集,数据集使用sklearn包里面自带的. from sklearn ...

最新文章

  1. 一个风格诡异的ABAP学习网站
  2. 使用 WeihanLi.Npoi 操作 CSV
  3. Visual Studio 2017 15.3 预览版发布,接近最终版
  4. 完美解决HALCON C#编程目标平台冲突问题
  5. JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)
  6. QComboBox代理
  7. 通过减小Bootstrapping Error Reduction来进行离线RL学习
  8. 印度文明的继承和交溶
  9. 总价+激励合同(FPIF)的计算,与CPIF的区别
  10. 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。它们在电文中出现的频度分别为
  11. park停车场项目实战
  12. 2. web前端开发分享-css,js进阶篇
  13. Yocto新增一个hello程序
  14. android 来电解锁,带你解锁手机隐藏黑科技,极少人知道!
  15. 压缩包密码如何加密解密
  16. 一牛网:PCB layout设计培训:免费试听,可预约报名
  17. web前端-前端三剑客之JavaScript
  18. 已知空间中的三点 求三角形面积_三角形的面积公式八叙
  19. Mindjet MindManager 2021思维导图Keygen教程分享
  20. oracle--day2(单值函数(字符函数,日期函数,转换函数,数字函数),日期格式(yyyy,mm等含义),表示一个日期数据的4种方式,多表查询(连接查询(等值连接,不等值连接,外连接,自连接))

热门文章

  1. win10远程桌面Android软件,Microsoft发布了适用于Android的远程桌面应用程序10.0.7版的重大更新...
  2. java编程简单网络_Java网络编程之使用Socket搭建一个简易聊天室
  3. php电脑维修店网站源码,某电脑维修网站整站打包 v1.1
  4. 完整版商城PHP源码小程序,前后端+后台+小程序;访问地址在文末
  5. matlab altera视频,Altera.FPGA入门及提高视频教程
  6. Cadence Orcad Capture导出网表的方法图文教程及视频演示
  7. c语言程序由哪三个部分组成部分,C语言程序的组成部分
  8. 那些年-SAP固定资产导入AS91 OASV
  9. 一些有用的书签网站整理
  10. c语言黑色方块字符,打字符号,一个黑的方块怎么打?