sklearn機器學習實例 - 決策樹和集成分類模型入門與實戰

決策樹簡介

決策樹(decision tree)是一類常見的機器學習方法,目的是爲了產生一棵泛化能力強,即處理未見示例能力強的決策樹。
本文目的在於快速通過sklearn實踐算法而獲得直觀感受,因此對於算法的原理不做過多深入介紹,感興趣的朋友可以看下這篇博客:機器學習實戰(三)——決策樹

下面我們通過實際的例子瞭解一下決策樹是什麼。本文使用的數據來自於一部經典的電影:泰坦尼克號所發生的真實事故的相關數據,如今,許多科學家視圖通過計算機模擬和分析找出潛藏在數據背後的生還邏輯,例如下圖的一個簡單的決策樹模型:
在這裏插入圖片描述

正如上圖所示,決策樹節點(node)代表數據特徵,如性別,年齡,艙位等,而決策樹所以葉子節點(leaf)則顯示模型的決策結果,本文的數據是二分類任務,因此只有生存或死亡兩種結果。

集成分類模型

集成(Ensemble)分類模型,通過綜合考量多個分類器的預測結果,從而做出決策。這種綜合考量方式大致分爲兩種:

  • 一種是利用相同的訓練數據搭建多個獨立的分類模型,然後通過投票的模式,以少數服從多數的原則做出最終的分類決策。比較有代表性的模型爲隨機森林分類器(Random Forest Classifier),隨機森林分類器放棄了決策樹中按照信息熵等方式選擇建構節點的特徵的順序,而是隨機選取特徵。
  • 另一種是按照一定次序搭建多個分類模型,這些模型間彼此存在依賴關係。一般而言,每一個後續模型的加入都需要對現有集成模型的綜合性能有所貢獻,進而不斷提升更新後的集成模型的性能。比較有代表性的模型爲梯度提升決策樹(Gradient Tree Boosting)

初探數據及預處理

簡單的介紹就到這裏,下面我們來看一下泰坦尼克號的數據吧:

import pandas as pd

#通過pandas讀取網上的泰坦尼克號數據
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
#觀察前幾行數據
print(titanic.head())
#titanic是dataframe格式,因此可以使用info()方法查看數據的統計特性
print(titanic.info())

在這裏插入圖片描述
在這裏插入圖片描述

由於案例數據年代過於久遠,難免有信息丟失和不完整,甚至許多特徵還沒有向量化,因此在使用決策樹模型進行學習之前,還需要對數據做一些預處理和分析工作,如下所示:

import pandas as pd
from sklearn.feature_extraction import DictVectorizer


#通過pandas讀取網上的泰坦尼克號數據
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
#觀察前幾行數據
print(titanic.head())
#titanic是dataframe格式,因此可以使用info()方法查看數據的統計特性
print(titanic.info())

#選擇三個重要的特徵
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']

#查看X的數據信息
print(X.info())  #發現age中有600多個NaN值,sex和pclass是類別變量需要轉換爲特徵數值
#用平均數補充age中的缺失值
X['age'].fillna(X['age'].mean(), inplace=True)
print(X.info())  #確認age特徵得到了補充

#使用feature_extraction中的特徵轉換器,把類別變量中的特徵都單獨剝離出來,獨立成一列特徵
vec = DictVectorizer(sparse=False)
X = vec.fit_transform(X.to_dict(orient='record'))
print(vec.feature_names_)

在這裏插入圖片描述
在這裏插入圖片描述

利用決策樹,隨機森林,梯度提升決策樹擬合數據

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier


#通過pandas讀取網上的泰坦尼克號數據
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
#觀察前幾行數據
print(titanic.head())
#titanic是dataframe格式,因此可以使用info()方法查看數據的統計特性
print(titanic.info())

#選擇三個重要的特徵
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']

#查看X的數據信息
print(X.info())  #發現age中有600多個NaN值,sex和pclass是類別變量需要轉換爲特徵數值
#用平均數補充age中的缺失值
X['age'].fillna(X['age'].mean(), inplace=True)
print(X.info())  #確認age特徵得到了補充

#使用feature_extraction中的特徵轉換器,把類別變量中的特徵都單獨剝離出來,獨立成一列特徵
vec = DictVectorizer(sparse=False)
X = vec.fit_transform(X.to_dict(orient='record'))
print(vec.feature_names_)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=2)

#使用單一決策樹進行模型訓練和預測分析
dtc = DecisionTreeClassifier()
dtc.fit(X_train, y_train)
y_dtc_predict = dtc.predict(X_test)

#使用隨機森林分類器進行模型訓練和預測分析
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
y_rfc_predict = rfc.predict(X_test)

#使用梯度上升決策樹分類器進行模型訓練和預測分析
gbc = GradientBoostingClassifier()
gbc.fit(X_train, y_train)
y_gbc_predict = gbc.predict(X_train)

#輸出三種分類器的預測結果
print('The Accuracy of DecisionTreeClassifier is:', dtc.score(X_test, y_test))
print('The Accuracy of RandomForestClassifier is:', rfc.score(X_test, y_test))
print('The Accuracy of GradientBoosstingClassifier is:', gbc.score(X_test, y_test))

輸出結果:

The Accuracy of DecisionTreeClassifier is: 0.7963525835866262
The Accuracy of RandomForestClassifier is: 0.8054711246200608
The Accuracy of GradientBoosstingClassifier is: 0.8085106382978723

小結

上述輸出結果表明,在相同的訓練和測試數據下,僅僅使用模型的默認配置,梯度上升決策樹具有最佳的性能,其次是隨機森林分類器,最後是單一決策樹。大量在其他數據上的模型實踐也證明了上述結論的普適性。

一般而言,工業界爲了追求更強勁的預測性能,經常使用隨機森林分類模型作爲基線系統。

  • 決策樹模型推斷邏輯非常直觀,具有清晰的可解釋性,也方便了模型的可視化;
  • 使用決策樹模型時,無須考慮對數據的量化或標準化;
  • 與KNN不同,決策樹仍屬於有參數模型。
  • 集成模型可以說是實戰中最爲常見的,相比其他單一的學習模型,集成模型可以整合多種模型,或多次就一種類型的模型進行建模。
  • 集成模型雖然在訓練過程中要耗費更多的時間,但是得到的綜合模型往往有更高的表現性能和更好的穩定性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章