决策树算法

共 2864字,需浏览 6分钟

 ·

2020-07-03 23:26

转自:Alrange公众号

你可能做过这样的选择:


选择考研学校时,如果这是一个普通学校,你不会选择该学校。

但如果这是一个好的一本学校,你选择继续了解它。

并且如果它地理位置不错,在你喜欢的城市,你选择继续了解它。

并且如果你选择的专业在该校很出名,你选择继续了解它。

接下来你发现你的能力水平也可以到达这个目标,那么你直接选择报考它。

相反,如果你的能力水平不能达到,那么你不会选择该学校。


把你上面的一系列决策分支画下来,就形成了一颗下面的决策树。


e5119a486667e1264de71b8c8f19ddf2.webp


这样的决策思路可以用到我们的机器学习中的分类来,这个算法就叫作决策树。


本文涉及到的内容:
1、什么是决策树
2、决策树的三种算法
3、决策树的实例应用
4、决策树的算法补充



决策树(Decision Tree)


什么是决策树


原理


假设现在有两类物体,他们各有两种特征,投影到二维空间上后,如下图所示:


ceac3ff73b14d995a6123c83a8332a24.webp


我们想要在几次操作后把两种种类分开来,于是就有了下面的划分方法。


469eb15e245c4cb2fb38b297a0ae0f2c.webp



8ce1bda14022cd7030df4688b406cec3.webp


可以看到,这样的划分方法实质是利用训练集构造了这样的决策树,之后这个决策树可以用于分类测试的样例。


概念


决策树是最经常被使用于分类问题的监督学习算法,并且可以用于类别型特征和连续型特征。


一个决策树它的每个分支节点都代表在一些不同选择中的一个选择,并且每一个叶子都代表最终的一个决策。


构造这个决策树会用到许多不同的算法,将会从这些历史数据中建立一个决策树,并且这个生成的决策树可以分类未来遇到的样例。


那么树的构造算法有哪些呢?结点是如何分裂的呢?


算法介绍


ID3


它的基本思想是采用从顶向下的贪心算法,以信息增益为准则来产生结点。

我们先来了解两个公式:


①熵


熵在机器学习中的意义和在热力学中的意义相同,是测量随机性的方法。

在这里我们用它来表示样本集合的纯度,公式如下。


4e5d3f3dc8553cd88d6d52bfaa20e811.webp


其中,pk是第k类样本在样本集合D中所占的比例。|y|是样本的类别个数。


②信息增益


为属性a对样本集D进行划分后所获得的“信息增益”。信息增益表示得知属性A的信息而使得样本集合不确定度减少的程度,公式如下。


67b18a8e20ad0872cfd4f93913fcf5b6.webp

V是离散属性a可能取值的个数。带标号v的D是D中属性值a=v的样本集合。


选择最优属性就是是它可以给出最大的信息增益。


明白了这两个概念之后,我们就可以来看构造树的步骤。


③步骤


1、计算数据集的熵。(即根节点的信息熵)
2、对每一个属性/特征:
①计算所有分类值的熵。②对该属性取一个平均信息熵。③计算该属性的信息增益。
3、选择具有最高的信息增益的属性作为下一个树节点。
4、重复以上操作直到我们得到期望的树。


C4.5


可以发现,如果一个属性的取值数目较多的话,它信息增益也会相应的变大,那么就会每次分裂使偏向选择取值数目多的属性,为了避免这种情况,接下来讲到的C4.5算法,对ID3做了改进。


此算法的思想是用信息增益除以一个属性的固有值,可以一定程度地避免选择分类多的属性,漏掉了一些好的特征。


首先看信息增益率的公式:


5613bf95c409e24d39bd1e8d14ddf444.webp


IV(a)的公式,即属性a的一个固有值:


3bb4a1ef3018f3bc18d50811b7b5936b.webp


由公式可以反映出,当选取该属性,该属性的可取值数越大,IV(a)就越大。


但是C4.5算法不直接选择增益率最大的候选划分属性,它会在候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的,原因是避免选择属性取值数目小的属性。


CART算法


CART是一颗二叉树,它可以是分类树也可以是回归树。


采用GINI值作为节点分裂的依据.。


GINI值的计算公式:

6db9f9e97cfda691319c66b5d6acf985.webp

cabd54bfd9240d2c179833054bf0645c.webp


我们在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性。


实例


我们调用sklearn里面的决策树方法来预测用户是否购买汽车的意愿。


数据的预处理在之前的文章内容提到过,没看过的同学可以戳文末的链接~


那么直接调用决策树分类器:


1from sklearn.tree import DecisionTreeClassifier
2classifier = DecisionTreeClassifier(criterion = 'gini',max_depth=3)#这里设置划分准则为gini,树的最大深度是3.
3classifier.fit(X_train, y_train)
4y_pred = classifier1.predict(X_test)


接下来用混淆矩阵查看预测结果:


1from sklearn.metrics import confusion_matrix
2cm = confusion_matrix(y_test, y_pred)
3cm


b0afe0f74541dfb5042161c6ded3cf16.webp

我们还可以可视化结果,来查看决策树的决策边界:


 1from matplotlib.colors import ListedColormap
2X_set, y_set = X_test, y_test
3X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
4                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
5plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
6             alpha = 0.75, cmap = ListedColormap(('red''green')))#画出决策树的决策边界
7plt.xlim(X1.min(), X1.max())#设置坐标范围
8plt.ylim(X2.min(), X2.max())
9for i, j in enumerate(np.unique(y_set)):#将测试集以散点形式画出
10    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
11                c = ListedColormap(('red''green'))(i), label = j)
12plt.title('Decision Tree Classification (Test set)')#设置标题
13plt.xlabel('Age')
14plt.ylabel('Estimated Salary')
15plt.legend()
16plt.show()


2f04612d2b36e8cd21e508ec352da0db.webp


决策树算法步骤


这里补充了一个内容,是较为详细的决策树的基本算法,它采用递归调用的方法,算法中共有三次返回(Return)的情况。


1ce98ecaaf2ac6b8923be2cf4a5db1fa.webp

感兴趣的同学可以阅读。


参考资料:

https://github.com/Avik-Jain/100-Days-Of-ML-Code

机器学习——周志华


浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报