决策树(三)—— CART算法
发布日期:2021-05-07 13:47:46 浏览次数:20 分类:原创文章

本文共 1667 字,大约阅读时间需要 5 分钟。

CART算法

基尼系数

信息熵可以用来衡量某事的不确定性,还有一个指标叫做基尼系数,也可以用来衡量不确定性。
G i n i = 1 − ∑ i K p i 2 Gini = 1-\sum_i^Kp_i^2 Gini=1iKpi2
K代表类别,p代表概率。

拿投硬币来说,如果是正常的硬币,那么正反两面的概率都是二分之一。如果硬币做了手脚,使得正面的概率变为0.8,那么可以说对于投一次硬币这件事而言,它的不确定性变小了。

我们算一下这两件事的基尼系数:

1 − 0. 5 2 − 0. 5 2 = 0.5 1-0.5^2-0.5^2=0.5 10.520.52=0.5

1 − 0. 8 2 − 0. 2 2 = 0.32 1-0.8^2-0.2^2=0.32 10.820.22=0.32

可以看出一件事的不确定越小,它的基尼系数越小,在这一点上和信息熵是相同的。

如果对于只有两个类别的话,设其中一件事的概率为p,我们可以算出:
H ( X ) = − ∑ i K p i l o g 2 p i = − p l o g 2 p − ( 1 − p ) l o g 2 ( 1 − p ) H(X)=-\sum_i^Kp_ilog_2p_i=-plog_2p-(1-p)log_2(1-p) H(X)=iKpilog2pi=plog2p(1p)log2(1p)

G i n i ( X ) = 1 − ∑ i K p i 2 = 1 − p 2 − ( 1 − p ) 2 = − 2 p 2 + 2 p Gini(X)=1-\sum_i^Kp_i^2=1-p^2-(1-p)^2=-2p^2+2p Gini(X)=1iKpi2=1p2(1p)2=2p2+2p

我们用matplotlib画一下这两个曲线的图:

import numpy as npimport matplotlib.pyplot as pltp = np.linspace(0,1)gini = 2*p*(1-p)entropy = -(1-p)*np.log2(1-p)-p*np.log2(p)plt.plot(p,gini,'r',label='gini')plt.plot(p,entropy,'b',label='entropy')plt.legend()plt.show()

在这里插入图片描述
可以看到走势完全一样,这也就是为什么可以用基尼系数代替信息熵了。

CART

CART要求是二叉树,我们可以把每个特征的类别转化为是和否判断的新的特征就行了。

对于每一个特征,计算其基尼系数,这里就和条件概率差不多,和前面的条件熵基本一样。

已知特征Y(只有两个类别,概率为p1,p2),则结果X的基尼指数就是:
G i n i ( X , Y ) = p 1 G i n i 1 + p 2 G i n i 2 Gini(X,Y)=p_1Gini_1+p_2Gini_2 Gini(X,Y)=p1Gini1+p2Gini2

然后我们对每一个特征下结果的基尼系数进行排序,从小到大,把最小的也就是使得不确定性性最小的那个特征作为第一个。

自此数据被分成了两边,然后对于左右子树分别再进行CART算法直至完成整棵树。

sklearn的实现

sklearn默认就是使用CART完成决策树,代码如下:

from sklearn import treeimport numpy as np# 读数据data = np.genfromtxt('../data/cart.csv',delimiter=',')x_data = data[1:,1:-1]y_data = data[1:,-1]# 构建模型model = tree.DecisionTreeClassifier()model.fit(x_data,y_data)# 看下结果print('实际值:',y_data)print('预测值:',model.predict(x_data))

在这里插入图片描述

上一篇:leetcode做题记录0010
下一篇:决策树(二)—— ID3和C4.5

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月23日 06时02分17秒