一顆決策樹包含乙個根結點,若干內部結點(對應乙個測試屬性)和若干葉結點(對應決策結果)。決策流程採用分而治之的整體思想,根結點包含樣本全集,對各個特徵進行判斷,直至所有葉結點均對應一種類別的樣本。
決策樹的關鍵在於劃分屬性的選擇,隨著劃分不斷進行,分支結點所包含樣本應盡可能屬於同一類別,即純度越來越高,有三種劃分屬性選擇指標:
(1) 資訊增益gain(d,a)= h(d)-h(d|a):以類別做隨機變數,根據各類別比例求得集合集合的資訊熵減去用屬性a劃分後再次計算得到的集合的資訊熵即可得到資訊增益,資訊增益越大,純度提公升越高,可以用最高資訊增益選擇屬性。
(2) 增益率gain_ratio(d,a)= gain(d,a)/ha(d):資訊增益除以屬性的固有值(以屬性a做隨機變數,由集合中a屬性各個取值所佔的比例計算的資訊熵),a可取數值越多,固定值越大,在一定程度上抑制了上述偏好
缺點:對可取數值較小的屬性有偏好。故實際上,採用先找資訊增益高於平均水平的屬性,再從中找增益率高的
(3) 基尼指數gini(d):從集合中隨機抽取兩個樣本,其類別不一致的概率。概率越小,基尼指數越小,資料集純度越高。
預防過擬合的方法:剪枝
(1) 預剪枝:結點劃分前,若劃分不能帶來泛化效能提高,就停止劃分標為葉結點。效能提高的判斷由劃分前後驗證集的精度決定。
優點:分支較少,減小過擬合風險,也減少了訓練時間開銷和測試時間開銷
缺點:帶來了欠擬合的風險(當前劃分雖不能提公升泛化能力,但繼續劃分呢?)
(2) 後剪枝:生成完整的決策樹後自底向上對非葉結點考察,若替換為葉結點能帶來泛化效能提公升,則替換。
優點:比預剪枝分支多,欠擬合風險小,泛化效能往往優於預剪枝
缺點:訓練時間開銷大得多
連續值屬性處理
將屬性取值進行排序,按大於t和小於t分為兩個子集,劃分點t由最大化資訊增益來確定,需要注意的是,對於連續屬性,該屬性可在決策樹中多次使用。
預設值屬性處理
判斷屬性優劣(如計算資訊增益)只考慮沒有預設值的樣本,且相應地乘以除去預設值所佔的比例做權重,以保證預設值不要過多;對於含預設值樣本對於該屬性的劃分,則根據該屬性各種取值的分布情況,以不同的概率劃分到不同的結點(劃分後樣本帶權)。
**實踐:使用決策樹演算法**鐵達尼號乘客生存情況
# 匯入pandas用於資料分析。
import pandas as pd
# 利用pandas的read_csv模組直接從網際網路收集鐵達尼號乘客資料。
titanic =pd.read_csv('')
# 觀察一下前幾行資料,可以發現,資料種類各異,數值型、類別型,甚至還有缺失資料。
titanic.head()
# 使用pandas,資料都轉入pandas獨有的dataframe格式(二維資料**),直接使用info(),檢視資料的統計特性。
titanic.info()
# 特徵的選擇,這個需要基於一些背景知識。根據我們對這場事故的了解,***, age, pclass這些都很有可能是決定倖免與否的關鍵因素。
x = titanic[['pclass', 'age', '***']]
y = titanic['survived']
# 對當前選擇的特徵進行探查。
x.info()
# 首先我們補充age裡的預設值,使用平均數或者中位數都是對模型偏離造成最小影響的策略。
x['age'].fillna(x['age'].mean(), inplace=true)
# 對補完的資料重新探查。
x.info()
# 資料分割。
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25,random_state = 33)
# 我們使用scikit-learn.feature_extraction中的特徵轉換器,詳見3.1.1.1特徵抽取。
from sklearn.feature_extraction import dictvectorizer
vec = dictvectorizer(sparse=false)
# 轉換特徵後,我們發現凡是類別型的特徵都單獨剝離出來,獨成一列特徵,數值型的則保持不變。
x_train = vec.fit_transform(x_train.to_dict(orient='record'))
print(vec.feature_names_)
# 同樣需要對測試資料的特徵進行文字轉換。
x_test = vec.transform(x_test.to_dict(orient='record'))
# 從sklearn.tree中匯入決策樹分類器。
from sklearn.tree import decisiontreeclassifier
# 使用預設配置初始化決策樹分類器。
dtc = decisiontreeclassifier()
# 使用分割到的訓練資料進行模型學習。
dtc.fit(x_train, y_train)
# 用訓練好的決策樹模型對測試特徵資料進行**。
y_predict = dtc.predict(x_test)
# 從sklearn.metrics匯入classification_report。
from sklearn.metrics import classification_report
# 輸出**準確性。
print dtc.score(x_test, y_test)
# 輸出更加詳細的分類效能。
print(classification_report(y_predict, y_test, target_names = ['died','survived']))
--來自《python機器學習及實踐 —— 從零開始通往kaggle競賽之路》
機器學習(二) 決策樹
決策樹是用於分類的一種機器學習演算法。其最大的特點就是簡單,直觀.由於資料來自於之前的筆記。原例子的出處找不到,乾脆就手繪算了 xd。其中如果資料不是離散值,要先處理成離散值再進行決策樹的計算。圖1 用乙個例子來講吧。如上圖,現在是有14條資料都從調研中得到,其中是研究是否買電腦的資料,rid是列號...
機器學習實戰 筆記二 決策樹
要理解決策樹演算法需要首先明確資訊增益及資訊熵的概念 對於乙個分類集中的分類xi,其熵為 l xi log 2p x i 對於所有類別的資訊熵總和 h ni 1p xi l og2p xi 計算夏農熵的函式 from math import log defcalcshannonent dataset...
機器學習實戰筆記二 決策樹
決策樹例項,決策樹優點 缺點 可能會產生過度匹配問題 適用資料型別 數值型和標稱型 決策樹一般流程 1 收集資料 2 準備資料 3 分析資料 4 訓練資料 5 測試資料 6 使用演算法 from numpy import import operator from os import listdir ...