概述
目的:讓機器學習效果更好,單個不行,集成多個
集成算法
Bagging:訓練多個分類器取平均
f ( x ) = 1 / M ∑ m = 1 M f m ( x ) f(x)=1/M\sum^M_{m=1}{f_m(x)} f(x)=1/M∑m=1M?fm?(x)
Boosting:從弱學習器開始加強,通過加權來進行訓練
F m ( x ) = F m ? 1 ( x ) + a r g m i n h ∑ i = 1 n L ( y i , F m ? 1 ( x i ) + h ( x i ) ) F_m(x)=F_{m-1}(x)+argmin_h\sum^n_{i=1}L(y_i,F_{m-1}(x_i)+h(x_i)) Fm?(x)=Fm?1?(x)+argminh?∑i=1n?L(yi?,Fm?1?(xi?)+h(xi?))
(加入一棵樹,新的樹更關注之前錯誤的例子)
Stacking:聚合多個分類或回歸模型(可以分階段來做)
Bagging模型(隨機森林)
全稱: bootstrap aggregation(說白了就是并行訓練一堆分類器)
最典型的代表就是隨機森林,現在Bagging模型基本上也是隨機森林。
隨機:數據采樣隨機,每棵樹只用部分數據;數據有多個特征(屬性)組成,每棵樹隨機選擇部分特征。隨機是為了使得每個分類器擁有明顯差異性。
森林:很多個決策樹并行放在一起
如何對所有樹選擇最終結果?分類的話可以采取少數服從多數,回歸的話可以采用取平均值。
集成基本思想
訓練時用多種分類器一起完成同一份任務
測試時對待測試樣本分別通過不同的分類器,匯總最后的結果
import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')
np.random.seed(42)
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moonsX,y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
plt.plot(X[:,0][y==0],X[:,1][y==0],'yo',alpha = 0.6)
plt.plot(X[:,0][y==0],X[:,1][y==1],'bs',alpha = 0.6)
投票策略:軟投票與硬投票
- 硬投票:直接用類別值,少數服從多數
- 軟投票:各自分類器的概率值進行加權平均,或者自己就去概率值最大的作為結果
硬投票實驗
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC# 三種分類器,邏輯回歸,隨機森林,支持向量機
log_clf = LogisticRegression(random_state=42)
rnd_clf = RandomForestClassifier(random_state=42)
svm_clf = SVC(random_state=42)voting_clf = VotingClassifier(estimators =[('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],voting='hard')
voting_clf.fit(X_train,y_train)
from sklearn.metrics import accuracy_score
print('三種分類器的結果')
for clf in (log_clf,rnd_clf,svm_clf):clf.fit(X_train,y_train)y_pred = clf.predict(X_test)print (clf.__class__.__name__,accuracy_score(y_test,y_pred))
print('集成分類的硬投票結果(一般會在效果上有微量提升,但不會太大)')
voting_clf.fit(X_train,y_train)
y_pred = voting_clf.predict(X_test)
print (voting_clf.__class__.__name__,accuracy_score(y_test,y_pred))
結果輸出:
三種分類器的結果
LogisticRegression 0.864
RandomForestClassifier 0.896
SVC 0.896
集成分類的結果(一般會在效果上有微量提升,但不會太大)
VotingClassifier 0.912
軟投票實驗
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVClog_clf = LogisticRegression(random_state=42)
rnd_clf = RandomForestClassifier(random_state=42)
svm_clf = SVC(probability = True,random_state=42)voting_clf = VotingClassifier(estimators =[('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],voting='soft')
from sklearn.metrics import accuracy_score
print('三種分類器的結果')
for clf in (log_clf,rnd_clf,svm_clf):clf.fit(X_train,y_train)y_pred = clf.predict(X_test)print (clf.__class__.__name__,accuracy_score(y_test,y_pred))
print('集成分類的軟投票結果(一般會在效果上有微量提升,但不會太大)')
voting_clf.fit(X_train,y_train)
y_pred = voting_clf.predict(X_test)
print (voting_clf.__class__.__name__,accuracy_score(y_test,y_pred))
結果輸出:
三種分類器的結果
LogisticRegression 0.864
RandomForestClassifier 0.896
SVC 0.896
集成分類的硬投票結果(一般會在效果上有微量提升,但不會太大)
VotingClassifier 0.92
總結:軟投票要求必須各個分別器都能得出概率值,一般來說軟投票效果更好一些