python數據挖掘決策樹算法


決策樹是一個非參數的監督式學習方法,主要用於分類和回歸。算法的目標是通過推斷數據特征,學習決策規則從而創建一個預測目標變量的模型。如下如所示,決策樹通過一系列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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM