1. 程式人生 > 資料庫 >MySQL的學習(一)-DQL語言的學習

MySQL的學習(一)-DQL語言的學習

技術標籤:機器學習決策樹python機器學習

決策樹

認識決策樹

決策樹思想的來源非常樸素,程式設計中的條件分支結構就是if-else結構,最早的決策樹就是利用這類結構分割資料的一種分類學習方法
怎麼理解這句話?通過一個對話例子
比如:你母親要給你介紹男朋友,是這麼來對話的:

  • 女兒:多大年紀了?
  • 母親:26。
  • 女兒:長的帥不帥?
  • 母親:挺帥的。
  • 女兒:收入高不?
  • 母親:不算很高,中等情況。
  • 女兒:是公務員不?
  • 母親:是,在稅務局上班呢。
  • 女兒:那好,我去見見。

想一想這個女生為什麼把年齡放在最上面判斷!!!!!!!!!!!!!!

**決策樹的思想:**如何高效的進行決策?——特徵的先後順序

那麼如何確定特效的先後順序呢?

決策樹分類原理詳解

原理

資訊煽、資訊增益等
需要用到資訊理論的知識!!!

資訊理論基礎

  • 資訊
    • 消除隨機不確定性的的東西
    • 例如:小明的年齡
      • ”我今年18歲“ —— 資訊
      • ”我明年19歲“ —— 不是資訊
  • 資訊的衡量 —— 資訊量 —— 資訊熵

資訊適的定義

  • H的專業術語稱之為資訊炯,單位為位元(bit)。
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-asCysUwX-1608431730837)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20201219232312280.png)]

決策樹的劃分依據之— —— 資訊增益

  • 定義與公式

特徵A對訓練資料集D的資訊增益g(D,A),定義為集合D的資訊煽H(D)與特徵A給定條件下D的資訊條件煽H(D|A)之差

公式為:g(D,A) = H(D) - H(D|A)

資訊熵計算:

img

條件熵的計算:

img

  • Ck 表示某個樣本類別的樣本數
  • 資訊增益表示得知特徵X的資訊而息的不確定性減少的程度使得類Y的資訊熵減少程度

當然決策樹的原理不止資訊增益這一種,還有其他方法。但是原理都類似,我們就不去舉例計算。

  • ID3
    • 資訊增益 最大的準則
  • C4.5
  • 資訊增益比 最大的準則
  • CART
  • 分類樹:基尼係數 最小的準則在sklearn中可以選擇劃分的預設原則
  • 優勢:劃分更加細緻(從後面例子的樹顯示來理解)

決策樹API

  • class sklearn.tree.DecisionTreeClassifier(criterion='gini', max_depth=None,random_state=None)
    • 決策樹分類器
    • criterion:決策樹的劃分依據,預設是gini係數,也可以選擇資訊增益的熵entropy
    • max_depth:樹的深度大小,不設定的話資料量過大,使得決策樹劃分太細,泛化能力差,可能訓練資料效果好,測試資料就不好了
    • random_state:隨機數種子

決策樹預測鳶尾花資料集

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
if __name__ == '__main__':
    #  獲取資料
    iris = load_iris()

    # 劃分資料集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=4)

    # 決策樹 演算法預估器
    estimator = DecisionTreeClassifier(criterion='entropy')
    estimator.fit(x_train, y_train)

    # 模型評估
    # 方法一:直接對比真實值和預測值
    y_predict = estimator.predict(x_test)
    print('y_predict:\n', y_predict)
    print('直接對比真實值和預測值:\n', y_test == y_predict)

    # 方法二:計算準確率
    score = estimator.score(x_test, y_test)
    print('準確率:\n', score)

決策樹視覺化

儲存樹的結構到dot檔案

  • sklearn.tree.export_graphviz()該函式能夠匯出DOT格式
    • tree.export_graphviz(estimator,out_file='tree.dot',feature_names=[])

dot 檔案當中內容如下:

digraph Tree {
node [shape=box] ;
0 [label="petal width (cm) <= 0.8\nentropy = 1.576\nsamples = 112\nvalue = [32, 42, 38]"] ;
1 [label="entropy = 0.0\nsamples = 32\nvalue = [32, 0, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="petal width (cm) <= 1.75\nentropy = 0.998\nsamples = 80\nvalue = [0, 42, 38]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
3 [label="petal length (cm) <= 4.95\nentropy = 0.433\nsamples = 45\nvalue = [0, 41, 4]"] ;
2 -> 3 ;
4 [label="petal width (cm) <= 1.65\nentropy = 0.165\nsamples = 41\nvalue = [0, 40, 1]"] ;
3 -> 4 ;
5 [label="entropy = 0.0\nsamples = 40\nvalue = [0, 40, 0]"] ;
4 -> 5 ;
6 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 0, 1]"] ;
4 -> 6 ;
7 [label="petal width (cm) <= 1.65\nentropy = 0.811\nsamples = 4\nvalue = [0, 1, 3]"] ;
3 -> 7 ;
8 [label="entropy = 0.0\nsamples = 3\nvalue = [0, 0, 3]"] ;
7 -> 8 ;
9 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
7 -> 9 ;
10 [label="petal length (cm) <= 4.85\nentropy = 0.187\nsamples = 35\nvalue = [0, 1, 34]"] ;
2 -> 10 ;
11 [label="sepal length (cm) <= 5.95\nentropy = 0.918\nsamples = 3\nvalue = [0, 1, 2]"] ;
10 -> 11 ;
12 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
11 -> 12 ;
13 [label="entropy = 0.0\nsamples = 2\nvalue = [0, 0, 2]"] ;
11 -> 13 ;
14 [label="entropy = 0.0\nsamples = 32\nvalue = [0, 0, 32]"] ;
10 -> 14 ;
}

網站顯示結構

http://webgraphviz.com/

決策樹總結

  • 優點:
    • 簡單的理解和解釋,樹木視覺化。
  • 缺點:
    • 決策樹學習者可以建立不能很好地推廣資料的過於複雜的樹,這被稱為過擬合
  • 改進:
    • 減枝cart演算法(決策樹API當中已經實現,隨機森林引數調優有相關介紹)。
    • 隨機森林

注:企業重要決策,由於決策樹很好的分析能力,在決策過程應用較多, 可以選擇特徵