1. 程式人生 > >機器學習之決策樹

機器學習之決策樹

決策樹

簡介

決策樹是一種基本的分類方法,當然也可以用於迴歸。我們一般只討論用於分類的決策樹。決策樹模型呈樹形結構。在分類問題中,表示基於特徵對例項進行分類的過程,它可以認為是if-then規則的集合。在決策樹的結構中,每一個例項都被一條路徑或者一條規則所覆蓋。通常決策樹學習包括三個步驟:特徵選擇、決策樹的生成和決策樹的修剪。

特徵選擇

特徵選擇在於選取對訓練資料具有分類能力的特徵。這樣可以提高決策樹學習的效率,如果利用一個特徵進行分類的結果與隨機分類的結果沒有很大差別,則稱這個特徵是沒有分類能力的。經驗上扔掉這樣的特徵對決策樹學習的京都影響不大。通常特徵選擇的準則是資訊增益,這是個數學概念。 (1)資訊熵 H = -(p1logp1 + p2logp2 + … + p32log32)

其中,p1…p32為這支球隊奪冠的概率。H的專業術語稱之為資訊熵,單位為位元,當這32支球隊奪冠的機率相同時,對應的資訊熵等於5位元,這個可以通過計算得出。有一個特性就是,5位元是公式的最大值。那麼資訊熵(經驗熵)的具體定義可以為如下: H(X)=xXP(x)logP(x)H\left(X\right){=}\sum_{x\in{X}}P\left(x\right)logP\left(x\right)

(2)資訊增益 自古以來,資訊和消除不確定性是相聯絡的。所以決策樹的過程其實是在尋找某一個特徵對整個分類結果的不確定減少的過程。 那麼資訊增益表示得知特徵X的資訊而是的類Y的資訊的不確定性減少的程度,所以我們對於選擇特徵進行分類的時候,當然選擇資訊增益較大的特徵,這樣具有較強的分類能力。特徵A對訓練資料集D的資訊增益g(D,A),定義為集合D的經驗熵H(D)與特徵A給定條件下D的經驗條件熵H(D|A)之差,即公式為: g

(D,A)=H(D)H(DA)g\left({D,A}\right){=}H\left(D\right) {-} H\left(D|A\right)

決策樹的生成

sklearn.tree.DecisionTreeClassifier是一個能對資料集進行多分類的類。

決策樹的修剪

(1)預剪枝 (2)後剪枝

隨機森林

簡介

在機器學習中,隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。

隨機森林的生成

sklearn.ensemble提供了準確性更加好的整合方法,裡面包含了主要的RandomForestClassifier(隨機森林)方法。

使用案例

import pandas as pd  #匯入pandas包
from sklearn.model_selection import train_test_split  #資料切分
from sklearn.feature_extraction import DictVectorizer  #特徵提取
from sklearn.tree import DecisionTreeClassifier  #匯入決策樹模型
from sklearn.ensemble import RandomForestClassifier  #匯入隨機森林模型

def decomation():
    """
    通過決策樹和隨機森林對泰坦尼克號遇難資料進行預測
    :return: None
    """
    # 讀取資料
    data = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    #特徵資料
    x = data[["pclass","age","sex"]]  #其他的無用,或者不是特徵資料
    # 目標資料
    y = data[['survived']]
    # 缺失值的處理,對於age的特徵中NaN使用平均年齡填充
    x['age'].fillna(x['age'].mean(), inplace=True)  #inplace表示進行復制,而不是檢視
    # 對資料集進行切分
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    # 特徵提取 通過DictVectorizer,將csv資料轉換成為字典資料
    x_train = x_train.to_dict(orient='records')
    x_test = x_test.to_dict(orient='records')
    # 提取字典中的特徵資料
    dict_vec = DictVectorizer(sparse=False)
    x_train = dict_vec.fit_transform(x_train)
    x_test = dict_vec.transform(x_test)
    # 選擇決策樹模型
    dec = DecisionTreeClassifier()  #max_path可以指定樹的深度,樹的深度越淺  泛化程度越高
    # 輸入資料
    dec.fit(x_train, y_train)
    score = dec.score(x_test, y_test)
    print(score)
    # 選擇隨機森林模型
    rand = RandomForestClassifier(max_depth=5)
    rand.fit(x_train, y_train)
    score = rand.score(x_test, y_test)
    print(score)
    
if __name__ == '__main__':
    decomation()