目錄
- 1 決策樹算法api
- 2 泰坦尼克号乘客案例背景
- 2.1 步驟分析
- 2.2 代碼實作
- 2.3 決策樹可視化
- 2.3.1 儲存樹的結構到dot檔案
- 2.3.2 網站顯示結構
- 3 決策樹總結
- 4 小結
1 決策樹算法api
- class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
- criterion
- 特征選擇标準
- “gini"或者"entropy”,前者代表基尼系數,後者代表資訊增益。一預設"gini",即CART算法。
- min_samples_split
- 内部節點再劃分所需最小樣本數
- 這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少于min_samples_split,則不會繼續再嘗試選擇最優特征來進行劃分。 預設是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。我之前的一個項目例子,有大概10萬樣本,建立決策樹時,我選擇了min_samples_split=10。可以作為參考。
- min_samples_leaf
- 葉子節點最少樣本數
- 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小于樣本數,則會和兄弟節點一起被剪枝。 預設是1,可以輸入最少的樣本數的整數,或者最少樣本數占樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。之前的10萬樣本項目使用min_samples_leaf的值為5,僅供參考。
- max_depth
- 決策樹最大深度
- 決策樹的最大深度,預設可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,資料少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決于資料的分布。常用的可以取值10-100之間
- random_state
- 随機數種子
2 泰坦尼克号乘客案例背景
泰坦尼克号沉沒是曆史上最臭名昭着的沉船之一。1912年4月15日,在她的處女航中,泰坦尼克号在與冰山相撞後沉沒,在2224名乘客和機組人員中造成1502人死亡。這場聳人聽聞的悲劇震驚了國際社會,并為船舶制定了更好的安全規定。 造成海難失事的原因之一是乘客和機組人員沒有足夠的救生艇。盡管幸存下沉有一些運氣因素,但有些人比其他人更容易生存,例如婦女,兒童和上流社會。 在這個案例中,我們要求您完成對哪些人可能存活的分析。特别是,我們要求您運用機器學習工具來預測哪些乘客幸免于悲劇。
案例:https://www.kaggle.com/c/titanic/overview
我們提取到的資料集中的特征包括票的類别,是否存活,乘坐班次,年齡,登陸home.dest,房間,船和性别等。
資料:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
經過觀察資料得到:
- 1 乘坐班是指乘客班(1,2,3),是社會經濟階層的代表。
- 2 其中age資料存在缺失。
2.1 步驟分析
- 1.擷取資料
- 2.資料基本處理
- 2.1 确定特征值,目标值
- 2.2 缺失值處理
- 2.3 資料集劃分
- 3.特征工程(字典特征抽取)
- 4.機器學習(決策樹)
- 5.模型評估
2.2 代碼實作
- 導入需要的子產品
import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier,
- 1.擷取資料
# 1、擷取資料
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
- 2.資料基本處理
- 2.1 确定特征值,目标值
x = titan[["pclass", "age", "sex"]]
y = titan["survived"]
- 2.2 缺失值處理
# 缺失值需要處理,将特征當中有類别的這些特征進行字典特征抽取
x['age'].fillna(x['age'].mean(), inplace=True)
- 2.3 資料集劃分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
- 3.特征工程(字典特征抽取)
特征中出現類别符号,需要進行one-hot編碼處理(DictVectorizer)
x.to_dict(orient=“records”) 需要将數組特征轉換成字典資料
# 對于x轉換成字典資料x.to_dict(orient="records")
# [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
- 4.決策樹模型訓練和模型評估
決策樹API當中,如果沒有指定max_depth那麼會根據資訊熵的條件直到最終結束。這裡我們可以指定樹的深度來進行限制樹的大小
# 4.機器學習(決策樹)
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=5)
estimator.fit(x_train, y_train)
# 5.模型評估
estimator.score(x_test, y_test)
estimator.predict(x_test)
決策樹的結構是可以直接顯示
2.3 決策樹可視化
2.3.1 儲存樹的結構到dot檔案
- sklearn.tree.export_graphviz() 該函數能夠導出DOT格式
- tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
export_graphviz(estimator, out_file="./data/tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
dot檔案當中的内容如下
digraph Tree {
node [shape=box] ;
0 [label="petal length (cm) <= 2.45\nentropy = 1.584\nsamples = 112\nvalue = [39, 37, 36]"] ;
1 [label="entropy = 0.0\nsamples = 39\nvalue = [39, 0, 0]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="petal width (cm) <= 1.75\nentropy = 1.0\nsamples = 73\nvalue = [0, 37, 36]"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
3 [label="petal length (cm) <= 5.05\nentropy = 0.391\nsamples = 39\nvalue = [0, 36, 3]"] ;
2 -> 3 ;
4 [label="sepal length (cm) <= 4.95\nentropy = 0.183\nsamples = 36\nvalue = [0, 35, 1]"] ;
3 -> 4 ;
5 [label="petal length (cm) <= 3.9\nentropy = 1.0\nsamples = 2\nvalue = [0, 1, 1]"] ;
4 -> 5 ;
6 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
5 -> 6 ;
7 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 0, 1]"] ;
5 -> 7 ;
8 [label="entropy = 0.0\nsamples = 34\nvalue = [0, 34, 0]"] ;
4 -> 8 ;
9 [label="petal width (cm) <= 1.55\nentropy = 0.918\nsamples = 3\nvalue = [0, 1, 2]"] ;
3 -> 9 ;
10 [label="entropy = 0.0\nsamples = 2\nvalue = [0, 0, 2]"] ;
9 -> 10 ;
11 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
9 -> 11 ;
12 [label="petal length (cm) <= 4.85\nentropy = 0.191\nsamples = 34\nvalue = [0, 1, 33]"] ;
2 -> 12 ;
13 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1, 0]"] ;
12 -> 13 ;
14 [label="entropy = 0.0\nsamples = 33\nvalue = [0, 0, 33]"] ;
12 -> 14 ;
}
那麼這個結構不能看清結構,是以可以在一個網站上顯示
2.3.2 網站顯示結構
- http://webgraphviz.com/
将dot檔案内容複制到該網站當中顯示
3 決策樹總結
- 優點:
- 簡單的了解和解釋,樹木可視化。
- 缺點:
- 決策樹學習者可以建立不能很好地推廣資料的過于複雜的樹,容易發生過拟合。
- 改進:
- 減枝cart算法
- 随機森林(內建學習的一種)
4 小結
- 案例流程分析【了解】
- 1.擷取資料
- 2.資料基本處理
- 2.1 确定特征值,目标值
- 2.2 缺失值處理
- 2.3 資料集劃分
- 3.特征工程(字典特征抽取)
- 4.機器學習(決策樹)
- 5.模型評估
- 決策樹可視化【了解】
- sklearn.tree.export_graphviz()
- 決策樹優缺點總結【知道】
- 優點:
- 簡單的了解和解釋,樹木可視化。
- 缺點:
- 決策樹學習者可以建立不能很好地推廣資料的過于複雜的樹,容易發生過拟合。
- 改進:
- 減枝cart算法
- 随機森林(內建學習的一種)