1. 程式人生 > >[機器學習python實踐(5)]Sklearn實現集成

[機器學習python實踐(5)]Sklearn實現集成

ace 訓練 存在 edi 每一個 predict utf-8 avg score

1,集成

集成(Ensemble)分類模型是綜合考量多個分類器的預測結果,從而做出決策。一般分為兩種方式:
1)利用相同的訓練數據同時搭建多個獨立的分類模型,然後通過投票的方式,以少數服從多數的原則做出最終的分類決策。如隨即森林分類器的思想是在相同的訓練數據上同時搭建多棵決策樹。隨機森林分類器在構建每一棵決策樹會隨機選擇特征,而不是根據每維特征對預測結果的影響程度進行排序。

2)按照一定次序搭建多個分類模型。這些模型之間彼此存在依賴關系。一般而言,每一個後續模型的加入都需要對現有集成模型的綜合性能有所貢獻,進而不斷提升更新過後的集成模型的性能,並最終期望借助整合多個分類能力較弱的分類器,搭建出具有更強分類能力的模型。如梯度提升決策樹:它生成每一棵決策樹的過程中都會盡可能降低整體集成模型在訓練集上的擬合誤差。

2.例子

數據集:同上一篇文章

代碼:

#coding=utf-8
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.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report #1.數據獲取 titanic = pd.read_csv(http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt) X = titanic[[pclass, age, sex]] y = titanic[survived] #2.數據預處理:訓練集測試集分割,數據標準化 X[age].fillna(X[age].mean(),inplace=True) #age只有633個,需補充,使用平均數或者中位數都是對模型偏離造成最小的策略
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=33) # 將數據進行分割 vec = DictVectorizer(sparse=False) X_train = vec.fit_transform(X_train.to_dict(orient=record)) #對訓練數據的特征進行提取 X_test = vec.transform(X_test.to_dict(orient=record)) #對測試數據的特征進行提取 #3.集成模型訓練 # 使用單一決策樹進行模型訓練以及預測分析 dtc = DecisionTreeClassifier() dtc.fit(X_train, y_train) dtc_y_pred = dtc.predict(X_test) #使用隨機森林分類器進行集成模型的訓練以及預測分析。 rfc = RandomForestClassifier() rfc.fit(X_train, y_train) rfc_y_pred = rfc.predict(X_test) #使用梯度提升決策樹進行集成模型的訓練以及預測分析。 gbc = GradientBoostingClassifier() gbc.fit(X_train, y_train) gbc_y_pred = gbc.predict(X_test) #4.獲取結果報告 # 輸出單一決策樹在測試集上的分類準確性,以及更加詳細的精確率、召回率、F1指標。 print The accuracy of decision tree is, dtc.score(X_test, y_test) print classification_report(dtc_y_pred, y_test) # 輸出隨機森林分類器在測試集上的分類準確性,以及更加詳細的精確率、召回率、F1指標。 print The accuracy of random forest classifier is, rfc.score(X_test, y_test) print classification_report(rfc_y_pred, y_test) # 輸出梯度提升決策樹在測試集上的分類準確性,以及更加詳細的精確率、召回率、F1指標。 print The accuracy of gradient tree boosting is, gbc.score(X_test, y_test) print classification_report(gbc_y_pred, y_test)

運行結果:單個決策樹,隨機森林,梯度提升決策樹的表現如下:

The accuracy of decision tree is 0.781155015198
             precision    recall  f1-score   support

          0       0.91      0.78      0.84       236
          1       0.58      0.80      0.67        93

avg / total       0.81      0.78      0.79       329

The accuracy of random forest classifier is 0.784194528875
             precision    recall  f1-score   support

          0       0.92      0.77      0.84       239
          1       0.57      0.81      0.67        90

avg / total       0.82      0.78      0.79       329
The accuracy of gradient tree boosting is 0.790273556231
             precision    recall  f1-score   support

          0       0.92      0.78      0.84       239
          1       0.58      0.82      0.68        90

avg / total       0.83      0.79      0.80       329

結論:
預測性能:梯度上升決策樹大於隨機森林分類器大於單一決策樹。工業界經常使用隨機森林分類模型作為基線系統。
技術分享圖片

 

[機器學習python實踐(5)]Sklearn實現集成