【sklearn決策樹算法】DecisionTreeClassifier(API)的使用以及決策樹代碼實例 - 鳶尾花分類


決策樹算法

決策樹算法主要有ID3, C4.5, CART這三種。

ID3算法從樹的根節點開始,總是選擇信息增益最大的特征,對此特征施加判斷條件建立子節點,遞歸進行,直到信息增益很小或者沒有特征時結束。
信息增益:特征 A 對於某一訓練集 D 的信息增益 \(g(D, A)\) 定義為集合 D 的熵 \(H(D)\) 與特征 A 在給定條件下 D 的熵 \(H(D/A)\) 之差。
熵(Entropy)是表示隨機變量不確定性的度量。

\[g(D, A) = H(D) - H(D \mid A) \]

C4.5是使用了信息增益比來選擇特征,這被看成是 ID3 算法的一種改進。

但這兩種算法都會導致過擬合的問題,需要進行剪枝。

決策樹的修剪,其實就是通過優化損失函數來去掉不必要的一些分類特征,降低模型的整體復雜度。

CART 算法在生成樹的過程中,分類樹采用了基尼指數(Gini Index)最小化原則,而回歸樹選擇了平方損失函數最小化原則。
CART 算法也包含了樹的修剪,CART 算法從完全生長的決策樹底端剪去一些子樹,使得模型更加簡單。

具體代碼實現上,scikit-learn 提供的 DecisionTreeClassifier 類可以做多分類任務。

1. DecisionTreeClassifier API 的使用

和其他分類器一樣,DecisionTreeClassifier 需要兩個數組作為輸入:
X: 訓練數據,稀疏或稠密矩陣,大小為 [n_samples, n_features]
Y: 類別標簽,整型數組,大小為 [n_samples]

from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)

模型擬合后,可以用於預測樣本的分類

clf.predict([[2., 2.]])
array([1])

此外,可以預測樣本屬於每個分類(葉節點)的概率,(輸出結果:0%,100%)

clf.predict_proba([[2., 2.]])
array([[0., 1.]])

DecisionTreeClassifier() 模型方法中也包含非常多的參數值。例如:

  • criterion = gini/entropy 可以用來選擇用基尼指數或者熵來做損失函數。
  • splitter = best/random 用來確定每個節點的分裂策略。支持 “最佳” 或者“隨機”。
  • max_depth = int 用來控制決策樹的最大深度,防止模型出現過擬合。
  • min_samples_leaf = int 用來設置葉節點上的最少樣本數量,用於對樹進行修剪。

2. 由鳶尾花數據集構建決策樹

鳶尾花數據集:
數據集名稱的准確名稱為 Iris Data Set,總共包含 150 行數據。每一行數據由 4 個特征值及一個目標值組成。
其中 4 個特征值分別為:萼片長度、萼片寬度、花瓣長度、花瓣寬度。
而目標值為三種不同類別的鳶尾花,分別為:Iris Setosa,Iris Versicolour,Iris Virginica。

DecisionTreeClassifier 既可以用於二分類,也可以用於多分類。
對於鳶尾花數據集,可以如下構建決策樹:

from sklearn.datasets import load_iris
from sklearn import tree
X, y = load_iris(return_X_y=True)
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, y)

2.1 簡單繪制決策樹

擬合完后,可以用plot_tree()方法繪制出決策樹來,如下圖所示

tree.plot_tree(clf)

2.2 Graphviz形式輸出決策樹

也可以用 Graphviz 格式(export_graphviz)輸出。
如果使用的是 conda 包管理器,可以用如下方式安裝:

conda install python-graphviz
pip install graphviz

以下展示了用 Graphviz 輸出上述從鳶尾花數據集得到的決策樹,結果保存為 iris.pdf

import graphviz
iris = load_iris()
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("iris")

export_graphviz 支持使用參數進行視覺優化,包括根據分類或者回歸值繪制彩色的結點,也可以使用顯式的變量或者類名。
Jupyter Notebook 還可以自動內聯呈現這些繪圖。

dot_data = tree.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

2.3 文本形式輸出決策樹

此外,決策樹也可以使用 export_text 方法以文本形式輸出,這個方法不需要安裝其他包,也更加的簡潔。

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree.export import export_text
iris = load_iris()
decision_tree = DecisionTreeClassifier(random_state=0, max_depth=2)
decision_tree = decision_tree.fit(iris.data, iris.target)
r = export_text(decision_tree, feature_names=iris['feature_names'])
print(r)
|--- petal width (cm) <= 0.80
|   |--- class: 0
|--- petal width (cm) >  0.80
|   |--- petal width (cm) <= 1.75
|   |   |--- class: 1
|   |--- petal width (cm) >  1.75
|   |   |--- class: 2

3. 繪制決策平面

繪制由特征對構成的決策平面,決策邊界由訓練集得到的簡單閾值組成。

print(__doc__)

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree

# Parameters
n_classes = 3
plot_colors = "ryb"
plot_step = 0.02

# Load data
iris = load_iris()

for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3],
                                [1, 2], [1, 3], [2, 3]]):
    # We only take the two corresponding features
    X = iris.data[:, pair]
    y = iris.target

    # Train
    clf = DecisionTreeClassifier().fit(X, y)

    # Plot the decision boundary
    plt.subplot(2, 3, pairidx + 1)

    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                         np.arange(y_min, y_max, plot_step))
    plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)

    plt.xlabel(iris.feature_names[pair[0]])
    plt.ylabel(iris.feature_names[pair[1]])

    # Plot the training points
    for i, color in zip(range(n_classes), plot_colors):
        idx = np.where(y == i)
        plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i],
                    cmap=plt.cm.RdYlBu, edgecolor='black', s=15)

plt.suptitle("Decision surface of a decision tree using paired features")
plt.legend(loc='lower right', borderpad=0, handletextpad=0)
plt.axis("tight")

plt.figure()
clf = DecisionTreeClassifier().fit(iris.data, iris.target)
plot_tree(clf, filled=True)
plt.show()
Automatically created module for IPython interactive environment

4. 數據集划分及結果評估

數據集獲取

from sklearn import datasets # 導入方法類

iris = datasets.load_iris() # 加載 iris 數據集
iris_feature = iris.data # 特征數據
iris_target = iris.target # 分類數據

數據集划分

from sklearn.model_selection import train_test_split

feature_train, feature_test, target_train, target_test = train_test_split(iris_feature, iris_target, test_size=0.33, random_state=42)

模型訓練及預測

from sklearn.tree import DecisionTreeClassifier

dt_model = DecisionTreeClassifier() # 所有參數均置為默認狀態
dt_model.fit(feature_train,target_train) # 使用訓練集訓練模型
predict_results = dt_model.predict(feature_test) # 使用模型對測試集進行預測

結果評估

scores = dt_model.score(feature_test, target_test)
scores
1.0

參考文檔

scikit-learn 1.10.1 DecisionTreeClassifier API User Guide
Example: a decision tree on the iris dataset


免責聲明!

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



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