決策樹(Decision Tree)
決策樹利用特征的值將數(shù)據(jù)分解成具有相似類的較小的子集,這種遞歸劃分的探索法稱之為分而治之。

如果一個節(jié)點停止,它可能有以下幾種情況:
1.節(jié)點上所有(幾乎所有)的案例都屬于同一類
2.沒有剩余的特征來分辨案例之間的區(qū)別
3.決策樹已經(jīng)到達預(yù)先定義的大小限制
劃分選擇
希望決策樹的分支結(jié)點所包含的樣本盡可能屬于同一類別
1.信息熵(Information Entropy)
信息熵是度量樣本集合純度最常用的指標 / 可用于量化數(shù)字信息的價值。
熵的值越小,則樣本集合純度越高。
某隨機事件結(jié)果的種類越多,則該事件的熵越大。某隨機事件的各種可能發(fā)生的結(jié)果概率越均勻,則該事件的熵越大。

2.信息增益(Information Gain) ID3決策樹學(xué)習(xí)算法

一般而言,信息增益越大,則意味著使用屬性α來進行劃分所獲得的“純度提升”越大。
3.增益率(Gain Ratio) C4.5決策樹學(xué)習(xí)算法


C4.5先從候選劃分屬性中找出信息增益高于平均水平的屬性,再從中選擇增益率高的。
4..基尼指數(shù)(Gini Index) CART決策樹學(xué)習(xí)算法

基尼指數(shù)值越小,數(shù)據(jù)集純度越高。
剪枝處理
如果決策樹增長過大,將會使許多決策樹過于具體,模型將會過度擬合訓(xùn)練數(shù)據(jù)。
解決方法:剪枝
1.預(yù)剪枝
當決策樹達到一定數(shù)量的決策,或者決策節(jié)點僅含有少量的案例,我們就停止樹的增長。
(在決策樹的生成過程中,對每個結(jié)點在劃分前先進行估計,如果當前結(jié)點的劃分不能帶來決策樹泛華性能提升,則停止劃分并將當前結(jié)點標記為葉結(jié)點。)
2.后剪枝
如果一顆決策樹生長得過大,就根據(jù)節(jié)點處的錯誤率使用修剪準則將決策樹減小到合適的大小
(先從訓(xùn)練集生成一顆完整的決策樹,然后自底而上地對非葉結(jié)點進行考察,如果將該結(jié)點對應(yīng)的子樹替換為葉結(jié)點能決策樹泛華性能提升,則將該子樹替換為葉結(jié)點)
C5.0算法優(yōu)點之一就是它可以自動剪枝,即它關(guān)注許多決策,能自動使用相對合理的默認值。
max_depth:樹的最大深度
min_samples_split:繼續(xù)分裂一個結(jié)點最少需要的訓(xùn)練樣本數(shù)min_samples_leaf:葉子結(jié)點最少含有的訓(xùn)練樣本數(shù)max_leaf_nodes:葉子結(jié)點的最大總數(shù)
min_impurity_decrease:用于計算葉子結(jié)點的最小純度
這些參數(shù)可如何控制分裂結(jié)點特征的選取和防止過度擬合的訓(xùn)練后剪枝。
例子
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier(criterion="entropy")#初始化用熵模型
clf = clf.fit(X, Y) #訓(xùn)練
print(clf.predict([[2, 2]])) #預(yù)測
print(clf.feature_importances_) #查看特征重要性
#用決策樹對鳶尾花分類
from sklearn.datasets import load_iris
iris=load_iris()
iris_feature=iris.data #特征數(shù)據(jù)
iris_target=iris.target #分類數(shù)據(jù)
print(iris.target) #被分為了3類,前50位0,中間50為1,后面為2
print(iris.data.shape) #150個樣本,每個樣本4個特征
from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier() #所有參數(shù)為默認
dtc.fit(iris.data,iris.target) #對訓(xùn)練集訓(xùn)練數(shù)據(jù)
predict=dtc.predict(iris.data) #對測試集進行預(yù)測
print(predict)
#把分類好的數(shù)據(jù)集繪制散點圖
X=iris.data
C1=[x[0] for x in X]
C2=[x[1] for x in X]
import matplotlib.pyplot as plt
plt.scatter(C1,C2,c=predict,marker='x')
plt.title("Decision Tree Classifier")
plt.show()

樹的可視化
需下載graphviz
總結(jié)
