決策樹是一種非參數的監督學習方法。
模塊:Sklearn.tree
sklearn建模的步驟:
1、選擇並建立模型 例:clf = tree.DecisionTreeClassifier()
2、提供數據訓練模型 例:clf = clf.fit(X_train,y_train)
3、獲取需要的信息 例:result = clf.score(X_test,y_test)
分類樹中的參數:
一、criterion
criterion是用來決定不純度的計算方法,不純度越低,擬合效果越好。
參數值:entropy(信息熵)、gini(基尼係數)
二、random_state
隨機種子。在高維度時比較明顯。
三、splitter
控制隨機選項
參數值:best(優先選擇重要的特徵進行分支)、random(分支時更隨機,可以防止過擬合)
下面是一些用於剪枝的參數:
四、max_depth
剪枝,限制最大深度,在高緯度低樣本量時有效。可以防止過擬合。
五、min_samples_leaf
當分出的子節點小於min_sample_leafs就直接剪枝,不會往下分。當數值設置的過小時,會過擬合;過大的話,會阻止學習。
六、min_samples_split
一個節點必須包含min_samples_split的訓練樣本纔會被分支
七、max_features
限制分支時考慮的特徵個數,超過限制個數就會被捨棄
八、min_impurity_decrease
信息增益是指子節點與父節點的信息熵的差值。這個參數用於設定,當信息增益小於閾值時,就不再分支。
以紅酒數據爲例:
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
由於數據集是一個字典,可以通過 ”.鍵“ 的方式將數據打印出來:
數據的標籤可以分爲0、1、2 。所以他是一個三分類的數據。
接下來做一個最簡單的分類:
#將數據集分爲訓練集和測試集
x_train,x_test,y_train,y_test = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=0,splitter='best')
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test)
print(score)
這樣就得出了一個90%正確率的模型
然後可以查看哪一個元素在決策樹中比較重要:
print([*zip(feature_name,clf.feature_importances_)])
就可以得到:
當我們嘗試了幾種剪枝方法,但效果不明顯時,可以做超參數的學習曲線。
例如,我們改變最大層數:
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=0,splitter='best',max_depth=i+1)
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test)
test.append(score)
plt.plot(range(1,11),test,'r')
plt.legend()
plt.show()
就可以繪製出這樣的線段:
所以可以瞭解到當max_depth=2的時候是最好的。
接下來再介紹兩個重要的結果接口:
clf.apply(x_test) 他會返回測試樣本所在的葉子節點
clf.predict(x_test) 他會返回測試樣本的結果
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=0,splitter='best',max_depth=2)
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test)
print(x_test[0])
print(clf.predict(x_test[0].reshape(1,-1)))
由於sklearn不接受一維的特徵,所以用reshape(1,-1)來增維,也可以直接在外面加 [ ]