一、原理
1.决策树(decision tree):本质上是一种通过一系列规则对数据进行分类的分类模型,采用树行(如二叉树…)结构,使用层层推理(基于if-then-else的监督学习算法)来来实现最终的分类。其基本结构由以下元素构成:
2.优缺点
主要优点:具有很好的解释性,模型可以生成可以理解的规则。可以发现特征的重要程度。模型的计算复杂度较低。
主要缺点:模型容易过拟合,需要采用减枝技术处理。不能很好利用连续型特征。预测能力有限,无法达到其他强监督模型效果。方差较高,数据分布的轻微改变很容易造成树结构完全不同。
3.决策树学习的步骤:特征选择➡决策树生成➡决策剪枝
特征选择:特征选择决定了使用哪些特征来做判断。在训练数据集中,每个样本的属性可能有很多个,不同属性的作用有大有小。因而特征选择的作用就是筛选出跟分类结果相关性较高的特征,也就是分类能力较强的特征。
决策树生成:选择好特征后,就从根节点触发,对节点计算所有特征的信息增益,选择信息增益最大的特征作为节点特征,根据该特征的不同取值建立子节点;对每个子节点使用相同的方式生成新的子节点,直到信息增益很小或者没有特征可以选择为止。
决策树剪枝:剪枝的主要目的是对抗过拟合,通过主动去掉部分分支来降低过拟合的风险。
4.决策树构建的伪代码
决策树的构建过程是一个递归过程。函数存在三种返回状态:(1)当前节点包含的样本全部属于同一类别,无需继续划分;(2)当前属性集为空或者所有样本在某个属性上的取值相同,无法继续划分;(3)当前节点包含的样本集合为空,无法划分。
其中,划分选择sklearn提供了两种:信息增益和基尼(gini)指数。
信息熵(entropy)是一种衡量数据混乱程度的指标,信息熵越小,则数据的“纯度”越高。一般信息增益越大,则意味着使用某一个特征来进行划分的效果越好。信息熵相比基尼系数,对不纯度更加敏感,对不纯度的惩罚更强,但信息熵对于高维数据或者噪音很多的数据容易过拟合。
信息增益=父节点的信息熵-子节点的信息熵
基尼指数∈(0,1),反映了从数据集D中随机抽取两个的类别标记不一致的概率。基尼指数的计算不涉及对数,因此比信息熵的计算相对快一些。
在实际应用中,信息熵和基尼系数的效果基本相同。
二、实战
2.1 demo实践
2.1.1源码
## 基础函数库
import numpy as np
## 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns
## 导入决策树模型函数
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
##Demo演示LogisticRegression分类
## 构造数据集
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)
## 可视化构造的数据样本点
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()
## 本段代码实际效果为本地生成PDF可视化文档,在体验过程中可以不运行,可能无法正常展示结果;
## 代码生成的可视化结果会截图展示实际效果
#!pip install graphviz
import graphviz
feature_name =['特征1','特征2']
dot_data = tree.export_graphviz(tree_clf
# , feature_names=feature_name
,out_file=None)#将生成的决策树导出为dot格式,画图专用
graph = graphviz.Source(dot_data)
# graph.render("pengunis")
# 'pengunis.pdf'
## 创建新样本
x_fearures_new1 = np.array([[0, -1]])<