决策树入门指南
决策树是一种常用的机器学习算法,适用于分类和回归任务。它的目标是创建一个模型,该模型通过学习从数据特征中推导出的简单决策规则来预测目标变量的值。
1. 概念
决策树模型呈树形结构,在这种结构中,内部节点代表数据的一个属性或特征,每条边代表一个决策规则,而每个叶节点代表最终的输出结果(决策结果或分类)。决策树的主要优点是模型具有很好的可解释性,你可以很容易地理解模型的决策路径。
2. 算法
ID3 (Iterative Dichotomiser 3)
原理
ID3算法的核心是选择使信息增益(Information Gain,IG)最大的属性作为决策节点。信息增益计算公式为:
I G ( S , A ) = H ( S ) − ∑ v ∈ V a l u e s ( A ) ∣ S v ∣ ∣ S ∣ H ( S v ) \mathrm{IG}(S,A)=H(S)-\sum_{v\in\mathrm{Values}(A)}\frac{|S_v|}{|S|}H(S_v) IG(S,A)=H(S)−∑v∈Values(A)∣S∣∣Sv∣H(Sv)
其中:
-
H ( S ) H(S) H(S)是集合S的熵,计算公式为:
H ( S ) = − ∑ x ∈ Classes p ( x ) log 2 p ( x ) H(S)=-\sum_{x\in\text{Classes}}p(x)\log_2p(x) H(S)=−∑x∈Classesp(x)log2p(x)
-
S v S_{v} Sv是当属性A等于值v时的子集;
-
∣ S ∣ \left|S\right| ∣S∣ 是样本总数;
-
∣ S v ∣ |S_{v}| ∣Sv∣ 是在属性A的值为v的样本数;
-
V a l u e s ( A ) \mathrm{Values}(A) Values(A)是属性A的所有可能值的集合。
C4.5
C4.5算法改进了ID3,引入了信息增益比(Gain Ratio,GR),以解决ID3偏向于选择具有更多值的属性的问题。信息增益比计算公式为:
G R ( S , A ) = I G ( S , A ) S p l i t I n f o ( A ) \mathrm{GR}(S,A)=\frac{\mathrm{IG}(S,A)}{\mathrm{SplitInfo}(A)} GR(S,A)=SplitInfo(A)IG(S,A)
其中:
SplitInfo ( A ) \text{SplitInfo}(A) SplitInfo(A)是属性A的分裂信息,
计算公式为: SplitInfo ( A ) ˉ = − ∑ v ∈ V a l u e s ( A ) ∣ S v ∣ ∣ S ∣ log 2 ∣ S v ∣ ∣ S ∣ \bar{\text{SplitInfo}(A)}=-\sum_{v\in\mathrm{Values}(A)}\frac{|S_v|}{|S|}\log_2\frac{|S_v|}{|S|} SplitInfo(A)ˉ=−∑v∈Values(A)∣S∣∣Sv∣log2∣S∣∣Sv∣
基尼指数(Gini Index)
基尼指数是用来量化数据集的纯净度的一个指标,通常用于CART(分类与回归树)算法中。基尼指数越低,数据集的纯度越高,意味着数据越有可能属于同一类。
计算公式
基尼指数的计算公式为: G i n i ( S ) = 1 − ∑ i = 1 n p i 2 \mathrm{Gini}(S)=1-\sum_{i=1}^np_i^2 Gini(S)=1−∑i=1npi2
其中 p i p_{i} pi是选择分类i的概率,n是分类的数量。
对于选择最佳分割,我们计算在特定属性分割后的加权基尼指数: G i n i _ i n d e x ( S , A ) = ∑ v ∈ V a l u e s ( A ) ∣ S v ∣ ∣ S ∣ G i n i ( S v ) \mathrm{Gini\_index}(S,A)=\sum_{v\in\mathrm{Values}(A)}\frac{|S_v|}{|S|}\mathrm{Gini}(S_v) Gini_index(S,A)=∑v∈Values(A)∣S∣∣Sv∣Gini(Sv)
例题
假设有以下数据集,包括四个样本,用于预测是否会打篮球(是或否)。
天气 | 温度 | 打篮球 |
---|---|---|
晴朗 | 热 | 否 |
阴天 | 温暖 | 是 |
阴天 | 凉爽 | 是 |
晴朗 | 温暖 | 否 |
任务:使用ID3算法找出最佳分裂属性。
计算
首先计算整体熵 𝐻(𝑆)H(S):
- P ( 是 ) = 2 4 = 0.5 P(\text{是})=\frac24=0.5 P(是)=42=0.5
- P ( 否 ) = 2 4 = 0.5 P(\text{否})=\frac24=0.5 P(否)=42=0.5
- H ( S ) = − ( 0.5 log 2 0.5 + 0.5 log 2 0.5 ) = 1.0 H(S)=-(0.5\log_20.5+0.5\log_20.5)=1.0 H(S)=−(0.5log20.5+0.5log20.5)=1.0
计算每个属性的信息增益:
-
天气
-
∣ S 晴朗 ∣ = 2 , ∣ S 阴天 ∣ = 2 |S_\text{晴朗}|=2,|S_\text{阴天}|=2 ∣S晴朗∣=2,∣S阴天∣=2
H ( S 晴朗 ) = 1.0 H(S_\text{晴朗})=1.0 H(S晴朗)=1.0 (因为晴朗时是1否1是)
H ( S 阴天 ) = 0 H(S_\text{阴天})=0 H(S阴天)=0 (因为阴天都是是)
IG ( S (S (S,天气 ) = 1.0 − ( 2 4 ⋅ 1.0 + 2 4 ⋅ 0 ) = 0.5 )=1.0-\left(\frac24\cdot1.0+\frac24\cdot0\right)=0.5 )=1.0−(42⋅1.0+42⋅0)=0.5
-
-
温度
- 计算类似…
最终选择信息增益最高的属性作为决策节点。在这个例子中,假设“天气”属性有最高的信息增益,因此它被选择为分裂节点。
3. Python实例
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
# 加载Iris数据集
data = load_iris()
X = data.data
y = data.target
# 创建决策树分类器,使用基尼指数作为分裂标准
clf = DecisionTreeClassifier(criterion='gini')
clf.fit(X, y)
# 可视化决策树
plt.figure(figsize=(20,10))
a = plot_tree(clf,
feature_names=data.feature_names,
class_names=data.target_names,
filled=True,
rounded=True,
fontsize=14)
plt.show()
结果图