1. 程式人生 > >sklearn庫學習之決策樹

sklearn庫學習之決策樹

決策樹

學習決策樹,就是學習一系列if/else問題,在機器學習中,這些問題叫做測試,演算法搜尋所有可能的測試,找出對目標變數來說資訊量最大的哪一個。
演算法過程生成一棵二元決策樹,其中每個結點都包含一個測試。將每個測試看成沿著一條軸對當前資料進行劃分,由於每個測試僅僅關注一個特徵,所以劃分後的區域邊界始終與座標軸平行。反覆劃分,直到決策樹的每個葉結點變成純的。

檢視新資料點位於特徵空間劃分的哪個區域,即基於每個結點的測試對樹進行遍歷,找到新資料點所屬的葉結點。
分類:將該區域的多數目標值作為預測結果。
迴歸:葉結點中所有訓練點的平均目標值。

防止過擬合的兩種策略:

  1. 預剪枝:及早停止樹的增長,限制樹的最大深度、限制葉結點的最大數目、規定結點中資料點的最小數目。
  2. 後剪枝:先構造樹,然後刪除資訊量很小的結點。

優點:

  1. 得到的模型容易視覺化
  2. 演算法完全不受資料縮放的影響,決策樹演算法不需要特徵預處理

缺點:

  1. 經常會過擬合,泛化效能很差
#在乳腺癌資料集上檢視預剪枝的效果
import os
os.environ["PATH"] += os.pathsep + r'the Graphviz bin file address on your system'
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import mglearn
import matplotlib.pyplot as plt
import numpy as np

cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify = cancer.target, random_state = 42)

#先使用預設設定構建模型
tree = DecisionTreeClassifier(random_state = 0)
tree.fit(X_train,y_train)

#未剪枝的樹容易過擬合,對新資料的泛化效能不佳
print("Accuracy on training set: {:.3f}".format(tree.score(X_train,y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test,y_test)))

#預剪枝
tree = DecisionTreeClassifier(max_depth = 4, random_state = 0)
tree.fit(X_train,y_train)
print("Accuracy on training set: {:.3f}".format(tree.score(X_train,y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test,y_test)))

#分析決策樹,將樹視覺化
from sklearn.tree import export_graphviz #生成.dot格式檔案
export_graphviz(tree, out_file = "tree.dot",class_names = ['malignant','benign'],feature_names = cancer.feature_names,
               impurity = False, filled = True) #為結點新增顏色,傳入類別名稱和特徵名稱

#利用graphviz模組讀取.dot檔案並可視化
#觀察樹,找出大部分資料的實際路徑
import graphviz
with open("tree.dot") as f:
    dot_graph = f.read()
graphviz.Source(dot_graph)


#樹的特徵重要性
print("Feature importance:\n{}".format(tree.feature_importances_))

#將特徵重要性視覺化
def plot_feature_importances_cancer(model):
    n_features = cancer.data.shape[1]
    plt.barh(range(n_features),model.feature_importances_,align = 'center')
    plt.yticks(np.arange(n_features),cancer.feature_names)
    plt.xlabel("Feature importance")
    plt.ylabel("Feature")

#如果某特徵的重要性較小,說明該特徵沒有被樹選中,或另一個特徵也包含了相同的資訊
plot_feature_importances_cancer(tree)

DecisionTreeRegressor以及其他所有基於樹的迴歸模型不能外推,也不能在訓練資料範圍之外進行預測。

對程式碼中的疑惑

Python sklearn庫中決策樹tree.DecisionTreeClassifier()函式引數介紹
https://blog.csdn.net/li980828298/article/details/51172744

Matplotlib快速繪圖
https://www.cnblogs.com/peihao/p/5290075.html