1、決策樹概括
- 目標值是分類型變量,特徵值(屬性值/自變量)可以是分類型,也可以是連續型。
2、決策樹的劃分依據—信息增益、信息增益比
決策樹的生成:
- 貪婪算法:只能局部最優(具有單一屬性分類的節點最佳,到此節點認爲分類達到準確)
- 根據某一屬性對數據進行分裂,以達到某一標準的最優值
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')