機器學習——決策樹(一)

決策樹(DT)是用於分類迴歸的非參數監督學習方法。目標是創建一個模型,通過學習從數據特徵推斷出的簡單決策規則來預測目標變量的值。

例如,在下面的示例中,決策樹從數據中學習以使用一組if-then-else決策規則來近似正弦曲線。樹越深,決策規則越複雜,模型越適合。

決策樹的優點

  • 簡單易懂和解釋,直觀
  • 只需少量的數據準備
  • 能夠處理數字和分類數據
  • 能夠處理多輸出問題
  • 可以使用統計測試驗證模型

決策樹的缺點

  • 容易過擬合
  • 決策樹可能不穩定
  • 已知在最優性的幾個方面甚至對於簡單的概念,學習最優決策樹的問題是NP完全的。因此,實際的決策樹學習算法基於啓發式算法,例如貪婪算法,其中在每個節點處進行局部最優決策。這種算法不能保證返回全局最優決策樹。這可以通過在集合學習器中訓練多個樹來減輕,其中特徵和樣本隨替換而被隨機採樣。
  • 有些概念很難學習,因爲決策樹不容易表達它們,例如XOR,奇偶校驗或多路複用器問題。
  • 如果某些類占主導地位,決策樹學習者會創建偏向的樹。因此,建議在擬合決策樹之前平衡數據集。

1、分類

決策樹能夠對數據集執行多類分類,將兩個數組作爲輸入:數組X,稀疏或密集,大小 保存訓練樣本,以及數組Y的整數值,大小,保存訓練樣本的類標籤:[n_samples, n_features][n_samples]。

>>> from sklearn.datasets import load_iris
>>> from sklearn import tree
>>> iris = load_iris()
>>> clf = tree.DecisionTreeClassifier()
>>> clf = clf.fit(iris.data, iris.target)

使用sklearn.datasets生成數據,並調用tree.DescisionTreeClassifier()方法對數據進行分類,如下:

In [11]: >>> import graphviz
    ...: >>> dot_data = tree.export_graphviz(clf, out_file=None)
    ...: >>> graph = graphviz.Source(dot_data)
    ...: >>> graph.render("iris")
    ...:
Out[11]: 'iris.pdf'

對數據進行可視化,輸出爲pdf格式:

可視化決策樹

2.迴歸

決策樹也可以使用DecisionTreeRegressor該類應用於迴歸問題 ,y應該是浮點值。

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(100, 1), axis=0)
#數據對應的標籤,並取餘弦改變格式
y = np.sin(X).ravel()

y[::5] += 3 * (0.5 - rng.rand(20))

# 創建迴歸對象,用訓練數據擬合迴歸模型
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)

# 預測
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)
迴歸

3.多輸出問題

多輸出問題是一種監督學習問題,有幾個輸出要預測,構建能夠預測所有n個輸出的單個模型。首先,它需要較低的訓練時間,因爲只建立了一個估算器。其次,通常可以增加所得估計器的泛化精度。

該模塊通過在DecisionTreeClassifier和中 實現此策略,爲多輸出問題提供支持DecisionTreeRegressor。如果決策樹適合大小的輸出數組Y,則結果估計器將:[n_samples, n_outputs]

  • 輸出n_output值predict;
  • 輸出類概率的n_output數組列表 predict_proba

多輸出決策樹迴歸中演示了使用 多輸出樹進行迴歸。在此示例中,輸入X是單個實數值,輸出Y是X的正弦和餘弦。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor

# 生成訓練數據集
#獲取隨機數生成器
rng = np.random.RandomState(1)
#生成訓練數據,並排序
X = np.sort(200 * rng.rand(100, 1) - 100, axis=0)
#生成數據對應的標籤,並取餘弦改變格式
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y[::5, :] += (0.5 - rng.rand(20, 2))

#創建迴歸對象
regr_1 = DecisionTreeRegressor(max_depth=3)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_3 = DecisionTreeRegressor(max_depth=8)
#用訓練數據擬合迴歸模型
regr_1.fit(X, y)
regr_2.fit(X, y)
regr_3.fit(X, y)

# 預測
X_test = np.arange(-100.0, 100.0, 0.01)[:, np.newaxis]
print(X_test)
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)
多輸出問題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章