決策樹是如何工作的:
圖一 圖二
將數據根據特征分析,可以分成:根節點(初始節點)、中間節點、葉節點(無再可分節點)。
注:其實根據表格我們可以分析出來三個維度(表頭、數據、標簽),數據用來描述表頭,表頭用來反映標簽。
微信群:回復K 進群
決策樹算法的核心是要解決兩個問題:
1)如何從數據表中找出最佳節點和最佳分枝?
2)如何讓決策樹停止生長,防止過擬合?
sklearn建模流程:
1)實例化算法對象 ——》 2)通過模型訓練模型 ——》3)通過模型接口獲取信息
代碼如下:
from sklearn import tree #導入需要的模塊 clf = tree.DecisionTreeClassifier() #實例化算法對象,需要使用參數 clf = clf.fit(X_train,y_train) #用訓練集數據訓練模型 result = clf.score(X_test,y_test) #打分,導入測試集,從接口中調用需要的信息
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)
參數解釋:
criterion
為了要將數據轉化為一棵樹,決策樹需要找出最佳節點和最佳的分枝方法,對分類樹來說,衡量這個“最佳”的指標叫做“不純度”。通常來說不純度越低,決策樹對訓練集的擬合越好。現在使用的決策樹算法在分枝方法上的核心大多是圍繞在對某個不純度相關指標的最優化上。 不純度基於節點來計算,樹中的每個節點都會有一個不純度,並且子節點的不純度一定是低於父節點的,也就是說,在同一棵決策樹上,葉子節點的不純度一定是最低的。 criterion這個參數正是用來決定不純度的計算方法的。sklearn提供了兩種選擇:
criterion='entropy' #信息熵(Entropy) criterion='gini’#基尼系數(Gini Impurity)
比起基尼系數,信息熵對不純度更加敏感,對不純度的懲罰最強。信息熵的計算比基尼系數緩慢一些,因為基尼系數的計算不涉及對數。所以推薦建議使用基尼系數,但也不是不是絕對。不填默認基尼系數。
random_state
設置分枝中的隨機模式的參數,默認None,在高維度時隨機性會表現更明顯,低維度的數據 隨機性幾乎不會顯現。輸入任意整數,會一直長出同一棵樹,讓模型穩定下來。
splitter
控制決策樹中的隨機選項的,有兩種輸入值,輸入“best”,決策樹在分枝時雖然隨機,但是還是會 優先選擇更重要的特征進行分枝(重要性可以通過屬性feature_importances_查看),輸入“random",決策樹在分枝時會更加隨機,樹會因為含有更多的不必要信息而更深更大,並因這些不必要信息而降低對訓練集的擬合。這也是防止過擬合的一種方式。當你預測到你的模型會過擬合,用這兩個參數來幫助你降低樹建成之后過擬合的可能性。當然,樹一旦建成,我們依然是使用剪枝參數來防止過擬合。
代碼練習:
#1.引入庫文件 from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split #2.獲取sklearn自動紅酒數據集 wine = load_wine() wine.data.shape wine.target #如果wine是一張表,應該長這樣: import pandas as pd pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1) wine.feature_names wine.target_names #3. 分訓練集和測試集 Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3) Xtrain.shape Xtest.shape #4. 建立模型 clf = tree.DecisionTreeClassifier(criterion="gini") clf = clf.fit(Xtrain, Ytrain) #apply返回每個測試樣本所在的葉子節點的索引 print(clf.apply(Xtest)) #predict返回每個測試樣本的分類/回歸結果 print(clf.predict(Xtest)) score = clf.score(Xtest, Ytest) #返回預測的准確度 score #5.決策樹 feature_name = ['酒精','蘋果酸','灰','灰的鹼性','鎂','總酚','類黃酮','非黃烷類酚類','花青素','顏色強度','色調','od280/od315稀釋葡萄酒','脯氨酸'] import graphviz dot_data = tree.export_graphviz(clf,out_file = None,feature_names= feature_name,class_names=["琴酒","雪莉","貝爾摩德"],filled=True,rounded=True) graph = graphviz.Source(dot_data) graph.save()#保存決策樹 #特征重要性 clf.feature_importances_ [*zip(feature_name,clf.feature_importances_)] #我們的樹對訓練集的擬合程度如何? score_train = clf.score(Xtrain, Ytrain) score_train
那具體怎么來確定每個參數填寫什么值呢?這時候,我們就要使用確定超參數的曲線來進行判斷了。
import matplotlib.pyplot as plt test = [] for i in range(10): clf = tree.DecisionTreeClassifier(max_depth=i+1 ,criterion="entropy" ,random_state=30 ,splitter="random" ) 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()
可以根據顯示圖形確定參數選擇: