编程语言
首页 > 编程语言> > Python与机器学习——决策树

Python与机器学习——决策树

作者:互联网

决策树

理论基础

决策树是建立在信息论的基础上的,决策树的生成就是让数据的"不确定性"减少越多越好,意味着划分能获得越多的信息。信息的不确定性可以用信息熵和基尼指数来描述。

信息熵

信息熵的定义其实也比较简单:
H(y)=k=1Kpklogpk(信息熵公式)H(y)=\sum_{k=1}^Kp_k\log p_k\tag{信息熵公式}H(y)=k=1∑K​pk​logpk​(信息熵公式)对于具体的、随机变量来说,生成的数据集D={y1,...,yN}D=\{y_1,...,y_N\}D={y1​,...,yN​},在实际计算信息熵可以用
H(y)=H(D)=k=1KCkDlogCkD(信息熵公式2)H(y)=H(D)=-\sum_{k=1}^K\frac{|C_k|}{|D|}\log \frac{|C_k|}{|D|}\tag{信息熵公式2}H(y)=H(D)=−k=1∑K​∣D∣∣Ck​∣​log∣D∣∣Ck​∣​(信息熵公式2)也就是假设y的取值空间为{c1,...,cK}\{c_1,...,c_K\}{c1​,...,cK​},pkp_kpk​表示y取ckc_kck​的概率:pk=p(y=ck)p_k=p(y=c_k)pk​=p(y=ck​),Ck|C_k|∣Ck​∣表示y取ckc_kck​的样本个数,D|D|∣D∣表示总样本个数,CkD\frac{|C_k|}{|D|}∣D∣∣Ck​∣​表示的就是频率,使用了"频率估计概率"。
p1=p2=...=pK=1Kp_1=p_2=...=p_K=\frac{1}{K}p1​=p2​=...=pK​=K1​时候,H(y)H(y)H(y)达到了最大值log1K-\log\frac{1}{K}−logK1​也就是logK\log KlogK,意味着每个分类都是一样的,怎么区分全靠瞎蒙。让信息的不确定性减小,是能让分类清楚的条件。对于一个二分类问题的话,K=2K=2K=2,假设yyy只能取0,1。并且p(y=0)=p,p(y=1)=1pp(y=0)=p,p(y=1)=1-pp(y=0)=p,p(y=1)=1−p,那么信息熵也就是:
H(y)=plogp(1p)log(1p)H(y)=-p\log p-(1-p)\log(1-p)H(y)=−plogp−(1−p)log(1−p)log\loglog可以以2为低,也可以以e为底。总之,信息混乱程度越大,信息熵越大,信息量越大。

基尼指数

基尼指数的定义为:
Gini(y)=k=1Kpk(1pk)=1k=1Kpk2(Gini指数)Gini(y)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2\tag{Gini指数}Gini(y)=k=1∑K​pk​(1−pk​)=1−k=1∑K​pk2​(Gini指数)同样,对于实际信息来说,使用频率估计概率:
Gini(y)=Gini(D)=1k=1K(CkD)2(Gini指数2)Gini(y)=Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2\tag{Gini指数2}Gini(y)=Gini(D)=1−k=1∑K​(∣D∣∣Ck​∣​)2(Gini指数2)同样的,信息混乱程度越大,Gini指数越大,信息量越大。

信息增益

