DecisionTreeClassifier的參數criterion 與 splitter/使用紅酒數據集創建一個樹

剛剛使用SKLearn學習機器學習進行數據分析,分享一些概念和想法,希望可以大家一起討論,如果理解或者表達有不準確的地方,請多多指點,不吝賜教,非常感謝~~

本文將介紹sklearn的決策樹模塊
涉及到的理論知識,請轉至上篇《決策樹和隨機森林》:https://blog.csdn.net/weixin_42969619/article/details/98853206
涉及到數據集相關操作,請轉至《探索sklearn的數據集》:https://blog.csdn.net/weixin_42969619/article/details/99294615


  • 模塊sklearn.tree

sklearn中決策樹的類都在”tree“這個模塊之下。這個模塊總共包含五個類:

類名 說明
tree.DecisionTreeClassifier 分類樹
tree.DecisionTreeRegressor 迴歸樹
tree.export_graphviz 將生成的決策樹導出爲DOT格式,畫圖專用
tree.ExtraTreeClassifier 高隨機版本的分類樹
tree.ExtraTreeRegressor 高隨機版本的迴歸樹
  • DecisionTreeClassifier及重要參數:

class sklearn.tree.DecisionTreeClassifier (criterion=’gini’, splitter=’best’, max_depth=None,
min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=None,
random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None,
class_weight=None, presort=False)

1. criterion參數

用來決定使用哪種計算方式評估節點的“重要性”。
不填默認爲基尼不純度;填寫"gini"使用基尼係數; 填寫“entropy”使用信息增益
如何選取參數:
(1)通常就使用基尼係數
(2)數據維度很大,噪音很大時使用基尼係數
(3)維度低,數據比較清晰的時候,信息熵和基尼係數沒區別
(4)當決策樹的擬合程度不夠的時候,使用信息熵

2. splitter 參數

用來控制決策樹生成時,“節點”選擇方式的參數,有兩種取值:
(1)splitter=“best”:分枝時雖然隨機,但是還是會優先選擇更“重要”的特徵進行分枝
(2)splitter=“random”:一種“放棄治療”感覺的隨機(可能產生“過擬合”,因爲模型會因爲含有更多的不必要信息而更深更大)

  • 創建一棵樹
# 導入需要的算法庫和模塊
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz

# 數據集實例化,並劃分訓練集和測試集
# test_size 參數表示:測試集在數據集中的比例
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

# 建立模型
clf = tree.DecisionTreeClassifier(criterion="entropy",splitter="random")
clf = clf.fit(Xtrain,Ytrain)

#  畫出一棵樹
feature_name = ['酒精','蘋果酸','灰','灰的鹼性','鎂','總酚','類黃酮','非黃烷類酚類','花青素','顏色強度','色調','od280/od315稀釋葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
                               ,out_file = None
                               ,feature_names= feature_name			# 這個參數是將特徵變量名“可視化”,否則會返回“數據集中key="feature_names"對應值列表的索引”
                               ,class_names=["琴酒","雪莉","貝爾摩德"]			# 這個參數可以定義的個數,取決於數據集中key=“target_names”的個數,紅酒數據集的標籤有三個
                               ,filled=True		# 生成的樹展示出來是否填充顏色
                               ,rounded=True		# 展示出來的樹的“框框”是都有棱角~
                               )
graph = graphviz.Source(dot_data)
graph

在這裏插入圖片描述
說明:
(1)數據集實例化後劃分訓練集和測試集是“隨機的”!運行一次,隨機劃分一次,結果可能改變一次
(2)訓練集和測試集的劃分如果只運行一次,則數據是固定的;但是“建模”的結果仍然是“隨機的”

問題:如果“criterion”參數是敲定特徵重要性的;“splitter”是決定如何選擇節點的(無論參數值如何,都是生成很多棵樹,返回最優的一顆)那麼爲什麼在只定義了“criterion”時,還會運行結果隨機?

注意:sklearn要求數據的特徵矩陣必須至少是一個二維矩陣。不接受任何一維矩陣作爲特徵矩陣被輸入。如果你的數據的確只有一個特徵,那必須用reshape(-1,1)來給矩陣增維;如果你的數據只有一個特徵和一個樣本,使用reshape(1,-1)來給你的數據增維。

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