機器學習3決策樹算法及其可視化

決策樹:從根節點開始一步步走到葉子節點
所有的數據最終都會落到葉子節點,既可以做分類也可以做迴歸
從根結點到每個葉結點的路徑對應了一個判定測試序列
在這裏插入圖片描述
葉子節點:最終的決策結果
增加節點:相當於在數據中切一刀
(每個內部節點表示在一個屬性上的測試
每個分枝代表一個測試輸出)

訓練階段:從給定的數據集構造出一棵樹
決策樹的生成由兩個階段組成
1.使用屬性選擇度量來選擇 將元組最好的劃分爲不同的類 的屬性,遞歸的通過選定的屬性,來劃分樣本
2.決策樹建立時,許多分枝反映的是訓練數據中的噪聲和離羣點,樹剪枝試圖識別並剪去這種分枝,以提高對未知數據分類的準確性
測試階段:根據構造出來的樹模型從上到下走一遍就好了

熵:隨機變量不確定性的度量 混亂程度
栗子:A【1,1,1,1,2】
B【1,1,2,2,3】
顯然A集合熵值要低,A裏面只有兩種類別

常用的屬性選擇度量
• Gini指數
Gini(s)越接近0, s中元素越同質在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
• 信息增益(增益率)
在這裏插入圖片描述
在這裏插入圖片描述
信息增益:特徵X使得類Y的不確定性減少的程度
依據信息增益依次選擇根結點

爲什麼要剪枝:決策樹過擬合風險很大,理論上可以完全分得開數據(防止分類中的過分適應)
剪枝策略:預剪枝,後剪枝
預剪枝:邊建立決策樹邊進行剪枝的操作(限制深度,葉子節點個數葉子節點樣本數,信息增益量等)
後剪枝:當建立完決策樹後來進行剪枝操作(通過一定的衡量標準)

估算類別概率
tree_clf.predict_proba()
tree_clf.predict()

決策樹的建立
•選取最優的特徵(最大信息)作爲根節點, 並進行劃分
•劃分之後, 在每個子集上選擇最優的特徵作 爲子樹的根節點
•遞歸上述過程, 直到剩餘子集同質或幾乎同質

CART訓練算法
首先,使用單個特徵 K 和閾值 t[k]
J( k,t[k] ) = m[left]/mG[left] + m[right]/mG[right]
m[left][right] 左右子集的實例數量
G[left][right]左右子集的不純度

一旦成功將訓練集一分爲二,它將使用相同的邏輯,繼續分裂子集,然後是子集的子集,依次循環遞進。直到抵達最大深度(由超參數max_depth控制)
在這裏插入圖片描述
•非數值型特徵
•基於該特徵上分量的基數k劃分爲k個子 集(子節點)
•數值型特徵
•劃分爲2個子集(子節點)
•劃分位置通過GINI_SPLIT或GAIN選擇

計算複雜度
進行預測需要從根到葉遍歷決策樹。通常來說,決策樹大致平衡,因此遍歷決策樹需要經歷大約O( log2(m) )

正則化超參數
DecisionTreeClassifier 類還有一些其他的參數,同樣可以限制決策樹的形狀:
min_samples_split (分裂前節點必須有的最小樣本數)
min_samples_leaf(葉節點必須有的最小樣本數量)
max_leaf_nodes(最大葉節點數量)
max_features(分裂每個節點評估的最大特徵數量)

from sklearn.datasets.california_housing import fetch_california_housing
housing = fetch_california_housing()
print(housing.DESCR)

構建決策樹模型:

from sklearn import tree
dtr = tree.DecisionTreeRegressor(max_depth = 2)
dtr.fit(housing.data[:,[6,7]],housing.target)         fit(X,Y)
from sklearn.model_selection import train_test_split
data_train,data_test,target_train,target_test = \
    train_test_split(housing.data,housing.target,test_size=0.1,random_state=42)
dtr.fit(data_train,target_train)
dtr.score(data_test,target_train)

隨機森林模型調用:

from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor( random_state = 42 )
rfr.fit(data_train,target_train)                 #訓練
rfr.score(data_test,target_test)              #測試

#要可視化展示 首先需要安裝 graphviz以及pydotplus #pip install pydotplus

dot_data = tree.export_graphviz(
                                      dtr,
                                      out_file =None,
                                      feature_names = housing.feature_names[6:8],
                                      filles = Ture,
                                      impurity = False,
                                      rounded = True
                            )
import pydotplus
graph = pydotplus.graph_from_data(dot_data)
graph = get_nodes()[7].set_fillcolor("#FFF2DD")
from IPython.display import Image
Image( graph.create_png() )

參數的選擇

from sklearn.grid_search import GridSearchCV
tree_param_grid ={'min_samples_split':list((3,6,9)),'n_estimators':list((10,50,100))}
grid = GridSearchCV(RandomForestRegressor(),param_grid=tree_param_grid,cv=5)
grid.fit(data_train,target_train)
grid.grid_scores_,grid.best_params_,grid.best_score_

可視化:
需要安裝graphivz軟件

import pydotplus
import os
import graphviz
from IPython.display import Image
from sklearn import tree

os.environ["PATH"] += os.pathsep + 'D://bin//'         #用於graphviz設置系統路徑
dot_data = tree.export_graphviz(re, out_file=None,   #re爲構造的決策樹模型
                                feature_names=[' ',' ',' '],       #特徵標籤
                                filled=True, rounded=True,
                                special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('example.png')    #保存圖像
Image(graph.create_png())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章