1.什么是決策樹
決策樹是一種解決分類問題的算法。
決策樹采用樹形結構,使用層層推理來實現最終的分類。
決策樹由下邊幾種元素組成:
- 根節點:包含樣本的全集
- 內部節點:對應特征屬性測試
- 葉節點:代表決策的結果

預測時,在樹的內部節點處用某一屬性值進行判斷,根據判斷結果決定進入哪個分支節點,直到到達葉節點處,得到分類結果。
這是一種有監督的學習算法,決策樹的這些規則通過訓練得到,而不是人工制定的.
決策樹是最簡單的機器學習算法,易於實現,可解釋性強,完全符合人類的直觀思維,有着廣泛的應用.
2.決策樹的原理
構造決策樹:
構造決策樹的關鍵步驟是分裂屬性,所謂分裂屬性就是在某個節點處按照某一特征屬性的不同划分構造不同的分支,其目標是讓各個分裂子集盡可能地“純”。盡可能“純”就是盡量讓一個分裂子集中待分類項屬於同一類別。
構造決策樹的關鍵性內容是進行屬性選擇度量,屬性選擇度量是一種選擇分裂准則,它決定了拓撲結構及分裂點split_point的選擇。
屬性選擇度量算法有很多,一般使用自頂向下遞歸分治法,並采用不回溯的貪心策略。
3.決策樹實戰講解鳶尾花分類問題
1 import numpy as np 2 3 from sklearn.tree import DecisionTreeClassifier 4 5 from sklearn import datasets 6 7 import matplotlib.pyplot as plt 8 %matplotlib inline 9 10 from sklearn import tree 11 from sklearn.model_selection import train_test_split
# 加載鳶尾花數據 iris=datasets.load_iris() X=iris['data'] y=iris['target'] # 查看鳶尾花類別的名字 feature_names=iris.feature_names # 將數據分為訓練數據和測試數據,比例是4:1 X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=1024)
# 訓練數據,預測鳶尾花的種類 # entropy 熵 采用的分類標准是熵,也可以使用gini系數 max_depth 參數表示的是樹的深度,默認是最大深度,當然,樹的深度越大,精度越高, clf=DecisionTreeClassifier(criterion='entropy') clf.fit(X_train,y_train) y_=clf.predict(X_test) from sklearn.metrics import accuracy_score # 計算准確率 accuracy_score(y_test,y_)
# 查看樹的結構 plt.figure(figsize=(18,12)) # filled填充顏色 _=tree.plot_tree(clf,filled=True,feature_names=feature_names) plt.savefig('./tree.jpg')

接下來分析一下這個棵樹:
(1)其實是按照熵來划分的,那么什么是熵(entropy)呢,計算公式是什么?
熵其實是信息論與概率統計學中的概念,但是在機器學習中用到的也很多.信息熵公式:代表隨機變量不確定度的度量
不確定性的變化跟什么有關呢?
一,跟事情的可能結果的數量有關;二,跟概率有關
所以熵的公式:
或者
信息論之父克勞德·香農,總結出了信息熵的三條性質:
- 單調性,即發生概率越高的事件,其所攜帶的信息熵越低。極端案例就是“太陽從東方升起”,因為為確定事件,所以不攜帶任何信息量。從信息論的角度,認為這句話沒有消除任何不確定性。
- 非負性,即信息熵不能為負。這個很好理解,因為負的信息,即你得知了某個信息后,卻增加了不確定性是不合邏輯的。
- 累加性,即多隨機事件同時發生存在的總不確定性的量度是可以表示為各事件不確定性的量度的和。
上例中根節點的熵的計算:samples為樣本的數量,values為每種花的數量,entropy為熵的值
39/120*np.log2(120/39)*2+42/120*np.log2(120/42)=1.584
之后每個節點的熵都是該計算公式,通過第一個節點的分類,直接將第一類花分出來
(2)對於第一個分類條件,他是根據屬性進行划分
鳶尾花有四種屬性,第一次分可以根據訓練樣本的方差,方差越大,說明越離散,越容易分開,之后再使用各種方法判斷四種屬性就可以了,簡言之,這個分類挺麻煩的,不過不是沒有依據的,就是根據花的四種屬性(花萼的長寬,花瓣的長寬)分類.最終得到三種純的鳶尾花.
(3)上述的熵也可以改為gini系數,其實是一樣的,公式如下

