python分類分析--決策樹算法原理及案例

1、決策樹概括

- 目標值是分類型變量,特徵值(屬性值/自變量)可以是分類型,也可以是連續型。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yK2tQugK-1582521701618)(attachment:image.png)]

2、決策樹的劃分依據—信息增益、信息增益比

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TthfhBWR-1582521701620)(attachment:image.png)]

決策樹的生成:

- 貪婪算法:只能局部最優(具有單一屬性分類的節點最佳,到此節點認爲分類達到準確)
- 根據某一屬性對數據進行分裂,以達到某一標準的最優值

3、3種決策樹的原理

·ID3

準則:信息增益最大的準則

·C4.5

。信息增益比最大的準則

·CART

。分類樹:基尼係數(GINI)最小的準則在sklearn中可以選擇劃分的默認原則
。優勢;劃分更加細緻(從後面例子的樹顯示來理解)

4、決策樹API

·class sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)
    。決策樹分類8器
    。criterion:默認是'gini'係數,也可以選擇信息增益的'entropy'
    。max_depth:樹的深度大小
    。random_state:隨機數種子

5、tree可視化

安裝GraphViz

下載地址:https://graphviz.gitlab.io/_pages/Download/Download_windows.html
選擇msi文件下載,安裝即可。安裝完成後,將bin目錄加入到系統path環境變量中

安裝graphviz的python庫

使用conda install python-graphviz(或者 pip install graphviz)命令安裝即可   

安裝pydotplus

cmd下pip install pydotplus

生成樹文本的API:

sklearn.tree.export_graphviz(estimator,out_file='tree.dot',feature_names=["","",...]) #該函數能夠導出DOT格式

tree.export_graphviz(模型預估器,導出目錄,特徵值(變量)名稱)

可視化展現API

網站:http://webgraphviz.com/    然後粘貼tree.dot,並執行(需要安裝和配置環境變量)

或者:打開cmd,切換到tree.dot目錄下,執行:dot -Tpdf tree.dot -o output.pdf ,打開pdf

6、案例實現

from sklearn import datasets      #機器學習數據集庫
from sklearn.model_selection import train_test_split  #數據集劃分
from sklearn.tree import DecisionTreeClassifier   #可以按照ginf係數或者信息增益entropy的決策樹算法
from sklearn.model_selection import GridSearchCV    #網格搜索和交叉驗證
from sklearn.tree import export_graphviz  #決策樹可視化文件生成

'''# 1 獲取數據:使用datasets.load_iris的數據'''
#sklearn.datasets.load_*()        # *:表示某個數據集的名稱,load_:獲取小規模數據集
df = datasets.load_iris()       #iris:花的數據集
# display(df.data)  #返回特徵值(自變量)數組
# display(df.target) #返回目標值(因變量)數組
# print(df["DESCR"]) #返回描述信息
# display(df["feature_names"]) #返回特徵值的字段名稱
# display(df.feature_names) #返回特徵值的字段名稱
# display(df.target_names) #返回目標值數字對應解釋

'''# 2 數據清新(略)'''

'''# 3 數據集劃分'''
x_train,x_test,y_train,y_test = train_test_split(df.data,df.target,test_size=0.25,random_state=11)
print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)

'''# 4 特徵工程(略)'''

'''# 5、tree預估器訓練模及型選擇'''
#實例化一個轉換器類
#estimator = DecisionTreeClassifier(criterion='gint',max_depth=None,random_state=11)

#加入模型選擇與調優,網格搜索和交叉驗證
#網格搜索和交叉驗證原理:下一集
estimator = DecisionTreeClassifier(random_state=11)
#準備參數
param_dict = {"criterion":['entropy','gini']}
estimator = GridSearchCV(estimator,param_grid=param_dict,cv=10) #cv=10是10折交叉驗證

#執行預估器
estimator.fit(x_train,y_train)

'''# 6、模型評估選擇'''
#方法1:比對真實值和預測值
y_predict = estimator.predict(x_test)  #計算預測值
print(y_predict)
#方法2:直接計算準確率
accuracy=estimator.score(x_test,y_test)
print(accuracy)

# 3、查看網格搜索和交叉驗證返回結果
# 最佳參數:best_params_
print("最佳參數k:",estimator.best_params_)
# 驗證集的最佳結果:best_score_
print("驗證集的最佳結果準確率:",estimator.best_score_)
# 最佳估計器:best_estimator_
print("最佳估計器",estimator.best_estimator_)
# 交叉驗證結果:cv_results_
# print(estimator.cv_results_)  #比較長這裏就不輸出了

'''tree可視化文件.dot的生成'''
export_graphviz(estimator.best_estimator_,out_file=r'tree.dot',feature_names=df.feature_names)
#estimator.best_estimator_ :使用最終估計器
# 然後打開cmd,切換到tree.dot目錄下,執行:dot -Tpdf tree.dot -o output.pdf ,打開pdf
['sepal length (cm)',
 'sepal width (cm)',
 'petal length (cm)',
 'petal width (cm)']



['sepal length (cm)',
 'sepal width (cm)',
 'petal length (cm)',
 'petal width (cm)']


(112, 4) (38, 4) (112,) (38,)
[2 2 1 2 2 0 1 0 0 1 1 1 1 2 2 0 2 1 2 2 1 0 0 1 0 0 1 1 0 2 0 2 2 0 0 2 2
 2]
0.8421052631578947
最佳參數k: {'criterion': 'entropy'}
驗證集的最佳結果準確率: 0.9642857142857143
最佳估計器 DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=11,
            splitter='best')

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PkIPOaY2-1582521701622)(attachment:image.png)]

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