機器學習筆記二 決策樹

2021-08-11 07:27:33 字數 3119 閱讀 6999

一顆決策樹包含乙個根結點,若干內部結點(對應乙個測試屬性)和若干葉結點(對應決策結果)。決策流程採用分而治之的整體思想,根結點包含樣本全集,對各個特徵進行判斷,直至所有葉結點均對應一種類別的樣本。

決策樹的關鍵在於劃分屬性的選擇,隨著劃分不斷進行,分支結點所包含樣本應盡可能屬於同一類別,即純度越來越高,有三種劃分屬性選擇指標:

(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 ...