集成學(xué)習(xí)是用多個弱分類器構(gòu)成一個強分類器底洗,其哲學(xué)思想是“三個臭皮匠賽過諸葛亮”祝懂。一般的弱分類器可以由決策樹,神經(jīng)網(wǎng)絡(luò)坠敷,貝葉斯分類器妙同,K-近鄰等構(gòu)成射富。
弱學(xué)習(xí)器:泛華性能略優(yōu)于隨機猜測的學(xué)習(xí)器?
集成學(xué)習(xí)通常可獲得比單一學(xué)習(xí)器顯著優(yōu)越的泛華性能
為什么要集成
如果每個個體學(xué)習(xí)器都互相獨立渐溶,集成模型會工作的很好
但是每個個體學(xué)習(xí)器都在同一個訓(xùn)練集上訓(xùn)練辉浦,可能會犯同一種錯誤,導(dǎo)致集成的準(zhǔn)確率下降?茎辐。
得到多樣的分類器的方法之一:用完全不同的算法浅缸,提高集成的正確率?贾节。
1.模型選擇
假設(shè)各弱分類器間具有一定差異性(如不同的算法,不同參數(shù))教届,這會導(dǎo)致生成的分類決策邊界不同懊亡。將它們結(jié)合后能得到更合理的邊界依啰,減少整體錯誤,實現(xiàn)更好的分類效果店枣。
- 數(shù)據(jù)集過大或過小
數(shù)據(jù)集較大時速警,可以分為不同的子集,分別進行訓(xùn)練鸯两,然后再合成分類器闷旧。
數(shù)據(jù)集過小時,可使用自舉技術(shù)(bootstrapping)钧唐,從原樣本集有放回的抽取m個子集忙灼,訓(xùn)練m個分類器,進行集成钝侠。
集成學(xué)習(xí)通過投票來預(yù)測類別
硬投票分類器
創(chuàng)建一個更好的分類器的方法整合每一個分類器的預(yù)測然后經(jīng)過投票去預(yù)測分類這種分類器叫做硬投票分類器
軟投票分類器
如果分類器能夠估計分為每一類的概率---有predict_proba()方法那么可以對每個分類器的概率取平均该园,再預(yù)測具有最高類概率的類?必須要確保所有分類器都可以估計類的概率
要獲得好的集成,個體學(xué)習(xí)器應(yīng)“好而不同"---準(zhǔn)確性和多樣性
1.每個弱分類器的錯誤率不能高于0.5
2.弱分類器之間的性能要有較大的差別
集成學(xué)習(xí)方法
個體學(xué)習(xí)器之間存在強依賴性關(guān)系帅韧,必須串行生成的序列化方法
Boosting
一族可將弱學(xué)習(xí)器提升為強學(xué)習(xí)器的算法
a.先從初始數(shù)據(jù)集訓(xùn)練出一個基學(xué)習(xí)器
b.根據(jù)基學(xué)習(xí)器的表現(xiàn)對訓(xùn)練樣本分布進行調(diào)整
c.基于調(diào)整后的樣本分布來訓(xùn)練下一個基學(xué)習(xí)器
d.重復(fù)以上步驟里初,直到基學(xué)習(xí)器數(shù)目達到事先指定的值N
e.最后將N個基學(xué)習(xí)器進行加權(quán)結(jié)合??????
Boosting算法在訓(xùn)練的每一輪都要檢查當(dāng)前基分類器是否比隨機猜測好
否則拋棄當(dāng)前基學(xué)習(xí)器,學(xué)習(xí)過程停止忽舟,則可能未達到N???双妨,那么可根據(jù)當(dāng)前分布重新對訓(xùn)練樣本進行采樣,再重新訓(xùn)練出基學(xué)習(xí)器萧诫,使之達到N?
Boosting算法中代表性算法
AdaBoost(自適應(yīng)增強)
Gradient Boosting + Exponential Loss + Binary base classifier
基于數(shù)據(jù)集多重抽樣的分類器斥难,Adaboost是一種迭代算法,算法本身是通過改變數(shù)據(jù)權(quán)值分布來實現(xiàn)帘饶。
a. 給訓(xùn)練數(shù)據(jù)集中的每一個樣本賦予權(quán)重哑诊,權(quán)重初始化相等值,這些權(quán)重形成向量D及刻。一般初始化所有訓(xùn)練樣例的權(quán)重為1 / N,其中N是樣例數(shù)
b.在訓(xùn)練集上訓(xùn)練出弱分類器并計算該分類器的錯誤率
c.同一數(shù)據(jù)集上再次訓(xùn)練分類器镀裤,調(diào)整樣本的權(quán)重竞阐,將第一次分對的樣本權(quán)重降低,第一次分錯的樣本權(quán)重提高
d.最后給每一個分類器分配一個權(quán)重值α暑劝,α = 0.5*ln((1-錯誤率)/錯誤率)
e.計算出alpha值后骆莹,可以對權(quán)重向量D進行更新,以使得正確分類的樣本權(quán)重降低而錯分樣本的權(quán)重升高担猛。
f.Adaboost算法會不斷地重復(fù)訓(xùn)練和調(diào)整權(quán)重幕垦,直到訓(xùn)練錯誤率為0或者弱分類器的數(shù)目達到指定的值。
標(biāo)準(zhǔn)AdaBoost只適用于二分類
Scikit-learn中對應(yīng)為AdaBoostClassifier類傅联,如果要多分類先改,則可以設(shè)置參數(shù)algorithm=”SAMME”,?如果分類器可以預(yù)測概率(有predict_proba()),則設(shè)置參數(shù)algorithm=”SAMME.R” R代表REAL如果AdaBoost集成過擬合蒸走,可以減少基分類器的數(shù)量或?qū)诸惼魇褂酶鼜姷恼齽t化?
GBDT 積跬步以至千里
GB:梯度迭代 Gradient Boosting
通過迭代多棵樹來共同決策仇奶。
DT:回歸樹 Regression Decision Tree
1.先用初始數(shù)據(jù)集來學(xué)習(xí)一顆決策樹,可得到每一片葉子的預(yù)測值比驻。以及預(yù)測之后的殘差(真實值-預(yù)測值)
2.然后下一次迭代的決策樹就基于上一次決策樹的殘差數(shù)據(jù)來學(xué)習(xí)该溯,得到的結(jié)果是上一輪殘差的預(yù)測值,以及本輪殘差
3.不斷迭代别惦,直到最后一輪的殘差為0或者非常小
4.把所用輪次的模型預(yù)測值累加起來就是最終的預(yù)測值
GDBT Boosting參數(shù)
loss:損失函數(shù)狈茉,對于分類模型,有對數(shù)似然函數(shù)“deviance”和指數(shù)損失函數(shù)“exponential” 選擇指數(shù)損失函數(shù)就是Adaboost算法
n_estimators:默認100步咪,最大的弱學(xué)習(xí)器的個數(shù)/弱學(xué)習(xí)器的最大迭代次數(shù)
learning_rate:默認0.1
例子
###1.投票分類器---由幾個不同的分類器組成
from sklearn.datasets import load_iris, make_moons
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.preprocessing import StandardScaler,LabelEncoder
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier,VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
import warnings
warnings.filterwarnings("ignore")
#創(chuàng)建一個半月形的數(shù)據(jù)集论皆,數(shù)據(jù)集劃分
x, y = make_moons(n_samples=1000, noise=0.25, random_state=0)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
#構(gòu)建模型
lr=LogisticRegression()
rf=RandomForestClassifier()
svm1=SVC()
svm2=SVC(probability=True)#SVC默認probability=False,改為True猾漫,將使用交叉驗證
voting_hard=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm1)],voting='hard')
voting_soft=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm2)],voting='soft')
voting_hard.fit(x_train,y_train)
voting_soft.fit(x_train,y_train)
#如果用KNN,LogisticRegression最好標(biāo)準(zhǔn)化特征StandardScaler
#訓(xùn)練模型并進行預(yù)測
print('hard voting')
for mla in (lr,rf,svm1,voting_hard):
mla.fit(x_train,y_train)
y_pred1=mla.predict(x_test)
print(mla.__class__.__name__, accuracy_score(y_test, y_pred1))
print('-'*10)
print('soft voting')
for mlas in (lr,rf,svm2,voting_hard):
mlas.fit(x_train,y_train)
y_pred2=mlas.predict(x_test)
print(mlas.__class__.__name__, accuracy_score(y_test, y_pred2))
###2.AdaBoostClassifier
from sklearn.ensemble import AdaBoostClassifier
ada=AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5)
ada.fit(x_train,y_train)
y_pred3=ada.predict(x_test)
print('-'*10)
print('AdaBoost',accuracy_score(y_test,y_pred3))
#當(dāng)然對于回歸也有AdaBoostRegressor
from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV
iris=load_iris()
x=iris.data
y=iris.target
from sklearn import model_selection
X_train,X_test,y_train,y_test=model_selection.train_test_split(x,y,test_size=0.3,random_state=20)
gbdt=GradientBoostingClassifier()
gbdt.fit(X_train,y_train)
print(gbdt.score(X_test,y_test))
print(gbdt.feature_importances_)
parameters={'n_estimators':[50,80,100],
'learning_rate':[0.01,0.1,0.2,0.5,1]}
gbdt=GradientBoostingClassifier()
grid_search=GridSearchCV(gbdt,parameters,scoring='accuracy',cv=5)
grid_search.fit(x,y)
print(grid_search.best_estimator_)
print(grid_search.best_score_)
print(grid_search.best_params_)