決策樹思想的來源很是樸素,程序設計中的條件分支結構就是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決策圖: