决策树学习的目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的“分而治之”(divide-and-conquer)策略,如下所示:
信息熵(information entropy)是度量样本集合纯度最常用的一种指标。假定当前样本集合 D D D中第 k k k类样本所占的比例为 p k ( k = 1 , 2 , ⋯ , ∣ y ∣ ) p_k(k=1,2,\cdots,\begin{vmatrix}y\end{vmatrix}) pk(k=1,2,⋯,∣∣y∣∣),这里的 ∣ y ∣ \begin{vmatrix}y\end{vmatrix} ∣∣y∣∣标示样本类别总数,即标签(labels)总数,则 D D D的信息增益熵定义为:
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D)=-\sum_{k=1}^{\begin{vmatrix}y\end{vmatrix}} p_klog_2p_k Ent(D)=−k=1∑∣y∣pklog2pk
E n t ( D ) Ent(D) Ent(D)的值越小,则 D D D的纯度越高。
假定离散属性 a a a有 V V V个可能的取值 { a 1 , a 2 , ⋯ , a V } \{a^1,a^2,\cdots,a^V\} {a1,a2,⋯,aV}(注意:这里指的是数据中的某一个特征,以及该特征的具体值),若使用 a a a来对样本集 D D D进行划分,则会产生 V V V个分支节点,其中第 v v v个分支节点包含了 D D D中所有在属性 a a a上取值为 a v a^v av的样本,记为 D v D^v Dv。在通过上述公式计算出该分支样本的信息熵,由于各个分支节点数的样本不平均,需要给分支结点分配相对于的权重 ∣ D v ∣ / ∣ D ∣ \begin{vmatrix}D^v\end{vmatrix}/\begin{vmatrix}D\end{vmatrix} ∣∣Dv∣∣/∣∣D∣∣。由此可得到信息增益(information gain):
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{\begin{vmatrix}D^v\end{vmatrix}}{\begin{vmatrix}D\end{vmatrix}}Ent(D^v) Gain(D,a)=Ent(D)−v=1∑V∣∣D∣∣∣∣Dv∣∣Ent(Dv)
一般而言,信息增益越大,则意味着使用属性 a a a来进行划分所获得的“纯度提升”越大
def entrop(p1, p2):
if p1 == 0 or p2 == 0: #当特征中只存在一个取值时 说明纯度最高
return 0
else:
return -p1*np.log2(p1)-p2*np.log2(p2)
# 根据上表可以看出
p_yes = 9/14
p_no = 1 - p_yes
entrop_decision = entrop(p_yes, p_no)
print(entrop_decision)
0.9402859586706311
# 特征:Outlook
p_outlook_sunny_yes = 2/5
p_outlook_sunny_no = 1 - p_outlook_sunny_yes
p_outlook_rain_yes = 3/5
p_outlook_rain_no = 1 - p_outlook_rain_yes
p_outlook_overcast_yes = 4/4
p_outlook_overcast_no = 1 - p_outlook_overcast_yes
p_outlook_sunny = 5/14
p_outlook_rain = 5/14
p_outlook_overcast = 4/14
gain_decision_outlook = entrop_decision - (p_outlook_sunny * entrop(p_outlook_sunny_yes,p_outlook_sunny_no)
+p_outlook_rain * entrop(p_outlook_rain_yes,p_outlook_rain_no)
+p_outlook_overcast * entrop(p_outlook_overcast_yes,p_outlook_overcast_no))
print(gain_decision_outlook)
0.24674981977443933
#特征:Temp
p_temp_hot_yes = 2/4
p_temp_hot_no = 1 - p_temp_hot_yes
p_temp_mild_yes = 4/6
p_temp_mild_no = 1 - p_temp_mild_yes
p_temp_cool_yes = 3/4
p_temp_cool_no = 1 - p_temp_cool_yes
p_temp_hot = 4/14
p_temp_mild = 6/14
p_temp_cool = 4/14
gain_decision_temp = entrop_decision - (p_temp_hot * entrop(p_temp_hot_yes, p_temp_hot_no)
+ p_temp_mild * entrop(p_temp_mild_yes, p_temp_mild_no)
+ p_temp_cool * entrop(p_temp_cool_yes, p_temp_cool_no))
print(gain_decision_temp)
0.02922256565895487
#特征:Humidity
p_humidity_high_yes = 5/7
p_humidity_high_no = 1 - p_temp_hot_yes
p_humidity_normal_yes = 6/7
p_humidity_normal_no = 1 - p_temp_mild_yes
p_humidity_high = 7/14
p_humidity_normal = 7/14
gain_decision_humidity = entrop_decision - (p_humidity_high * entrop(p_humidity_high_yes, p_humidity_high_no)
+ p_humidity_normal * entrop(p_humidity_normal_yes, p_humidity_normal_no))
print(gain_decision_humidity)
0.15744778017877914
#特征:Wind
p_wind_weak_yes = 6/8
p_wind_weak_no = 1 - p_wind_weak_yes
p_wind_strong_yes = 3/6
p_wind_strong_no = 1 - p_wind_strong_yes
p_wind_weak = 8/14
p_wind_strong = 6/14
gain_decision_wind = entrop_decision - (p_wind_weak * entrop(p_wind_weak_yes, p_wind_weak_no)
+ p_wind_strong * entrop(p_wind_strong_yes, p_wind_strong_no))
print(gain_decision_wind)
0.04812703040826949
print('Gain(decisiong|outlook)={:.3f}\nGain(decision|temp)={:.3f}\nGain(decisiong|humidity)={:.3f}\nGain(decisiong|wind)={:.3f}\n'
.format(gain_decision_outlook,gain_decision_temp,gain_decision_humidity,gain_decision_wind))
Gain(decisiong|outlook)=0.247
Gain(decision|temp)=0.029
Gain(decisiong|humidity)=0.157
Gain(decisiong|wind)=0.048
通过上述结果可以看出outlook特征的信息增益最大,说明使用该特征进行划分所获得的“纯度提升”效果最好。因此,使用outlook特征作为决策树的第一个节点。后续的决策树分支,一次进行各特征下的信息增益。
ID3的信息增益存在一个缺点:一般会优先选择有较多属性值的特征。
解决方案:增加惩罚项,C4.5使用信息增益比率(gain ratio)
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)}, Gainratio(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{\begin{vmatrix}D^v\end{vmatrix}}{\begin{vmatrix}D\end{vmatrix}}log_2\frac{\begin{vmatrix}D^v\end{vmatrix}}{\begin{vmatrix}D\end{vmatrix}} IV(a)=−v=1∑V∣∣D∣∣∣∣Dv∣∣log2∣∣D∣∣∣∣Dv∣∣
称为属性 a a a的“固有值”,该值描述了 a a a特征中不同特征值数目的大小,数目越多,则 I V ( a ) IV(a) IV(a)越大。
增益率准则是对可取值数目较少的属性有所偏好,因此,C4.5算法是先从候选划分属性中找出信息增益率高与平均水平的属性,再从中选择增益率最高的。
数据集 D D D的纯度可用基尼值来度量:
G i n i ( D ) = ∑ k = 1 ∣ y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ y ∣ p k 2 \begin{aligned} Gini(D)& =\sum_{k=1}^{\begin{vmatrix}y\end{vmatrix}}\sum_{k'\ne k}p_kp_{k'} \\ & = 1-\sum_{k=1}^{\begin{vmatrix}y\end{vmatrix}}p^2_k \\ \end{aligned} Gini(D)=k=1∑∣y∣k′=k∑pkpk′=1−k=1∑∣y∣pk2
G i n i ( D ) Gini(D) Gini(D)越小,则数据集 D D D的纯度越高。
属性 a a a的基尼指数(Gini index)定义为:
G i n i i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Gini_index(D,a)=\sum_{v=1}^{V} \frac{\begin{vmatrix}D^v\end{vmatrix}}{\begin{vmatrix}D\end{vmatrix}} Giniindex(D,a)=v=1∑V∣∣D∣∣∣∣Dv∣∣
选择使得划分后基尼指数最小的属性作为最优划分属性。
RF需要从原始的特征集中随机sampling,然后去分裂生成单颗树.
每个树的训练样本是从原始的训练集boostraping而来.
由于boostraping的有放回抽样方式,导致每个树的训练集合不同且只是原始训练集的一个部分.
对于第t个树来说,原始训练集中那些不在第t个树的训练集的数据,可以使用第t个树来进行test.
现在生成n(n是原始数据集的大小)个树,每个树的训练样本大小为n-1,对第i个树来说其训练集不包含(xi,yi)这个样本.
使用不包含(xi,yi)这个样本的所有的树(n-1个),vote的结果作为最终(xi,yi)这个样本的test结果.
参考博客:Out of bag error in Random Forest
让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中可以出现多次或根本不出现,训练之后可得到一个预测函数序 h 1 , ⋯ , h n h_1,\cdots,h_n h1,⋯,hn,最终的预测函数H对分类问题采用投票方式,对回归问题采用简单平均方法对新示例进行判别。
不难看出Adaboost类似于Bagging和Bossting的综合