今日请允许我直奔主题吧!
决策树:从训练集中学习得出一个树状结构的模型。决策树属于判别模型
分类决策树模型是一种描述对实例进行分类的树形结构。
在做决策树的时候,一般会经历两个阶段:构造和剪枝。
那么构造树就是生成一颗完整的决策树,也就是说,构造的过程中选择上面数学作为节点;在此过程中存在有三种节点,分别是根节点(代表测试条件)、内部节点(代表测试结果)和叶节点(代表分类后的分类标记);内部节点表示一个特征或属性,叶节点表示一个类。决策树的决策过程就是从根节点开始的,测试待分类项中对应的特征属性,并按照其值选择输出分支,直到叶节点,将叶节点的存放的类别作为决策结果。
另外,决策树还表示给定特征条件下类的条件概率分布。所选择的条件概率模型不仅对训练数据有很好的拟合,而且对位置数据有很好的预测。
由此,在构造树时会遇到几个问题:
1.选择哪个属性作为根节点和内部节点
2.选择那些属性作为叶节点
3.什么时候停止并且得到我们所需的决策树
其中,则需要引入信息熵。由于决策树是一种树状结构,通过做出一系列选择来对数据进行划分,以下便是特征选择的依据。(特征选择的度量是关键)
接下来就来了解信息熵的相关知识
一、信息熵就是表示随机变量不确定性的度量。(这里提示:需要有概率论的功底)
这可能还是有点难理解,确实!按我个人更好地去理解其实就是混乱程度,即是混乱那就要分类了吧(我知道这里很勉强的跟分类扯上关系,原谅小白我的不易,别喷!)前面讲到概率论,其实分类又是根据什么的呢?那请按概率论来划分不就好了,如概率为1的就不用划分分类。再者信息熵的定义是不确定性,那就是随机变量不确定出现的概率。
以上可知,概率越大,说明混乱程度越低,熵值也越低。(此处的公式是求概率的公式)
二、信息增益是表示某特征使得某个类的不确定性减少的程度
信息增益是使用划分几个特征熵的差值来衡量当前某个特征对于样本划分效果的好坏
定义:特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差。
公式:g(D,A) = H(D) - H(D|A)
信息增益也是选择哪个特征作为根节点的依据。所以,特征选择的准则是信息增益或信息增益率。
其计算过程如下:
1.计算初始熵值
2.计算各特征的熵值
3.进行求差得到信息增益
4.选择信息增益较大的。因为信息增益大的特征具有更强的分类能力。
其中ID3算法就是通过信息增益来获取决策树的。
三、信息增益率 = 信息增益 / 属性的熵值 (C4.5便用到了信息增益率,此处不做详细笔记,请谅解!)
四、基尼系数
这里的算法是CART算法,它既是分类树也是回归树,在属性选择的衡量指标是基尼系数。
基尼系数越小,说明样本之间的差异小,不确定程度越低
那么,基尼系数构建决策树时需要的计算:
1.计算初始基尼系数
2.分别计算各特征的基尼系数
3.做差计算基尼系数的增益
有关CART算法的内容:
1.对回归树用平方误差(即均方差)最小化准则
2.对分类树用基尼系数最小化准则
由此进行特征选择,生成二叉树。
五、剪枝
做最后的一点点介绍。
剪枝,说白了就是叶子太多了需要修剪呗。这么做其实也是有原因的,就是为了防止过拟合的现象发生。那在什么时候才会出现过拟合呢?当决策树对训练数据的分类很明确,但对位置的测试数据的分类却没有那么明确,即出现过拟合现象。过拟合的原因就是在于学习时过多地提高训练数据的正确分类而构造出更复杂的决策树。此时则需要剪枝了。
剪枝有两种常用的方法:1.预剪枝 2.后剪枝
相信很多人都和我一样喜欢后剪枝的吧,为什么呢?大概都是因为先‘肝’了再说吧!在过拟合现象还没确定是否会发生时,应该先把整颗决策树构造完了再根据具体情况考虑是否要进行剪枝操作。
最后,以上对决策树的读解尚有不足,还望广大友友们海涵,多多指教!一起学习,一起进步,一起奔流!
代码来源于《人工智能数学基础与Python机器学习实战》
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
N = 400
x = np.random.rand(N) * 4 * np.pi # [-4,4)
x.sort()
y1 = 16 * np.sin(x) ** 3 + np.random.randn(N) * 0.5
y2 = 13 * np.cos(x) - 5 * np.cos(2 * x) - 2 * np.cos(3 * x) - np.cos(4 * x) + np.random.randn(N) * 0.5
np.set_printoptions(suppress=True)
y = np.vstack((y1, y2)).T
# 转置后,得到N个样本,每个样本都是1维的
x = x.reshape(-1, 1)
deep = 8
# 回归树一般指定MSE作为评价
dt = DecisionTreeRegressor(criterion='mse', max_depth=deep)
# dt = RandomForestRegressor(n_estimators=100, criterion='mse', max_depth=2)
dt.fit(x, y)
x_test = np.linspace(x.min(), x.max(), num=1000).reshape(-1, 1)
print(x_test)
y_hat = dt.predict(x_test)
print(y_hat)
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.figure(facecolor='w')
plt.scatter(y[:, 0], y[:, 1], c='r', marker='s', edgecolor='k', s=60, label='真实值', alpha=0.8)
plt.scatter(y_hat[:, 0], y_hat[:, 1], c='g', marker='o', edgecolor='k', edgecolors='g', s=30, label='预测值', alpha=0.8)
plt.legend(loc='lower left', fancybox=True, fontsize=12)
plt.xlabel('$Y_1$', fontsize=12)
plt.ylabel('$Y_2$', fontsize=12)
plt.grid(b=True, ls=':', color='#606060')
plt.title('决策树多标签回归', fontsize=15)
plt.show()
第三章-线性模型
http://t.csdn.cn/4S6Y6http://t.csdn.cn/4S6Y6第五章-神经网络
http://t.csdn.cn/DdirShttp://t.csdn.cn/DdirS第六章-支持向量机
http://t.csdn.cn/yItchhttp://t.csdn.cn/yItch参考资料:
1.《人工智能数学基础与Python机器学习实战》(纸质版)
2.周志华--《机器学习》
3.李航--《统计学习方法》