决策树算法简介
1 概念
决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。
决策树:
怎么理解这句话?通过一个对话例子:
“闺女,我又给你找了个合适的对象,今天要不要见一面?”
“多大? ” “26岁。”
“长得帅吗? ” “还可以,不算太帅。”
“工资高么? ” “略高于平均水平。”
“会写代码吗? ” “人家是程序员,代码写得棒着呢!”
“好,那把他联系方式发来吧,我抽空见一面。”
上述图右侧部分,女儿最多通过四次判断,就可以得到答案,这时称我们的决策树的depth(深度)为3
概念:
- 是一种树形结构,本质是一颗由多个判断节点组成的树
- 其中每个内部节点表示一个属性上的判断,
- 每个分支代表一个判断结果的输出,
- 最后每个叶节点代表一种分类结果。
2 通过sklearn实现决策树分类并进一步认识决策树
-
基于鸢尾花数据绘制图像
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris # 加载数据集 iris = load_iris() # 获取特征值和目标值 X = iris.data[:,2:] y = iris.target # 绘制图形展示效果,一共三种类别 plt.scatter(X[y==0,0],X[y==0,1]) plt.scatter(X[y==1,0],X[y==1,1]) plt.scatter(X[y==2,0],X[y==2,1]) plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMFqa560-1633692938055)(./images/1.png)]
-
训练决策树模型
from sklearn.tree import DecisionTreeClassifier # 实例化分类器 tree = DecisionTreeClassifier(max_depth=2,criterion="gini") # 训练模型 tree.fit(X,y) """ DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='entropy', max_depth=2, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best') """
-
依据模型绘制决策树的决策边界
#找到模型的决策边界,并绘制图像(此方法所用到的api不需要掌握,能够调用就行) def plot_decision_boundary(model,axis): x0,x1 = np.meshgrid( np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1), np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1) ) X_new = np.c_[x0.ravel(),x1.ravel()] y_predict = model.predict(X_new) zz = y_predict.reshape(x0.shape) from matplotlib.colors import ListedColormap custom_map = ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"]) plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map) plot_decision_boundary(tree,axis=[0.5,7.5,0,3]) plt.scatter(X[y==0,0],X[y==0,1]) plt.scatter(X[y==1,0],X[y==1,1]) plt.scatter(X[y==2,0],X[y==2,1]) plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qBmJp7PM-1633692938056)(./images/13.png)]
通过上述分析可知:
- 决策树是非参数学习算法
- 决策树可以解决分类问题
- 决策树天然可以解决多分类问题
- 决策树可以解决回归问题:落在叶子节点(对应图中的A、B、C三点)的数据的平均值作为回归的结果
- 决策树可以应用于信用卡评级的案例中,生成相应的分类规则。
4.2 特征选择
学习目标
- 知道如何选择特征构建决策树
- 知道信息熵、信息增益、信息增益比
1 特征选择问题
特征选择在于选取对于训练数据具有分类能力的特征,这样可以提高决策树学习的效率。如果使用一个特征进行分类的结果与随机分类的结果没有很大差别,则该特征没有分类能力。扔掉这个特征对决策树学习的精度影响不大。特征选择就是决定用哪个特征来对数据集进行划分。
2 熵
-
定义
- 熵在信息论中代表随机变量不确定度的度量。
- 熵越大,数据的不确定性度越高
- 熵越小,数据的不确定性越低
-
公式
H = − ∑ i = 1 k p i log ( p i ) \large H = -\sum_{i=1}^{k}p_i\log(p_i) H=−i=1∑kpilog(pi)-
例子1:假如有三个类别,分别占比为:{1/3,1/3,1/3},信息熵计算结果为:
H = − 1 3 log ( 1 3 ) − 1 3 log ( 1 3 ) − 1 3 log ( 1 3 ) = 1.0986 H=-\frac{1}{3}\log(\frac{1}{3})-\frac{1}{3}\log(\frac{1}{3})-\frac{1}{3}\log(\frac{1}{3})=1.0986 H=−31log(31)−31log(31)−31log(31)=1.0986
-
例子2:假如有三个类别,分别占比为:{1/10,2/10,7/10},信息熵计算结果为:
H = − 1 10 log ( 1 10 ) − 2 10 log ( 2 10 ) − 7 10 log ( 7 10 ) = 0.8018 H=-\frac{1}{10}\log(\frac{1}{10})-\frac{2}{10}\log(\frac{2}{10})-\frac{7}{10}\log(\frac{7}{10})=0.8018 H=−101log(101)−102log(102)−107log(107)=0.8018
熵越大,表示整个系统不确定性越大,越随机,反之确定性越强。
-
例子3:假如有三个类别,分别占比为:{1,0,0},信息熵计算结果为:
H = − 1 log ( 1 ) = 0 H=-1\log(1)=0 H=−1log(1)=0
-
-
公式的转换
当数据类别只有两类的情况下,公式可以做如下转换
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲\large H &= -\s…-
代码角度理解信息熵的概念
import numpy as np import matplotlib.pyplot as plt def entropy(p): return -p*np.log(p)-(1-p)*np.log(1-p) x = np.linspace(0.01,0.99,200) plt.plot(x,entropy(x)) plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdZrzare-1633692938058)(./images/6.png)]
观察上图可以得出,当我们的系统每一个类别是等概率的时候(x轴值等于0.5),系统的信息熵最高,当系统偏向于某一列,相当于系统有了一定程度的确定性,直到系统整体百分之百的都到某一类中,此时信息熵就达到了最低值,即为0。上述结论也可以拓展到多类别的情况。
-
3 信息增益
-
定义
特征 A A A对训练数据集D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合 D D D的经验熵 H ( D ) H(D) H(D)与特征A给定条件下D的经验熵 H ( D ∣ A ) H(D|A) H(D∣A)之差。即
g ( D , A ) = H ( D ) − H ( D ∣ A ) \large g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A) -
根据信息增益选择特征方法是:对训练数据集D,计算其每个特征的信息增益,并比较它们的大小,并选择信息增益最大的特征进行划分。表示由于特征 A A A而使得对数据D的分类不确定性减少的程度。
-
算法:
设训练数据集为D, ∣ D ∣ \mid D\mid ∣D∣表示其样本个数。设有 K K K个类 C k C_k Ck, k = 1 , 2 , ⋯ , K k=1,2,\cdots,K k=1,2,⋯,K, ∣ C k ∣ \mid C_k\mid ∣Ck∣为属于类 C k C_k Ck的样本个数, ∑ k = 1 K = ∣ D ∣ \sum\limits_{k=1}^{K}=\mid{D}\mid k=1∑K=∣