使用不纯度划分。衡量纯度可以分信息熵和基尼值。
信息熵(information entropy)是度量不纯度最常用指标。
不纯度计算是基于节点来结算,树中的每个节点都会有不纯度。
1.1 假设当前节点t中第k类样本所含比例为 p k p_k pk,则信息熵定义为:
E n t ( t ) = − ∑ k = 1 c p k l o g 2 p k Ent(t) = -\sum_{k=1}^cp_klog_2{p_k} Ent(t)=−∑k=1cpklog2pk
ps: c表示当前节点中总共有分了c类。
假定样本集合D,其中属性a有V个可能的取值{ a 1 , a 2 . . . a v a^1,a^2...a^v a1,a2...av},其中第V个分支节点包含了集合D在属性a上取值为 a v a^v av的样本,记为 D v D^v Dv,根据上式可以计算出 D v D^v Dv的信息熵;
同时考虑到各分支节点包含的样本量不同,给予分支节点权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| ∣Dv∣/∣D∣,于是可以算出属性a对样本集D进行划分所获得的信息增益,
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)−∑v=1V∣D∣∣Dv∣Ent(Dv)
为解决信息增益对可取数目较多属性的偏好,使用“增益率”
G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain~ratio(D,a) = \frac{Gain(D,a)}{IV(a)} Gain ratio(D,a)=IV(a)Gain(D,a)
分 支 度 I V ( a ) = − ∑ v = 1 v ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ 分支度 IV(a) = -\sum_{v=1}^v\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} 分支度IV(a)=−∑v=1v∣D∣∣Dv∣log2∣D∣∣Dv∣
通常属性a的取值数目越多,IV(a)值越大。
注意:增益率对可取数目较少的属性有所偏好
处理连续值:使用二分法;针对连续变量每个间隔划分为两类,分别计算gain_ratio,找出最大的gain_ratio。
故C4.5算法并不是直接选信息增益率最大的属性,而是一个启发式:先找出信息增益(Gain)高于平均水平的属性,在从中选择增益率(Gain_ratio)最高的
基尼值:也是针对每个节点计算
G i n i ( t ) = ∑ k = 1 c p k ( 1 − p k ) = 1 − ∑ k = 1 c p k 2 Gini(t) = \sum_{k=1}^cp_k(1-p_k) = 1-\sum_{k=1}^cp_k^2 Gini(t)=∑k=1cpk(1−pk)=1−∑k=1cpk2
G i n i i n d e x ( D , a ) = ∑ k = 1 v ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini~index(D,a) = \sum_{k=1}^v\frac{|D_v|}{|D|}Gini(D^v) Gini index(D,a)=∑k=1v∣D∣∣Dv∣Gini(Dv)
所以,选择基尼指数最小的那个属性进行划分。
以上均是针对分类树,对于回归树(预测值为连续型变量):
未 分 组 样 本 方 差 : s 2 = ∑ i − 1 n ( x − x ˉ ) n − 1 未分组样本方差: s^2 = \frac{\sum_{i-1}^n(x-\bar{x})}{n-1} 未分组样本方差:s2=n−1∑i−1n(x−xˉ)
分 组 样 本 方 差 : s 2 = ∑ i − 1 k ( M i − x ˉ 2 ) f i n − 1 分组样本方差: s^2 = \frac{\sum_{i-1}^k(M_i-\bar{x}^2)f_i}{n-1} 分组样本方差:s2=n−1∑i−1k(Mi−xˉ2)fi
sklearn中使用如下:
M S E = 1 N ∑ i = 1 n ( f i − y i ) 2 MSE = \frac{1}{N}\sum_{i=1}^n(f_i-y_i)^2 MSE=N1∑i=1n(fi−yi)2
M A E = 1 N ∑ i = 1 n ∣ f i − y i ∣ MAE = \frac{1}{N}\sum_{i=1}^n|f_i-y_i| MAE=N1∑i=1n∣fi−yi∣
均选根据父节点与子节点额差额最大的属性作为最佳划分属性。
剪枝处理
from sklearn.tree import DecisionTreeClassfier # 分类决策树
from sklearn.tree import DecisionTreeRegressor # 回归决策树
#分类树与回归树参数一致,只是分类树比回归树多了一个class_weight参数。
DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort='deprecated', ccp_alpha=0.0)
DecisionTreeRegressor(criterion='mse', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort='deprecated', ccp_alpha=0.0)
【参考资料】
1.西瓜书
2.菜菜的sklern课堂
3.CDA数据培训