決策樹

決策樹思想的來源很是樸素,程序設計中的條件分支結構就是if-then結構,最先的決策樹就是利用這類結構分割數據的一種分類學習方法,其原理是基於信息熵和信息增益。python

信息熵的定義
H的專業術語稱之爲信息熵,單位爲比特。ios

信息和消除不肯定性是相聯繫的,當獲得的額外信息越多的話,那麼猜想的代價越小,當得知某個特徵以後,可以減小的不肯定性大小,越大能夠認爲這個特徵很重要。要衡量減小的不肯定性大小,需引入信息增益(決策樹的劃分依據之一):算法

 

特徵A對訓練數據集D的信息增益g(D,A),定義爲集合D的信息熵H(D)與特徵A給定條件下D的信息條件熵H(D|A)之差,即公式爲:數組

 

 信息熵的計算:dom

 

 

 條件熵的計算:函數

CK表示屬於某個類別的樣本數,信息增益表示得知特徵X的信息而息的不肯定性減小的程度使得類Y的信息熵減小的程度學習

決策樹的三種算法實現:
ID3 -->信息增益最大的準則
C4.5-->信息增益比最大的準則
CART分類樹-->基尼係數最小的準則,在sklearn中能夠選擇劃分的默認原則,劃分更加細緻
測試

決策樹算法在sklearn中的API:
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)編碼


決策樹分類器
criterion:默認是’gini’係數,也能夠選擇信息增益的熵’entropy’
max_depth:樹的深度大小
random_state:隨機數種子

spa

 

示例:泰坦尼克號乘客生存預測(泰坦尼克號數據

在泰坦尼克號數據描述泰坦尼克號上的個別乘客的生存狀態。數據集中的特徵是票的類別、存活、乘坐班、年齡、登錄、home.dest、房間、票、船和性別。
一、乘坐班是指乘客班(1,2,3),是社會經濟階層的表明。
二、其中age數據存在缺失。

 

分析
1. 選擇認爲重要的幾個特徵 ['pclass', 'age', 'sex']
2. 填充缺失值
3. 特徵中出現類別符號,須要進行one-hot編碼處理(DictVectorizer)
4. x.to_dict(orient="records") 須要將數組特徵轉換成字典數據
5. 數據集劃分
6. 決策樹分類預測

預測結果:

 

當樹的深度爲5時,準確率約爲0.837;當樹的深度爲6時,準確率約爲0.857;當樹的深度爲10時,準確率約爲0.802,樹的深度可以直接影響到預測的準確率

 

保存樹的結構
sklearn.tree.export_graphviz() 該函數可以導出DOT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])

 

完整代碼實現:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.feature_extraction.dict_vectorizer import DictVectorizer
from sklearn.tree import export_graphviz


def decisioncls():
    """
    決策樹進行乘客生存預測
    :return:
    """
    # 一、獲取數據
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 二、數據的處理
    x = titan[['pclass', 'age', 'sex']]
    y = titan['survived']

    # 缺失值須要處理,將特徵當中有類別的這些特徵進行字典特徵抽取
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 對於x轉換成字典數據x.to_dict(orient="records")
    # [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]

    dict = DictVectorizer(sparse=False)
    x = dict.fit_transform(x.to_dict(orient="records"))

    print(dict.get_feature_names())

    # 分割訓練集合測試集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 進行決策樹的創建和預測
    dc = DecisionTreeClassifier(max_depth=10)

    dc.fit(x_train, y_train)

    print("預測的準確率爲:", dc.score(x_test, y_test))

    # 保存樹到dot文件
    export_graphviz(
        dc, out_file="./tree.dot",
        feature_names=[
            'age', 'pclass=1st',
            'pclass=2nd', 'pclass=3rd',
            '女性', '男性'
        ]
    )

    return None


decisioncls()

 

生成的tree.dot文件:

 

 

安裝graphviz,將dot文件轉換爲pdf、png:

# 安裝graphviz
sudo apt-get install graphviz

# 將graphviz轉化爲png
dot -Tpng tree.dot -o tree.png

 

生成的tree.png決策圖:

相關文章
相關標籤/搜索