機器學習之決策樹(上)
- 2019 年 10 月 4 日
- 筆記
決策樹
決策樹(Decision Tree)是在已知各種情況發生概率的基礎上,通過構成決策樹來求取凈現值的期望值大於等於零的概率,評價項目風險,判斷其可行性的決策分析方法,是直觀運用概率分析的一種圖解法。
由於這種決策分支畫成圖形很像一棵樹的枝幹,故稱決策樹。在機器學習中,決策樹是一個預測模型,他代表的是對象屬性與對象值之間的一種映射關係。Entropy = 系統的凌亂程度,使用演算法ID3, C4.5和C5.0生成樹演算法使用熵。

公式
當然也有推薦以2為底的對數

求兩點分布的資訊熵
import numpy as np import matplotlib.pyplot as plt p = np.linspace(0.0000001,1,100) h = -(1-p)*np.log(1-p) - p*np.log(p) # 公式 plt.plot(p,h) plt.show()
影像如下:

在這裡插入圖片描述
即如果概率都是0.5的資訊熵最大,舉個例子如果兩個球隊的獲勝概率都是0.5,那麼會有更多的人去觀看,帶來的資訊衝量也是最大的。也就是如果比賽激烈那些引起的資訊流量也是非常龐大的。
Gini係數(基尼係數)
Gini係數是一種與資訊熵類似的做特徵選擇的方式,可以用來數據的不純度。

決策樹如何可視化
先處理一個問題,如何將一個決策樹可視化
安裝好Graphviz
因為要使用sklearn自帶的 export_graphviz
網址:http://www.graphviz.org/
設置環境變數

cmd執行命令
pip install pydotplus
如何繪畫
這裡使用的是export_graphviz
import numpy as np from sklearn.tree import DecisionTreeClassifier from matplotlib import pyplot as plt import pydotplus from sklearn import tree X = np.array([[2, 2], [2, 1], [2, 3], [1, 2], [1, 1], [3, 3]]) y = np.array([0, 1, 1, 1, 0, 0]) plt.style.use('fivethirtyeight') plt.rcParams['font.size'] = 18 plt.figure(figsize=(8, 8)) # Plot each point as the label for x1, x2, label in zip(X[:, 0], X[:, 1], y): plt.text(x1, x2, str(label), fontsize=40, color='g', ha='center', va='center') plt.grid(None) plt.xlim((0, 3.5)) plt.ylim((0, 3.5)) plt.xlabel('x1', size=20) plt.ylabel('x2', size=20) plt.title('Data', size=24) plt.show() dec_tree = DecisionTreeClassifier() print(dec_tree) dec_tree.fit(X, y) print(dec_tree.score(X,y)) # export_graphviz dot_data = tree.export_graphviz(dec_tree, out_file=None, feature_names=['x1', 'x2'], class_names=['0', '1'], filled=True, rounded=True, special_characters=True) graph = pydotplus.graph_from_dot_data(dot_data) # 繪製圖片 with open('demo.png', 'wb') as f: f.write(graph.create_png()) # 繪製pdf graph.write_pdf('demo.pdf')
pdf和圖片一樣

具體說下這個決策樹
一開始 x1<2.5是判斷條件,gini=0.5,就是1-0.52-0.52 = 0.5,說明x1 = x2 ,只有[1,1],[3,3],x1<=2.5,選反的即x1>2.5 ,,決策樹先value選[3,3},現在有6個樣本。如果x1<=2.5,而且x2>2.5,將[2,3]選出。去掉[3,3] 5個,False是決策樹的預測,因為Gini=0或1,它必須做出預測,樣本中沒有[1,0],它預測為0的分類。每做一次判斷,就會做一個預測Gini=0的情況,將它分類,下次遇到[1,0]就將它分為0.