機器學習---監督學習之決策樹算法

  1. 決策樹概念
    根據我們前面學到的知識
    顧名思義:一棵用來決策的樹。
    機器學習已有的數據,分析什麼情況會導致什麼結果,把它畫成一顆分叉的樹,
    然後如果有新數據來了,帶入這棵樹來決策應該怎麼做。
    比如帶入性別,得到結果:性別女則決策買買買,性別男則決策吃吃吃。

  2. 舉例
    在這裏插入圖片描述
    如果使用決策樹劃分這些數據?

  • 先豎着畫一條線
    在這裏插入圖片描述
  • 由已經分割好的兩部分繼續劃分
    在這裏插入圖片描述
  • 繼續劃分
    在這裏插入圖片描述
  • 這就是決策樹了

  1. 物體越無序,熵越大,越不穩定。
    物品越有序,熵越小,越穩定。
    如何用數學定義描述這種狀態?
    我們隨機N次抽取物品,求出這些抽取出的物品排列起來和原來物品一模一樣的概率。
    概率越大越穩定。概率越小越不穩定。
    又因爲這些物品可能數量很多,一直求概率這個值會很小很小,爲了使這個值依舊滿足衡量穩定與否的作用還不那麼小,我們對每個概率都取對數,這樣相乘就可以被改成相加了(會是負數,再取相反數)。

我們使用決策樹時,就可以使用熵的概念判斷決策樹劃分的好壞了
在這裏插入圖片描述
父節點的熵值-子節點的熵值的平均值=信息增益
信息增益越大越好,就像是上圖第三點似的,信息增益爲1.

  1. 信息增益例子
    在這裏插入圖片描述
    如果先按照性別分類的話,信息增益爲0.54
    在這裏插入圖片描述
    按照職業劃分的話信息增益是1.
    所以我們這種情況按照職業劃分更好。

總而言之,我們選擇決策樹的父節點時,可以用信息增益這個指標來決定用哪個參數當父節點。

  1. 隨機森林
    上述的例子是兩個參數,性別和職業,若是某些數據的參數過多,我們還依舊使用決策樹的話,就會出現過擬合的狀態,這時候模型傾向於記住數據而不是預測數據。類似於下圖
    在這裏插入圖片描述
    這是一種不好的現象,如何解決呢?
    隨機選擇幾個參數(列),生成決策樹。
    再隨機選擇幾個參數(列),生成決策樹。
    ……
    多生成幾個決策樹。
    最後要進行預測數值時,將數值代入不同的決策樹,得到不同的結果,我們取出現次數最多的結果。如下圖所示。
    在這裏插入圖片描述
  2. 超參數
    學過數據結構的同學都知道,樹有很多性質,決策樹作爲樹的一種,也具有樹的性質。
  • 最大深度
    決策樹的最大深度指樹根和葉子之間的最大長度。當決策樹的最大深度爲k時,它最多可以擁有
    2k2^k片葉子。
    在這裏插入圖片描述
    設置最大深度這個超參數可以有效避免決策樹左右不平衡效率問題。
    這樣解決了一個問題又會出現什麼問題呢?
    在這裏插入圖片描述
    如左圖所示,一個節點內樣本過多,一個節點內樣本過少,這樣也不行,所以還要用到一個超參數

  • 每個節點最小樣本數
    若這個參數被設置爲一個整數,就代表樣本個數,如果被設置爲小數就代表節點樣本與總樣本數的比值(必須大於等於此比值)

  • 最大特徵數
    這個超參數就是第5點所說的,限制每次查找數據特徵的個數,來生成許多決策樹,以防出現過擬合的情況。

  1. 代碼示例
# Import statements 
from sklearn.tree import DecisionTreeClassifier#分類器
from sklearn.metrics import accuracy_score#計算模型是準確率
import pandas as pd
import numpy as np

# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))#讀取數據
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]#數據中前兩列是參數(所有行都包括)
y = data[:,2]#數據中第三列是標籤(所有行都包括)

# TODO: Create the decision tree model and assign it to the variable model.
model = DecisionTreeClassifier()#實例化一個決策樹模型

# TODO: Fit the model.
model.fit(X,y)#放入數據學習

# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)#預測數據

# TODO: Calculate the accuracy and assign it to the variable acc.
acc = accuracy_score(y, y_pred)#計算準確率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章