Python機器學習及實踐——基礎篇7(分類整合模型)
常言道:“一個籬笆三個樁,一個好漢三個幫”。整合分類模型便是綜合考量多個分類器的預測結果,從而做出決策。只是這種“綜合考量”的方式大體上分為兩種:
一種是利用相同的訓練資料同時搭建多個獨立的分類模型,然後通過投票的方式,以少數服從多數的原則作出最終的分類決策。比較具有代表性的模型為隨機森林分類器,即在相同訓練資料上同時搭建多顆決策樹。然而上一篇中提到過,一株標準的決策樹會根據每維特徵對預測結果的影響程度進行排序,進而決定不同特徵從上至下構建分裂節點的順序;如此一來,所有在隨機森林中的決策樹都會受這一策略影響而構建得完全一致,從而喪失了多樣性。因此,隨機森林分類器在構建的過程中,每一顆決策樹都會放棄這一固定的排序演算法,轉而隨機選取特徵。
另一種則是按照一定次序搭建多個分類模型。這些模型之間彼此存在依賴關係。一般而言,每一個後續模型的加入都需要對現有整合模型的綜合性能有所貢獻,進而不斷提升更新過後的整合模型的效能,並最終期望藉助整合多個分類能力較弱的分類器,搭建出具有更強分類能力的模型。比較具有代表性的當屬梯度提升決策樹。與構建隨機森林分類器不同,這裡每一顆決策樹在生成的過程中都會盡可能降低整體整合模型在訓練集上的擬合誤差。
資料描述:為了對比單一決策樹與整合模型中隨機森林分類器以及梯度提升決策樹的效能差異,下面依舊使用泰坦尼克號的乘客資料。
我們使用相同的訓練資料和測試資料,並使用單一決策樹、隨機森林分類器以及梯度上升決策樹,三種模型各自的預設配置進行初始化,從事預測活動。
# 匯入pandas,並且重新命名為pd。 import pandas as pd # 通過網際網路讀取泰坦尼克乘客檔案,並存儲在變數titanic中。 titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt') # 人工選取pclass、age以及sex作為判別乘客是否能夠生還的特徵。 X = titanic[['pclass', 'age', 'sex']] y = titanic['survived'] # 對於缺失的年齡資訊,我們使用全體乘客的平均年齡代替,這樣可以在保證順利訓練模型的同時,儘可能不影響預測任務。 X['age'].fillna(X['age'].mean(), inplace=True) # 對原始資料進行分割,25%的乘客資料用於測試。 from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state = 33) # 對類別型特徵進行轉化,成為特徵向量。 from sklearn.feature_extraction import DictVectorizer 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')) # 使用單一決策樹進行模型訓練以及預測分析。 from sklearn.tree import DecisionTreeClassifier dtc = DecisionTreeClassifier() dtc.fit(X_train, y_train) dtc_y_pred = dtc.predict(X_test) # 使用隨機森林分類器進行整合模型的訓練以及預測分析。 from sklearn.ensemble import RandomForestClassifier rfc = RandomForestClassifier() rfc.fit(X_train, y_train) rfc_y_pred = rfc.predict(X_test) # 使用梯度提升決策樹進行整合模型的訓練以及預測分析。 from sklearn.ensemble import GradientBoostingClassifier gbc = GradientBoostingClassifier() gbc.fit(X_train, y_train) gbc_y_pred = gbc.predict(X_test)
使用多種用於評價分類任務效能的指標,在測試資料集上對比單一決策樹、隨機森林分類器以及梯度提升決策樹的效能差異。
# 從sklearn.metrics匯入classification_report。
from sklearn.metrics import classification_report
# 輸出單一決策樹在測試集上的分類準確性,以及更加詳細的精確率、召回率、F1指標。
print 'The accuracy of decision tree is', dtc.score(X_test, y_test)
print classification_report(dtc_y_pred, y_test)
The accuracy of decision tree is 0.781155015198precision 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
# 輸出隨機森林分類器在測試集上的分類準確性,以及更加詳細的精確率、召回率、F1指標。
print 'The accuracy of random forest classifier is', rfc.score(X_test, y_test)
print classification_report(rfc_y_pred, y_test)
The accuracy of random forest classifier is 0.784194528875precision 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
# 輸出梯度提升決策樹在測試集上的分類準確性,以及更加詳細的精確率、召回率、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 gradient tree boosting is 0.790273556231precision 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
上述程式碼的輸出說明:在相同的訓練和測試資料條件下,僅僅使用模型的預設配置,梯度上升決策樹具有最佳的預測效能,其次是隨機森林分類器,最後是單一決策樹。大量在其他資料上的模型實踐也證明了上述結論的普適性。一般而言,工業界為了追求更加強勁的預測效能,經常使用隨機森林分類模型作為基線系統。
特點分析:整合模型可以說是實戰應用中最為常見的。相比於其他單一的學習模型,整合模型可以整合多種模型,或者多次就一種型別的模型進行建模。由於模型估計引數的過程也同樣受到概率的影響,具有一定的不確定性;因此,整合模型雖然在訓練過程中要耗費更多的時間,但是得到的綜合模型往往具有更高的表現效能和更好的穩定性。