众所周知,定义是一种概念的高度概括,尽管其包含的信息量很多很精华,但总是枯燥又无趣的。所以,在介绍定义前,先来看个引例,方便后续理解。
引例:
以教育为例,假设每个人都是一个样本(对应数据集),孔夫子说过,教育需要因材施教,所以我们的目标是尽可能地将每个人归到最适合自己的专业领域(对应数据标签),即专业是我们此处的最终目标(对应分类目标)。每个人都具有自己的特点,要怎么根据不同人的特点将每个人最终归到合适的专业呢?为此,每个人需要进行各方面的测试(对应数据特征),通过一次次的测试结果(对应决策树的有向边),到达自己最适合的专业领域。那么这个人才分流的过程(见下图),其实就是决策树算法的过程。
定义:分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示实例的某个特征或属性,叶结点表示一个类。
如引例中所示,内部节点对应的就是每个人的特征,比如艺术感,使用艺术感这个特征,可以将人群大致分为艺术类和非艺术类。经过大量特征的选择后,每个人最终都会到达叶结点,也就是具体的每个专业领域(如工科、商科等)。所以说每个叶结点表示一个类,就是当前问题的最终分类。
所以,决策树可以看作一个if-then的集合,所有样本在每个内部结点都会进行一次if-then的判断。通过多次if-then的判断后,最终样本会到达某个叶结点,也就是最终的结论。
当然,事实上,决策树中每个样本的分类并不一定符合客观实时,只是决策树算法对于样本的一种划分。所以也说,决策树表示给定特征条件下类的条件概率分布。假设X是表示特征的随机变量(即引例中每个人的特点测试结果),Y是表示类的随机变量(即引例中的各种领域)。那么,决策树的叶结点只是表示一个概率 P ( Y ∣ X ) P(Y|X) P(Y∣X),即在X构成的条件下属于Y类的概率。比如对于某个人来说,X=“艺术感好、音乐感好”,那么经过决策树算法后,其实会得到四个值, P ( Y = 音 乐 ∣ X ) P(Y=音乐|X) P(Y=音乐∣X)、 P ( Y = 美 术 ∣ X ) P(Y=美术|X) P(Y=美术∣X)、 P ( Y = 工 科 ∣ X ) P(Y=工科|X) P(Y=工科∣X)和 P ( Y = 商 科 ∣ X ) P(Y=商科|X) P(Y=商科∣X)。也就是说,这个人去任何领域其实都是可能的,但是决策树算法最终算出来的 P ( Y = 音 乐 ∣ X ) P(Y=音乐|X) P(Y=音乐∣X)是最大的,代表这个人在上述条件下,最有可能去音乐领域。
1).特征选择:算法会根据某种原则,每次迭代选择对当前结点上的训练样本划分最好的特征。如果算法的特征数量很多,可以在决策树学习开始前,对特征进行选择,只留下对训练数据有足够分类能力的特征;
2).决策树的生成:反复进行特征选择,一步步将样本划分开来,直到所有训练数据子集被基本正确划分,或者没有合适特征为止。最后每个样本都被分类到某个叶结点上,这就生成了一棵决策树。
3).决策树的剪枝:理论上,决策树可以完美地将训练样本划分为准确的类,但是当使用的特征过多,叶结点也会随之增长,即最终分类出来的类别也很多。这对已知数据可能能很好的拟合,但是对于未知数据的泛化效果是很差的。就好比,将一个人分为音乐家后,还要强行划分为左手音乐家还是右手音乐家,这种划分过于细致,会让训练模型产生过拟合现象。所以,有时候决策树生成后,需要对决策树进行剪枝,剪去过于琐碎的分叉,从而得到更好的泛化效果。
决策树学习的策略:因为决策树可以看作给定特征条件下类的条件概率分布,所以决策树算法的损失函数通常是正则化的极大似然函数。决策树学习的策略是使损失函数最小。因为从所有可能的决策树中选取最优决策树是NP问题,所以现实中决策树的算法通常采用启发式方法,近似求解最优问题。所以得到的决策树通常是次优的,不是全局最优解。
从第一章中可知,算法需要根据某种原则来选择特征,保证每次选择分类效果最好的特征作为内部节点。所以这章就会介绍特征选择的原则。
1).熵
定义:在信息论与概率统计中,熵是表示随机变量不确定性的度量。
什么叫不确定性呢?直观来解释,假设事件A一共可能出现 A i A_i Ai种情况, i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n。出现 A i A_i Ai情况的概率是 P ( A = A i ) = p i P(A=A_i)=p_i P(A=Ai)=pi。那么,如果 ∀ k , P ( A = A k ) → 1 \forall k,P(A=A_k)→1 ∀k,P(A=Ak)→1,那么很明显,这个事件A的确定性就很大,因为事件A很可能发生 A k A_k Ak的情况。相反地,如果每个 p i p_i pi数值都差不多,那么就很难分辨清楚到底可能发生什么情况,所以就说随机变量A的不确定性很大,也就是熵很大。
数学表达:
H ( X ) = − ∑ i = 1 n p i log p i H(X)=-\sum_{i=1}^n p_i\log p_i H(X)=−i=1∑npilogpi
注意
2).条件熵
定义:条件熵表示在已知随机变量X的条件下,随机变量Y的不确定性。
在下文的信心增益的定义中,可以知道为什么需要使用条件熵的概念。下式理解起来其实也很直观,根据定义,是要度量随机变量X已知的情况下,事件Y的不确定性。而随机变量X发生各种情况的可能性为 p i p_i pi,每种情况下对应的随机变量Y的熵值为 H ( Y ∣ X = x i ) H(Y|X=x_i) H(Y∣X=xi),所以对 H ( Y ∣ X ) H(Y|X) H(Y∣X)取期望即可得到下式。
数学表达:
H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) , 其 中 p i = P ( X = x i ) , i = 1 , 2 , . . . , n H(Y|X)=\sum_{i=1}^n p_iH(Y|X=x_i),其中p_i=P(X=x_i),i=1,2,...,n H(Y∣X)=i=1∑npiH(Y∣X=xi),其中pi=P(X=xi),i=1,2,...,n
3).经验熵和经验条件熵
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵和条件熵就叫做经验熵和经验条件熵。其实实际应用中,使用计算得出的都是经验熵和经验条件熵,因为真实的事件概率都是无法计算出来的,只能用大量的样本进行估计,所以都是经验值。
定义:表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
上述定义非常直观,就是已知X,会使得Y的信息不确定度减少的数值,就是信息增益。也就是 H ( Y ) − H ( Y ∣ X ) H(Y)-H(Y|X) H(Y)−H(Y∣X)。一般地, H ( Y ) − H ( Y ∣ X ) H(Y)-H(Y|X) H(Y)−H(Y∣X)也称作互信息。那么,转换为机器学习中的说法就是:特征A对训练数据集D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合D的经验熵 H ( D ) H(D) H(D)与给定特征A的条件下,D的经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A)之差,即:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
综上所述,选择特征的原则也就呼之欲出了。想要使用分类效果最好的特征,那么当然是选择使得当前数据集D的不确定性减少最大的特征。也就是选择一个对当前数据集信息增益最大的特征进行划分即可。
计算信息增益的算法
符号说明请参见上文。
以信息增益作为划分训练数据集特征的原则,通常结果偏向于选择取值较多的特征。因为某个特征将数据集划分的子集数量越多,相对来说每个 ∣ D i ∣ |D_i| ∣Di∣的数值就越小。那么一方面, ∣ D i ∣ / ∣ D ∣ |D_i|/|D| ∣Di∣/∣D∣的数值就越小;另一方面,因为 D i D_i Di子集的数量少,而分类类别总数K对于每个子集是恒定的,那么 H ( D i ) H(D_i) H(Di)的确定性很可能就越大,熵值就越小(可以理解为子集数量少,最终类别平均分布在几个子集的概率就低)。所以 H ( D ∣ A ) H(D|A) H(D∣A)就越小,即该特征对应的信息增益就可能更大。
使用信息增益比可以对该情况进行矫正,是另一种选取特征的原则。
定义:特征A对训练数据集D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)于训练数据集D关于特征A的值的熵 H A ( D ) H_A(D) HA(D)之比。
数学表达:
g R ( D , A ) = g ( D , A ) H A ( D ) , 其 中 H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log 2 ∣ D i ∣ ∣ D ∣ g_R(D,A)=\frac{g(D,A)}{H_A(D)},其中H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|} gR(D,A)=HA(D)g(D,A),其中HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
(定义总是让人捉摸不透)其实, H A ( D ) H_A(D) HA(D)就是说,数据集D根据特征A划分为多个子集 { D i } \{D_i\} {Di},然后数据集D针对划分子集这个事件的熵。其实看数学表达比较容易理解。
ID3算法具体步骤很简单:从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一棵决策树。ID3算法相当于用极大似然法进行概率模型的选择。
ID3算法实施:
算法部分没有什么好解释的了,看起来很复杂,其实也挺复杂的。但是一步一步理解了操作下来还是可以的。需要具备一定的代码基础,包括数据结构等等。还是强烈建议自己写一遍算法,然后再上网搜一下sklearn决策树相关源码,对比理解一下,对算法的理解会有很大提升。毕竟机器学习不只是研究理论,实际的编码能力还是要有的。博主的代码有时间会公布在github上,公布后会在本文中贴出。
C4.5算法和ID3算法几乎一样,进行了适当的改进,就是选择特征的标准从信息增益换成了信息增益比。
C4.5算法实施:
算法部分没有什么好解释的了,看起来很复杂,其实也挺复杂的。但是一步一步理解了操作下来还是可以的。需要具备一定的代码基础,包括数据结构等等。还是强烈建议自己写一遍算法,然后再上网搜一下sklearn决策树相关源码,对比理解一下,对算法的理解会有很大提升。毕竟机器学习不只是研究理论,实际的编码能力还是要有的。博主的代码有时间会公布在github上,公布后会在本文中贴出。
分类和回归树,顾名思义是可以用于分类也可以用于回归的决策树模型。注意,前面两种算法得到的树都是任意结构的树,而CART算法得到的树是二叉树。内部结点特征的取值为“是”和“否”,并规定左结点为“是”分支,右结点为“否"分支。
I.针对回归问题的CART
针对回归问题的CART,使用的最小化准则为平方误差。
假设X与Y分别为输入和输出变量,并且Y是连续变量,给定训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} D={(x1,y1),(x2,y2),...,(xN,yN)}
假设经过CART算法后,生成了如上图的二叉决策树。共4个结点。输入空间被划分为4个单元 R 1 , R 2 , . . . , R 4 R_1,R_2,...,R_4 R1,R2,...,R4。可以看到,每个空间包含的样本集合都已经在图中圈出来了。每个单元 R m R_m Rm(即叶结点)都有一个固定的输出值 c m c_m cm, c m c_m cm最好的取值方式就是属于 R m R_m Rm单元内所有样本对应的输出值的均值,即
c m = a v e ( y i ∣ x i ∈ R m ) c_m=ave(y_i|x_i\in R_m) cm=ave(yi∣xi∈Rm)
那么,该怎样对输入空间进行划分呢?(即如何选择样本特征作为二叉树的内部结点呢?)这里采用启发式的方法:选择第j个特征的样本集合 { x ( j ) } \{x^{(j)}\} {x(j)},假定s是划分该特征的阈值。这个特征就叫做切分变量(splitting variable,个人觉得叫切分特征好理解一些),这个阈值就叫做切分点(splitting point),并定义对应划分的两个区域:
R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } 和 R 2 ( j , s ) = { x ∣ x ( j ) > s } R_1(j,s)=\{x|x^{(j)}\le s\} 和 R_2(j,s)=\{x|x^{(j)}>s\} R1(j,s)={x∣x(j)≤s}和R2(j,s)={x∣x(j)>s}
然后在当前数据集D(或子集 D i D_i Di)的所有特征中,寻找最优切分变量j和最优切分点s,求解:
min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min\limits_{j,s}[\min\limits_{c_1}\sum\limits_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min\limits_{c_2}\sum\limits_{x_i\in R_2(j,s)}(y_i-c_2)^2] j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]
对固定的j,都可以找到各自的最优切分点s。切分后左右子结点代表的输出值就是:
c 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) , c 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) c_1=ave(y_i|x_i\in R_1(j,s)),c_2=ave(y_i|x_i\in R_2(j,s)) c1=ave(yi∣xi∈R1(j,s)),c2=ave(yi∣xi∈R2(j,s))
遍历所有的特征 j,每个特征都构成一个数据对 ( j , s ) (j,s) (j,s)。从中找到最优的切分特征,根据该特征将当前数据集划分为两个区域。接着,对为满足结束条件的子区域继续执行上述过程,直到满足停止条件为止。这样,我们就得到了最终所有叶结点的划分空间 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM(注意,此处的 R i R_i Ri均是叶结点代表的样本空间),以及每个空间代表的输出值 c m c_m cm。用这棵决策树,就可以预测回归问题,决策树的输出为:
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum_{m=1}^M c_mI(x\in R_m) f(x)=m=1∑McmI(x∈Rm)
下面是CART回归型决策树的算法实施:
II.针对分类问题的CART
分类问题的CART使用的特征选择原则为基尼指数,同时决定最优特征的最优二值切分点。
基尼指数的数学表达:
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 , 对 二 分 类 问 题 = 2 p ( 1 − p ) Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2,对二分类问题=2p(1-p) Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2,对二分类问题=2p(1−p)
由于CART将每个特征的划分都假定为二分类问题,即某个特征是否取某一数值。所以,在给定样本集合D的情况下,根据特征A是否取某一可能值a,可以将样本划分为两个子集 D 1 , D 2 D_1,D_2 D1,D2
D 1 = { ( x , y ) ∈ D ∣ A ( x ) = a } , D 2 = D − D 1 D_1=\{(x,y)\in D|A(x)=a\},D_2=D-D_1 D1={(x,y)∈D∣A(x)=a},D2=D−D1
此时,在特征A的条件下,集合D的基尼指数为:
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
基尼指数 G i n i ( D ) , G i n i ( D , A ) Gini(D),Gini(D,A) Gini(D),Gini(D,A)也表示了数据的不确定性,其含义和上文中的熵与条件熵几乎是一样的。
CART算法实施:
算法停止计算的条件是结点中的样本个数小于预定阈值,或者样本集的基尼指数小于阈值(意味着当前结点内的样本基本属于一类),或者没有更多特征。
决策树算法的特点决定了决策树可以对样本训练集进行几乎完美的拟合,但是通常这样会导致过拟合问题。决策树出现过拟合问题是很常见的,所以通常都需要对决策树进行剪枝。
简单的剪枝方法是,通过极小化决策树整体的损失函数来实现。
假设树T的叶结点个数为 ∣ T ∣ |T| ∣T∣个,t是树T的叶结点,该叶结点有 N t N_t Nt个样本点,其中k类的样本点有 N t k N_tk Ntk个, k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K, H t ( T ) H_t(T) Ht(T)为叶结点t上的经验熵, α ≥ 0 \alpha\ge 0 α≥0是正则项超参数。决策树学习的损失函数可以定义为:
C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T| Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其 中 经 验 熵 : H t ( T ) = − ∑ k N t k N t log N t k N t , 记 C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k log N t k N t 其中经验熵:H_t(T)=-\sum\limits_k \frac{N_{tk}}{N_t} \log \frac{N_{tk}}{N_t},记C(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^KN_{tk}\log \frac{N_{tk}}{N_t} 其中经验熵:Ht(T)=−k∑NtNtklogNtNtk,记C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
∴ C α ( T ) = C ( T ) + α ∣ T ∣ ∴C_{\alpha}(T)=C(T)+\alpha|T| ∴Cα(T)=C(T)+α∣T∣
其实就是所有叶结点的熵的总和,加上一个正则项。 α \alpha α越大,倾向于选择结构简单的树;反之,则选择结构复杂的树。
剪枝算法流程:
CART算法的剪枝是首先从算法生成的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根节点为止,形成一个子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} {T0,T1,...,Tn},其中,从 T 0 T_0 T0开始往后,每棵树与后续的子树都是包含关系,及下标小的树包含下标大的树。然后,通过交叉验证法在独立的验证数据集上,对子树序列进行测试,根据验证集的损失函数选择其中的最优子树。
CART剪枝算法实施:
随机森林算法步骤:
1).从原样本集中进行重采样(有重复的)选出n个样本;
2).从所有属性中随机选择s个属性,从s个属性中选择最佳分割属性作为节点建立CART决策树;
3).重复以上两步m次,即建立了m棵CART决策树;
4).这m个CART形成随机森林,通过投票表决结果,决定预测数据属于哪一类。
一般来说,SVM和Logistic回归也可以作随机森林的分类器,但是最好不要这么做,因为它们是强分类器,最后的分类效果可能并不大好。投票表决还有别的方式,可以参考“推荐系统”知识。