決策樹是一種常用的監督學習算法,既可以用于分類任務也可以用于回歸任務。決策樹通過遞歸地將數據集劃分成更小的子集,逐步建立樹結構。每個節點對應一個特征,樹的葉子節點表示最終的預測結果。構建決策樹的關鍵是選擇最佳的特征來分割數據,而信息增益(Information Gain)和熵(Entropy)是常用的度量標準。
熵(Entropy)
原理
熵是衡量隨機變量不確定性的指標。在決策樹中,熵用于衡量數據集的純度或混亂程度。熵越高,數據集越混亂;熵越低,數據集越純凈。
公式
對于一個包含 ( n ) 個類別的分類問題,數據集 ( S ) 的熵定義為:
Entropy ( S ) = ? ∑ i = 1 n p i log ? 2 ( p i ) \text{Entropy}(S) = -\sum_{i=1}^{n} p_i \log_2(p_i) Entropy(S)=?i=1∑n?pi?log2?(pi?)
其中,( p_i ) 是數據集中第 ( i ) 類的比例。
示例
假設數據集 ( S ) 有兩類(正例和反例),其中正例占比 ( p ),反例占比 ( 1-p ),則熵為:
Entropy ( S ) = ? p log ? 2 ( p ) ? ( 1 ? p ) log ? 2 ( 1 ? p ) \text{Entropy}(S) = -p \log_2(p) - (1-p) \log_2(1-p) Entropy(S)=?plog2?(p)?(1?p)log2?(1?p)
信息增益(Information Gain)
原理
信息增益用于衡量選擇某個特征進行劃分后,數據集的純度增加了多少。信息增益越大,說明通過該特征進行劃分,能夠更好地區分數據。因此,決策樹在選擇特征進行劃分時,會選擇信息增益最大的特征。
公式
特征 ( A ) 對數據集 ( S ) 的信息增益定義為:
Gain ( S , A ) = Entropy ( S ) ? ∑ v ∈ Values ( A ) ∣ S v ∣ ∣ S ∣ Entropy ( S v ) \text{Gain}(S, A) = \text{Entropy}(S) - \sum_{v \in \text{Values}(A)} \frac{|S_v|}{|S|} \text{Entropy}(S_v) Gain(S,A)=Entropy(S)?v∈Values(A)∑?∣S∣∣Sv?∣?Entropy(Sv?)
其中,Values(A) 表示特征 ( A ) 的所有可能取值,( S_v ) 表示在特征 ( A ) 上取值為 ( v ) 的子集。
示例
假設我們有一個數據集 ( S ),特征 ( A ) 有兩個可能取值 ( {a_1, a_2} ),則信息增益計算過程如下:
- 計算整個數據集的熵: Entropy ( S ) \text{Entropy}(S) Entropy(S)
- 計算特征 ( A ) 各個取值子集的熵: Entropy ( S a 1 ) \text{Entropy}(S_{a_1}) Entropy(Sa1??) 和 Entropy ( S a 2 ) \text{Entropy}(S_{a_2}) Entropy(Sa2??)
- 計算信息增益:
Gain ( S , A ) = Entropy ( S ) ? ( ∣ S a 1 ∣ ∣ S ∣ Entropy ( S a 1 ) + ∣ S a 2 ∣ ∣ S ∣ Entropy ( S a 2 ) ) \text{Gain}(S, A) = \text{Entropy}(S) - \left( \frac{|S_{a_1}|}{|S|} \text{Entropy}(S_{a_1}) + \frac{|S_{a_2}|}{|S|} \text{Entropy}(S_{a_2}) \right) Gain(S,A)=Entropy(S)?(∣S∣∣Sa1??∣?Entropy(Sa1??)+∣S∣∣Sa2??∣?Entropy(Sa2??))
基尼指數(Gini Index)
除了熵和信息增益,基尼指數也是常用的決策樹分裂準則。基尼指數衡量數據集的不純度,值越小越純。
公式
對于一個包含 ( n ) 個類別的數據集 ( S ),基尼指數定義為:
Gini ( S ) = 1 ? ∑ i = 1 n p i 2 \text{Gini}(S) = 1 - \sum_{i=1}^{n} p_i^2 Gini(S)=1?i=1∑n?pi2?
其中,( p_i ) 是數據集中第 ( i ) 類的比例。
示例
假設數據集 ( S ) 有兩類(正例和反例),其中正例占比 ( p ),反例占比 ( 1-p ),則基尼指數為:
Gini ( S ) = 1 ? ( p 2 + ( 1 ? p ) 2 ) = 2 p ( 1 ? p ) \text{Gini}(S) = 1 - (p^2 + (1-p)^2) = 2p(1-p) Gini(S)=1?(p2+(1?p)2)=2p(1?p)
信息增益率(Information Gain Ratio)
信息增益率是信息增益的一種改進形式,旨在處理信息增益對取值較多的特征的偏好問題。
公式
特征 ( A ) 對數據集 ( S ) 的信息增益率定義為:
GainRatio ( S , A ) = Gain ( S , A ) SplitInformation ( A ) \text{GainRatio}(S, A) = \frac{\text{Gain}(S, A)}{\text{SplitInformation}(A)} GainRatio(S,A)=SplitInformation(A)Gain(S,A)?
其中,分裂信息(Split Information)定義為:
SplitInformation ( A ) = ? ∑ v ∈ Values ( A ) ∣ S v ∣ ∣ S ∣ log ? 2 ( ∣ S v ∣ ∣ S ∣ ) \text{SplitInformation}(A) = -\sum_{v \in \text{Values}(A)} \frac{|S_v|}{|S|} \log_2 \left( \frac{|S_v|}{|S|} \right) SplitInformation(A)=?v∈Values(A)∑?∣S∣∣Sv?∣?log2?(∣S∣∣Sv?∣?)
用法
- 分類:用于分類任務,目標變量是類別。
- 回歸:用于回歸任務,目標變量是連續值。
優點
- 易于理解和解釋。
- 處理類別特征和數值特征。
- 不需要大量數據預處理。
缺點
- 容易過擬合,尤其在樹深度較大時。
- 對噪聲數據敏感。
代碼實例
以下是使用 scikit-learn
實現決策樹分類和回歸的代碼示例。
from sklearn.datasets import load_iris, load_boston
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.metrics import accuracy_score, mean_squared_error# 分類任務
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)print(f"Classification Accuracy: {accuracy_score(y_test, y_pred)}")# 回歸任務
boston = load_boston()
X, y = boston.data, boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)reg = DecisionTreeRegressor()
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)print(f"Regression MSE: {mean_squared_error(y_test, y_pred)}")
隨機森林
隨機森林是集成學習方法的一種,通過生成多個決策樹,并結合它們的預測結果來提高模型的性能和穩定性。
用法
- 分類:用于分類任務,通過多個決策樹的投票來確定類別。
- 回歸:用于回歸任務,通過多個決策樹的平均值來預測連續值。
優點
- 減少過擬合的風險。
- 更高的預測準確性。
- 能處理高維數據和缺失值。
缺點
- 計算開銷較大,尤其是樹的數量較多時。
- 模型復雜性較高,不易解釋。
代碼實例
以下是使用 scikit-learn
實現隨機森林分類和回歸的代碼示例。
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor# 分類任務
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)print(f"Random Forest Classification Accuracy: {accuracy_score(y_test, y_pred)}")# 回歸任務
reg = RandomForestRegressor(n_estimators=100, random_state=42)
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)print(f"Random Forest Regression MSE: {mean_squared_error(y_test, y_pred)}")
進階用法和參數調整
決策樹參數
criterion
: 分裂的評價標準(gini
或entropy
用于分類;mse
或mae
用于回歸)。max_depth
: 樹的最大深度,防止過擬合。min_samples_split
: 分裂內部節點所需的最小樣本數。min_samples_leaf
: 葉節點的最小樣本數。
隨機森林參數
n_estimators
: 決策樹的數量。max_features
: 每次分裂時考慮的特征數量。bootstrap
: 是否在構建樹時使用自助法采樣。oob_score
: 是否使用袋外樣本評估模型性能。
# 調整決策樹參數
clf = DecisionTreeClassifier(max_depth=5, min_samples_split=10, criterion='entropy')
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(f"Tuned Decision Tree Classification Accuracy: {accuracy_score(y_test, y_pred)}")# 調整隨機森林參數
reg = RandomForestRegressor(n_estimators=200, max_features='sqrt', oob_score=True, random_state=42)
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)
print(f"Tuned Random Forest Regression MSE: {mean_squared_error(y_test, y_pred)}")
print(f"Out-of-Bag Score: {reg.oob_score_}")
可視化決策樹
可以使用 graphviz
庫可視化決策樹,以便更好地理解其結構。
from sklearn.tree import export_graphviz
import graphviz# 導出決策樹圖像
dot_data = export_graphviz(clf, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("decision_tree")
通過這些實例,展示了決策樹和隨機森林在分類和回歸任務中的應用。可以根據具體問題調整參數,提升模型的性能和穩定性。