機器學習之決策樹(上)

  • 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.