決策樹是一個非參數的監督式學習方法,主要用於分類和回歸。算法的目標是通過推斷數據特征,學習決策規則從而創建一個預測目標變量的模型。如下如所示,決策樹通過一系列if-then-else 決策規則 近似估計一個正弦曲線。
決策樹優勢:
- 簡單易懂,原理清晰,決策樹可以實現可視化
- 數據准備簡單。其他的方法需要實現數據歸一化,創建虛擬變量,刪除空白變量。(注意:這個模塊不支持缺失值)
- 使用決策樹的代價是數據點的對數級別。
- 能夠處理數值和分類數據
- 能夠處理多路輸出問題
- 使用白盒子模型(內部結構可以直接觀測的模型)。一個給定的情況是可以觀測的,那么就可以用布爾邏輯解釋這個結果。相反,如果在一個黑盒模型(ANN),結果可能很難解釋
- 可以通過統計學檢驗驗證模型。這也使得模型的可靠性計算變得可能
- 即使模型假設違反產生數據的真實模型,表現性能依舊很好。
決策樹劣勢:
- 可能會建立過於復雜的規則,即過擬合。為避免這個問題,剪枝、設置葉節點的最小樣本數量、設置決策樹的最大深度有時候是必要的。
- 決策樹有時候是不穩定的,因為數據微小的變動,可能生成完全不同的決策樹。 可以通過總體平均(ensemble)減緩這個問題。應該指的是多次實驗。
- 學習最優決策樹是一個NP完全問題。所以,實際決策樹學習算法是基於試探性算法,例如在每個節點實現局部最優值的貪心算法。這樣的算法是無法保證返回一個全局最優的決策樹。可以通過隨機選擇特征和樣本訓練多個決策樹來緩解這個問題。
- 有些問題學習起來非常難,因為決策樹很難表達。如:異或問題、奇偶校驗或多路復用器問題
- 如果有些因素占據支配地位,決策樹是有偏的。因此建議在擬合決策樹之前先平衡數據的影響因子。
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(16))
# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
# Predict
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
# Plot the results
plt.figure()
plt.scatter(X, y, c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()
多輸出問題
多輸出問題時需要預測多個輸出的監督式學習問題。即Y是一個2d的向量,大小為[n_samples, n_outputs]。
當輸出之間不相關時,一個簡單的解決辦法是建立n個獨立模型。對於每一個輸出,使用這些模型獨立預測這每個輸出。由於輸出是和相同的輸入相關的,所以一個更好的辦法是建立一個能夠持續預測所有輸出的單一模型。首先,系統需要的訓練時間更少了,因為只建立了一個模型。其次准確性也會得到提高。
決策樹的策略需要修改以支持多分類問題。
- 葉子上存儲n個輸出變量
- 使用不同的標准計算所有n輸出的平均減少
這一節是關於 DecisionTreeClassifier
和DecisionTreeRegressor
的一些知識點。如果一個決策樹的輸出向量Y大小為[n_samples, n_outputs],預測量有:
- predict:輸出n個預測值
- predict_proba:輸出有n個輸出的向量組成的列表。
多輸出的回歸的例子:輸入X是一個單一的值,輸出Y是輸入X的Sine和Cosine
函數 | 函數功能 |
---|---|
apply (X[, check_input]) |
返回每個樣本的葉節點的預測序號 |
decision_path (X[, check_input]) |
返回決策樹的決策路徑 [n_samples, n_nodes] |
fit (X, y[, sample_weight, check_input, …]) |
從訓練數據建立決策樹,返回一個對象 |
fit_transform(X[, y]) | 將數據X轉換[n_samples, n_features_new] |
get_params([deep]) | 得到估計量的參數,返回一個映射 |
predict(X[, check_input]) | 預測X的分類或者回歸,返回[n_samples] |
predict_log_proba(X) | 預測輸入樣本的對數概率,返回[n_samples, n_classes] |
predict_proba(X[, check_input]) | 預測輸入樣本的屬於各個類的概率[n_samples, n_classes] |
score(X, y[, sample_weight]) | 返回對於測試數據的平均准確率 |
set_params(**params) | 設置估計量的參數 |
transform(*args, **kwargs) | 將輸入參數X減少的最重要的特征,返回[n_samples, n_selected_features] |