首先确定一些定义:数据集D={(x1,y1),...,(xN,yN)}D=\{(x_1,y_1),...,(x_N,y_N)\}D={(x1​,y1​),...,(xN​,yN​)},其中xi=(xi(1),...,xi(n))Tx_i=(x_i^{(1)},...,x_i^{(n)})^Txi​=(xi(1)​,...,xi(n)​)T表示描述yiy_iyi​的n维特征向量,假设特征叫AAA,那么D={(A1,y1),...,(AN,yN)}D=\{(A_1,y_1),...,(A_N,y_N)\}D={(A1​,y1​),...,(AN​,yN​)}。引入条件熵的概念,根据特征AAA的不同取值{a1,...,am}\{a_1,...,a_m\}{a1​,...,am​}对y进行限制y=yky=y_ky=yk​,对y=yky=y_ky=yk​的部分计算信息熵并加权平均,得到条件熵H(yA)H(y|A)H(y∣A)。条件熵越小,意味着y被AAA限制后的总的不确定性越小。数学定义为:
H(yA)=j=1mp(A=aj)H(yA=aj)(条件熵)H(y|A)=\sum_{j=1}^mp(A=a_j)H(y|A=a_j)\tag{条件熵}H(y∣A)=j=1∑m​p(A=aj​)H(y∣A=aj​)(条件熵)其中:
H(yA=aj)=k=1Kp(y=ckA=aj)logp(y=ckA=aj)H(y|A=a_j)=-\sum_{k=1}^Kp(y=c_k|A=a_j)\log p(y=c_k|A=a_j)H(y∣A=aj​)=−k=1∑K​p(y=ck​∣A=aj​)logp(y=ck​∣A=aj​)经验条件熵估计真正条件熵的公式:
H(yA)=H(yD)=j=1mDjDk=1KDjkDjlogDjkDjH(y|A)=H(y|D)=\sum_{j=1}^m\frac{|D_j|}{|D|}\sum_{k=1}^K\frac{|D_{jk}|}{|D_j|}\log \frac{|D_{jk}|}{|D_j|}H(y∣A)=H(y∣D)=j=1∑m​∣D∣∣Dj​∣​k=1∑K​∣Dj​∣∣Djk​∣​log∣Dj​∣∣Djk​∣​DjD_jDj​表示在A=ajA=a_jA=aj​限制下的数据集,Djk|D_{jk}|∣Djk​∣表示DjD_jDj​中的第kkk类样本的个数。信息增益就可以表示为
g(y,A)=H(y)H(yA)(信息增益(互信息量))g(y,A)=H(y)-H(y|A)\tag{信息增益(互信息量)}g(y,A)=H(y)−H(y∣A)(信息增益(互信息量))也叫互信息量。决策树种ID3就是用这个指标来选择特征的。但是天然地,这样会优先选择取值比较多的特征,对于这样的情况,给取值比较多的一个惩罚使用信息增益比来计算,也就是C4.5的概念:
gR(y,A)=g(y,A)HA(y)(信息增益比)g_R(y,A)=\frac{g(y,A)}{H_A(y)}\tag{信息增益比}gR​(y,A)=HA​(y)g(y,A)​(信息增益比)其中:
HA(y)=j=1mp(yA=aj)logp(yA=aj)H_A(y)=-\sum_{j=1}^mp(y^A=a_j)\log p(y^A=a_j)HA​(y)=−j=1∑m​p(yA=aj​)logp(yA=aj​)对于基尼指数,是差不多的原理:
Gini(yA)=1j=1mDjDk=1K(DjD)2Gini(y|A)=1-\sum_{j=1}^m\frac{|D_j|}{|D|}\sum_{k=1}^K(\frac{|D_j|}{|D|})^2Gini(y∣A)=1−j=1∑m​∣D∣∣Dj​∣​k=1∑K​(∣D∣∣Dj​∣​)2信息增益表示为:
gGini(y,A)=Gini(y)Gini(yA)g_{Gini}(y,A)=Gini(y)-Gini(y|A)gGini​(y,A)=Gini(y)−Gini(y∣A)CART种就是这种定义。

#决策树生成

决策数生成可以概括为2步:

常用的决策树算法有ID3,C4.5,CART。

ID3

ID3是Interactive Dichotomiter-3,交互式二分法。
假设有数据集D={(x1,y1),...,(xN,yN)}D=\{(x_1,y_1),...,(x_N,y_N)\}D={(x1​,y1​),...,(xN​,yN​)}。ID3的算法处理伪代码过程为:

(1) 将数据喂给一个节点;
(2) 若D中所有样本同属一个类别,则节点不再继续生成,标记为k类;
(3) 若样本已经是0维向量,则将这时的D中样本个数最多类别k类作为这个节点的类别输出;
(4)否则,按照互信息定义的信息增益:
g(y,x(j))=H(y)H(yx(j))g(y,x^{(j)})=H(y)-H(y|x^{(j)})g(y,x(j))=H(y)−H(y∣x(j))来计算第j维特征的信息增益,然后选择使得信息增益最大的特征作为划分标准
y=argmaxjg(y,x(j))y^*=\arg \underset{j}{\max}g(y,x^{(j)})y∗=argjmax​g(y,x(j))(5) 若满足停止条件,则不再继续生成并将此时的D中样本中个数最多的类别的k类作为类别标记
(6) 否则,依x(j)x^{(j*)}x(j∗)的所有可能取值{a1,...,am}\{a_1,...,a_m\}{a1​,...,am​}将数据集划分为{D1,...,Dm}\{D_1,...,D_m\}{D1​,...,Dm​}使:
(xi,yi)Djxi(j)=aj,i=1,...,N(x_i,y_i)\in D_j\Leftrightarrow x_i^{(j^*)}=a_j,\forall i=1,...,N(xi​,yi​)∈Dj​⇔xi(j∗)​=aj​,∀i=1,...,N同时,将x1,...,xNx_1,...,x_Nx1​,...,xN​的第jj^*j∗维去掉,使他们成为n-1维特征向量。
(7) 对每个DjD_jDj​从(1)开始调用算法。

