1、概念
决策树是一种常见的机器学习方法,可以解决分类问题(二分类、多分类)、回归问题
一般的,一棵树包含一个根节点,若干个内部节点、叶子节点,每一个叶子节点代表决策的结果,从根节点到每个叶子节点的路径对应了一条判定的策略。
树的生成过程就是决策过程,这个过程是递归的,出现以下三种情况后递归会结束:
1)当前节点的样本属于同一个类别
2)当前节点样本集为空
3)当前节点属性集为空或所有样本在属性上取值相同
2、划分选择
了解了决策树的概念之后,我们希望决策树在每个节点的样本尽可能的属于同一类,即纯度越高,那么有人会问,我们要选哪个属性怎么划分才最合适呢?
这里主要有三种方法:
1)信息增益(ID3算法)
2)信息增益率(C4.5算法)
3)gini系数(CATR树算法)
3、信息增益
1)信息量
首先介绍一个概念,信息量:是对信息的度量。
信息量与随机事件的概率负相关,比较确定发生的事包含的信息量就较少,比如太阳从东边升起这是肯定的事,那么它所产生的信息量就比较少,又或者你告诉别人一件他已经知道的事,那么这件事包含的信息量就比较小了。
接下来我们看一下信息量与概率的具体关系是怎样的。
2)信息熵
信息量是具体发生的事件带来的信息,而信息熵则是在事件发生之前对可能产生的信息量的期望,即考虑随机事件所有出现情况的发生概率。
可能有的人还不是很理解为什么信息熵越小,纯度越高,下面我们就给出一个例子理解一下。
我们假设有1000个样本,这些样本有2种类别,现对两类别给出不同的划分,对比一下信息熵
# 制造一组样本数据
import numpy as np
D = 1000 # 假设有1000个样本
Dpair = [(100,900),(150,850),(200,800),(250,750),(300,700),(350,650),(400,600),(450,550),(500,500)] # 样本类别为2
ent = [];X = [];Y = []
for a in Dpair:
print(a)
x,y = a
X.append(x)
Y.append(y)
px = x/D
py = y/D
enti = -(px*np.log2(px)+py*np.log2(py))
ent.append(round(enti,3))
# 绘图
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot(X,Y,ent,label='parametric curve',marker = "o")
# 添加轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('ent')
# 添加标签值
for i in range(len(Dpair)):
ax.text(X[i],Y[i],ent[i],(X[i],Y[i],ent[i]),fontsize=6)
由上图可以看出,如果两个类别的样本量为100、900时,纯度最高,信息熵是最小的0.469,而当两个样本量为500、500时,两个类别很难区分,此时信息熵最大为1。
因此信息熵越小,纯度越高。
3)信息增益
信息熵:随机变量的不确定性
条件熵:一定条件下,随机变量的不确定性
信息增益=信息熵-条件熵,一定条件下,随机变量的不确定性减少程度
我们当然希望不确定性减少程度越大越好,也就是不确定性强的事件变得更确定(纯度更高),即信息增益越大越好。
信息增益越大,意味着使用属性a来进行划分所获得的纯度提升越大,因此我们可以使用信息增益来进行决策树的划分属性选择。