機器學習筆記1——分類樹DecisionTreeClassifier

DecisionTreeClassifier與紅酒數據集

1.重要參數

criterion

Criterion這個參數正是用來決定不純度的計算方法的。sklearn提供了兩種選擇:
1)輸入”entropy“,使用信息熵(Entropy)
2)輸入”gini“,使用基尼係數(Gini Impurity)
不填默認基尼係數,填寫entropy使用信息增益通常就使用基尼係數,數據維度很大,噪音很大時使用基尼係數。維度低,數據比較清晰的時候,信息熵和基尼係數沒區別。當決策樹的擬合程度不夠的時候,使用信息熵


random_state & splitter

random_state用來設置分枝中的隨機模式的參數,默認None,在高維度時隨機性會表現更明顯,低維度的數據隨機性幾乎不會顯現。輸入任意整數,會一直長出同一棵樹,讓模型穩定下來。

splitter是用來控制決策樹中的隨機選項的,有兩種輸入值。
輸入”best",會優先選擇更重要的特徵進行分枝。
輸入“random",樹會因爲含有更多的不必要信息而更深更大,並因這些不必要信息而降低對訓練集的擬合。可防止過擬合。

max_depth

限制樹的最大深度,超過設定深度的樹枝全部剪掉。這是用得最廣泛的剪枝參數,在高維度低樣本量時非常有效。建議從max_depth = 3開始嘗試,看看擬合的效果再決定是否增加設定深度,可以有效限制過擬合。

min_samples_leaf & min_samples_split

min_samples_leaf 限制一個子節點的分支至少包含多少個樣本。
建議從min_samples_leaf = 5 開始檢測擬合度進行調參。

max_features限制分枝時考慮的特徵個數,超過限制個數的特徵都會被捨棄,在不知道決策樹中的各個特徵的重要性時,可能會導致模型學習不足。

min_impurity_decrease

min_impurity_decrease限制信息增益的大小,信息增益小於設定數值的分枝不會發生

2.進行紅酒數據集的訓練

作出迴歸樹

from sklearn import tree  # 導入樹
from sklearn.datasets import load_wine  # 生成數據集的模塊
from sklearn.model_selection import train_test_split  # 訓練集測試集分類
import pandas as pd
import matplotlib.pyplot as plt
import graphviz  # 用於畫出決策樹

# 實例化數據
wine = load_wine()

# 使用pandas轉化爲表的形式
table = pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
# print(table)

# print(wine.feature_names)  #特徵名稱
# print(wine.target_names)   #標籤名

# 測試集與訓練集的分類
# wine.data 數據集
# wine.target 標籤集
# test_size=0.3表示30%作爲測試集,70%作爲訓練集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
# print(Xtrain.shape) #查看數據結構

# 實例化分類樹
clf = tree.DecisionTreeClassifier(criterion = "entropy"
                                    ,random_state = 30
                                    ,splitter = "random"
                                    #,max_depth =
                                    ,min_samples_leaf = 5
                                    ,min_samples_split = 5
    )
clf = clf.fit(Xtrain, Ytrain) # 將數據帶入訓練,fit()是用於訓練的接口

score = clf.score(Xtest, Ytest) # 返回預測的準確度
print("測試集的準確度:",score)
# apply返回每個測試樣本所在的葉子節點的索引
print(clf.apply(Xtest))
# predict返回每個測試樣本的分類/迴歸結果
print(clf.predict(Xtest))



# feature_name 特徵名
# class_name 標籤名
# filled 是否使用顏色,不純度越高顏色越淺
# rounded 是否使用圓角邊框
feature_name = ['酒精','蘋果酸','灰','灰的鹼性','鎂','總酚','類黃酮','非黃烷類酚類','花青素','顏色強度','色調','od280/od315稀釋葡萄酒','脯氨酸']

dot_data = tree.export_graphviz(clf
        ,out_file = None
        ,feature_names= feature_name
        ,class_names=["琴酒","雪莉","貝爾摩德"]
        ,filled=True
        ,rounded=True
)

# 畫出決策樹
graph = graphviz.Source(dot_data.replace('helvetica','"Microsoft YaHei"'), encoding='utf-8')
graph.render('wine')

# 將特徵名稱與特徵的重要性做表查看
print([*zip(feature_name,clf.feature_importances_)])

分類樹展示

在這裏插入圖片描述

3.超參數的學習曲線

超參數的學習曲線,是一條以超參數的取值爲橫座標,模型的度量指標爲縱座標的曲線,它是用來衡量不同超參數取值下模型的表現的線。在我們建好的決策樹裏,我們的模型度量指標就是score。

from sklearn import tree  # 導入樹
from sklearn.datasets import load_wine  # 生成數據集的模塊
from sklearn.model_selection import train_test_split  # 訓練集測試集分類
import pandas as pd
import matplotlib.pyplot as plt
import graphviz  # 用於畫出決策樹

# 實例化數據
wine = load_wine()

# 使用pandas轉化爲表的形式
table = pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
# print(table)


# 測試集與訓練集的分類
# wine.data 數據集
# wine.target 標籤集
# test_size=0.3表示30%作爲測試集,70%作爲訓練集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
# print(Xtrain.shape) #查看數據結構

# 繪製調參曲線
test = [] # 用於存儲每次參數設置的score結果
for i in range(10):
    clf = tree.DecisionTreeClassifier(criterion = "entropy"
                                         ,random_state = 30
                                         ,splitter = "random"
                                         ,max_depth = i+1
                                         ,min_samples_leaf = 5
                                         ,min_samples_split = 5
     )
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, Ytest)
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

超參數學習曲線展示

由於劃分訓練集和測試集時的隨機性,所以每次運行得出的分類樹與超參數學習曲線都會有所不同

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