对于(5)中的停止条件,常用的有:

C4.5

ID3是使用信息增益的最大特征作为当前特征选择的依据,但是这样就特别容易选择特征的值比较多的一个特征,比如特征F1F_1F1​可能的选择值有100个,而特征F2F_2F2​只有3个,那么选择F1F_1F1​的概率就比F2F_2F2​高,这样是不合理的。C4.5就是使用了信息增益比来选择特征的。所以C4.5可以处理ID3算法比较难处理的混合型数据。
原理上来讲,只需要将ID3的第(4)点替换为:
(4) 否则,按照信息增益比的定义:
gR(y,x(j))=g(y,x(j))Hx(j)(y)g_R(y,x^{(j)})=\frac{g(y,x^{(j)})}{H_{x^{(j)}}(y)}gR​(y,x(j))=Hx(j)​(y)g(y,x(j))​来计算第jjj维特征的信息增益比,然后选择使得信息增益最大的特征作为划分标准,也就是:
j=argmaxjgR(y,x(j))j^*=\arg \underset{j}{\max}g_R(y,x^{(j)})j∗=argjmax​gR​(y,x(j))混合型数据处理最主要的内容就是处理连续特征。可以简单转化为一个二分问题,
Y1={y:yA<a1},Y2={y:yAa1}Y_1=\{y:y^A<a_1\},Y_2=\{y:y^A\geqslant a_1\}Y1​={y:yA<a1​},Y2​={y:yA⩾a1​}也就是:
A={a1,a2},Y1={y:yA=a1},Y2={y:yA=a2}A=\{a_1,a_2\},Y_1=\{y:y^A=a_1\},Y_2=\{y:y^A=a_2\}A={a1​,a2​},Y1​={y:yA=a1​},Y2​={y:yA=a2​}a1a_1a1​就是一个二分标准,确定二分标准的方法为:

CART

CART是Classification and Regression Tree, 分类与回归树。所以CART能做分类与回归问题。CART是使用Gini增益比来选择特征的,它的特色是假设了最终生成的树为二叉树,所以在处理离散数据时候也会通过决出二分标准来划分数据。
将ID3算法的第(4)点替换为:
(4) 否则,不妨设x(j)x^{(j)}x(j)在当前数据集中有SjS_jSj​个取值u1(j),...,uSj(j)u_1^{(j)},...,u_{S_j}^{(j)}u1(j)​,...,uSj​(j)​,并且u1(j)<...<uSj(j)u_1^{(j)}<...<u_{S_j}^{(j)}u1(j)​<...<uSj​(j)​,那么:
a)若x(j)x^{(j)}x(j)是离散变量,依次选择u1(j)<...<uSj(j)u_1^{(j)}<...<u_{S_j}^{(j)}u1(j)​<...<uSj​(j)​作为二分标准apa_pap​,此时:
Ajp={x(j)=ap,x(j)ap}A_{jp}=\{x^{(j)}=a_p,x^{(j)}\neq a_p\}Ajp​={x(j)=ap​,x(j)​=ap​}
b)若x(j)x^{(j)}x(j)是连续变量,依次选择u1+u22,...,vm1+vm2\frac{u_1+u_2}{2},...,\frac{v_{m-1}+v_m}{2}2u1​+u2​​,...,2vm−1​+vm​​作为二分标准apa_pap​,此时:
Ajp={x(j)<ap,x(j)ap}A_{jp}=\{x^{(j)}<a_p,x^{(j)}\geqslant a_p\}Ajp​={x(j)<ap​,x(j)⩾ap​}按照基尼系数的定义增益增益:
gGini(y,Ajp)=Gini(y)Gini(yAjp)g_{Gini}(y,A_{jp})=Gini(y)-Gini(y|A_{jp})gGini​(y,Ajp​)=Gini(y)−Gini(y∣Ajp​)来计算第jjj维特征在二分标准下的信息增益,选择使得信息增益最大的特征x(y)x^{(y^*)}x(y∗)和相应的二分标准up(j)u_{p^*}^{(j^*)}up∗(j∗)​作为划分标准:
(j,p)=argmaxj,pgGini(y,Ajp)(j^*,p^*)=\arg \underset{j,p}{\max}g_{Gini}(y,A_{jp})(j∗,p∗)=argj,pmax​gGini​(y,Ajp​)回归问题暂且不表。

代码实现

参考git repo:Python_and_ML:03DT

sinat_18131557 发布了27 篇原创文章 · 获赞 3 · 访问量 3167 私信 关注

标签:...,Gini,机器,log,Python,aj,增益,frac,决策树
来源: https://blog.csdn.net/sinat_18131557/article/details/104138657