sklearn庫學習之決策樹
阿新 • • 發佈:2018-10-31
決策樹
學習決策樹,就是學習一系列if/else問題,在機器學習中,這些問題叫做測試,演算法搜尋所有可能的測試,找出對目標變數來說資訊量最大的哪一個。
演算法過程生成一棵二元決策樹,其中每個結點都包含一個測試。將每個測試看成沿著一條軸對當前資料進行劃分,由於每個測試僅僅關注一個特徵,所以劃分後的區域邊界始終與座標軸平行。反覆劃分,直到決策樹的每個葉結點變成純的。
檢視新資料點位於特徵空間劃分的哪個區域,即基於每個結點的測試對樹進行遍歷,找到新資料點所屬的葉結點。
分類:將該區域的多數目標值作為預測結果。
迴歸:葉結點中所有訓練點的平均目標值。
防止過擬合的兩種策略:
- 預剪枝:及早停止樹的增長,限制樹的最大深度、限制葉結點的最大數目、規定結點中資料點的最小數目。
- 後剪枝:先構造樹,然後刪除資訊量很小的結點。
優點:
- 得到的模型容易視覺化
- 演算法完全不受資料縮放的影響,決策樹演算法不需要特徵預處理
缺點:
- 經常會過擬合,泛化效能很差
#在乳腺癌資料集上檢視預剪枝的效果 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