生活随笔
收集整理的這篇文章主要介紹了
第13章 集成学习和随机森林
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.什么是集成學習?
kNN,邏輯回歸,SVM,決策樹,神經網絡,貝葉斯—>>用多數算法最終給出的結果當做最終的決策依據,投票:少數服從多數 Voting Classifier(scikit-learn提供的接口,Voting Classifier分類器)
Voting Classifier:
1)少數服從多數:hard voting
2)很多時候少數服從多數并不是最合理的,比如說專業人士的票的權值應該更高一些,更合理的投票,應該有權值。這時候就有了soft voting,soft voting要求集合的每一個模型都能估計概率:邏輯回歸算法本身就是基于概率模型創建的。使用predict_proba函數,說明這個學習算法是可以估計概率的。
回顧分類算法,看是不是都支持估計概率。
1.邏輯回歸算法:本身就是基于概率模型,Sigmoid的函數就是在模擬使用我們的特征計算一個值,基于這個值的不同,相應的它屬于某一類的概率是多少,所以邏輯回歸算法是可以預測我們分給某一類相應的概率的;
2.kNN;
3.決策樹;
4.SVM:SVC中有一個probability;
import numpy
as np
import matplotlib
.pyplot
as plt
from sklearn
import datasets
X
,y
=datasets
.make_moons
(n_samples
=500,noise
=0.3,random_state
=42)
plt
.scatter
(X
[y
==0,0],X
[y
==0,1])
plt
.scatter
(X
[y
==1,0],X
[y
==1,1])
plt
.show
()
from sklearn
.model_selection
import train_test_split
X_train
,X_test
,y_train
,y_test
=train_test_split
(X
,y
,random_state
=42)
from sklearn
.linear_model
import LogisticRegression
from sklearn
.svm
import SVC
from sklearn
.tree
import DecisionTreeClassifier
from sklearn
.ensemble
import VotingClassifier
voting_clf
=VotingClassifier
(estimators
=[('log_clf',LogisticRegression
()),('svm_clf',SVC
()),('dt_clf',DecisionTreeClassifier
(random_state
=666))
],voting
='hard')
voting_clf
.fit
(X_train
,y_train
)
voting_clf
.score
(X_test
,y_test
)
voting_clf2
=VotingClassifier
(estimators
=[('log_clf',LogisticRegression
()),('svm_clf',SVC
(probability
=True)),('dt_clf',DecisionTreeClassifier
(random_state
=666))
],voting
='soft')
voting_clf2
.fit
(X_train
,y_train
)
voting_clf2
.score
(X_test
,y_test
)
soft voting classifier效果好,但是這些只是集成學習的入門方式,雖然我們集成了不同的算法,但是算法的種類再多它也是非常有限的,怎么才能集成更多的分類器為我們創建更多的分類結果?
2.Bagging and Pasting
雖然有很多機器學習算法,但是從投票的角度看,仍然不夠多,我們希望有更多的投票者,才能保證我們最終的結果更加的可信。概率論中有大數定理這一說,所以我們就要創建更多的子模型,集成更多子模型的意見。而且更加重要的是:子模型之間不能一致!子模型之間要有差異性。
1)如何創建差異性?–>>每個子模型只看樣本數據的一部分。
例如:一共有500個樣本數據;每一個子模型只看100個樣本數據。每一個子模型所使用的算法可以是共同的一個算法,這樣就可以創建很多的子模型,而且這些子模型之間是存在差異性的,這是因為每一個子模型它所看的樣本數據時不一樣的100個樣本數據,訓練出來的這個模型肯定是有一定的差異性。—>>可能導致每一個子模型它的準確率變得很低,集成學習集成了諸多的子模型來投票決定最終的分類結果,這個過程中每一個子模型并不需要太高的準確率。
例子:每個子模型只有51%的準確率。
如果我們只有1個子模型,整體準確率:51%
如果我們只有3個子模型,整體準確率:0.513+C32?0.512?0.49=51.5%\bf0.51^3+C_3^2\cdot0.51^2\cdot0.49=51.5 \%0.513+C32??0.512?0.49=51.5%
如果我們只有500個子模型,整體準確率:∑i=1500C500i?0.51i?0.49500?i=65.6%\bf\sum_{i=1}^{500}C_{500}^i\cdot0.51^i\cdot0.49^{500-i}=65.6\%∑i=1500?C500i??0.51i?0.49500?i=65.6%
取樣:放回取樣(Bagging),不放回取樣(Pasting)
Bagging,更常用,產生的子模型更多,更隨機。統計學中放回取樣:bootstrap
選擇決策樹模型:這種非參數的學習方式更能產生出差異相對比較大的子模型,它里面有很多參數以及剪枝方式都能幫助使得集成的每一個模型更加有差異性,更加隨機。
from sklearn
.tree
import DecisionTreeClassifier
from sklearn
.ensemble
import BaggingClassifier
bagging_clf2
=BaggingClassifier
(DecisionTreeClassifier
(),n_estimators
=5000,max_samples
=100,bootstrap
=True)
bagging_clf
.fit
(X_train
,y_train
)
bagging_clf
.score
(X_test
,y_test
)
3.更多和Bagging相關的內容
**OOB **:Out of Bag,放回取樣有一定的概率導致一部分樣本很有可能沒有取到。平均大概有37%的樣本沒有取到,沒有取到的樣本通常叫做Out of Bag。
不使用測試數據集,而使用這部分沒有取到的樣本做測試/驗證。oob_score_
Bagging的思路極易并行化處理,n_jobs,傳入-1時,使用計算機所有的核。
其他產生差異化的方式:1)針對特征進行隨機采樣(Random Subspaces);2)既針對樣本,又針對特征進行隨機采樣(Random Patches)
from sklearn
.tree
import DecisionTreeClassifier
from sklearn
.ensemble
import BaggingClassifier
bagging_clf
=BaggingClassifier
(DecisionTreeClassifier
(),
n_estimators
=500,max_samples
=100,bootstrap
=True,oob_score
=True)
bagging_clf
.fit
(X
,y
)
bagging_clf
.oob_score_
%%time
bagging_clf
=BaggingClassifier
(DecisionTreeClassifier
(),n_estimators
=500,max_samples
=100,bootstrap
=True,oob_score
=True)
bagging_clf
.fit
(X
,y
)%%time
bagging_clf
= BaggingClassifier
(DecisionTreeClassifier
(),n_estimators
=500, max_samples
=100,bootstrap
=True, oob_score
=True,n_jobs
=-1)
bagging_clf
.fit
(X
, y
)
random_subspaces_clf
=BaggingClassifier
(DecisionTreeClassifier
(),n_estimators
=500,max_samples
=500,bootstrap
=True,oob_score
=True,max_features
=1,bootstrap_features
=True)
random_subspaces_clf
.fit
(X
,y
)
random_subspaces_clf
.oob_score_random_patches_clf
= BaggingClassifier
(DecisionTreeClassifier
(),n_estimators
=500, max_samples
=100,bootstrap
=True, oob_score
=True,max_features
=1, bootstrap_features
=True)
random_patches_clf
.fit
(X
, y
)
random_patches_clf
.oob_score_
4.隨機森林
Bagging:使用隨機取樣的方式,包括在特征空間中隨機取特征的方式來創建諸多的子模型,然后將他們集成在一起,這種方式就叫做Bagging。
隨機森林:在演示Bagging這種集成學習的方式的時候,使用的這個基礎的分類器(或者說基礎的評估的算法)都是決策樹,我們整個集成學習就相當于集成了成百上千個決策樹,對于這樣的一個集成學習的模型通常叫做隨機森林(我們有很多樹,每一顆樹都是通過隨機取樣的方式來訓練生成的,所以具有隨機性;這么多樹放在一起,就形成了森林)
Bagging,Base Estimator:Decision Tree ,
scikit-learn中封裝的隨機森林,決策樹在節點劃分上,在隨機的特征子集上尋找最優劃分特征。增加了每一個子模型的隨機性。
Extra-Trees:和隨機森林相似的另外一種方法(極其隨機的森林:決策樹在節點的劃分上,使用隨機的特征和隨機的閾值)
特點:提供額外的隨機性,抑制過擬合,但增大的bias(偏差),遏制的方差。需要根據實際情況進行選擇。
優點:更快的訓練速度。
from sklearn
.ensemble
import RandomForestClassifier
rf_clf
=RandomForestClassifier
(n_estimators
=500,random_state
=666,oob_score
=True,n_jobs
=-1)
rf_clf
.fit
(X
,y
)
rf_clf
.oob_score_
rf_clf2
=RandomForestClassifier
(n_estimators
=500,max_leaf_nodes
=16,random_state
=666,oob_score
=True,n_jobs
=-1)
rf_clf2
.fit
(X
,y
)
rf_clf2
.oob_score_
from sklearn
.ensemble
import ExtraTreesClassifier
et_clf
=ExtraTreesClassifier
(n_estimators
=50,bootstrap
=True,oob_score
=True,random_state
=666)
et_clf
.fit
(X
,y
)
et_clf
.oob_score_
from sklearn
.ensemble
import BaggingRegressor
from sklearn
.ensemble
import RandomForestRegressor
from sklearn
.ensemble
import ExtraTreesRegressor
5.Boosting
是另一種集成學習的思路,集成多個模型,和Bagging不同的是,Boosting每個模型之間不是彼此獨立的關系,而是一個相互增強的關系,集成多個模型,每個模型都在嘗試增強(boosting)整體的效果
舉例:
1)Ada Boosting
2)Gradient Boosting
訓練一個模型m1,產生錯誤e1;
針對e1訓練第二個模型m2,產生錯誤e2;
針對e2訓練第三個模型m3,產生錯誤e3;
最終預測結果是:m1+m2+m3…
from sklearn
.tree
import DecisionTreeClassifier
from sklearn
.ensemble
import AdaBoostClassifier
ada_clf
=AdaBoostClassifier
(DecisionTreeClassifier
(max_depth
=22),n_estimators
=500)
ada_clf
.fit
(X_train
,y_train
)
ada_clf
.score
(X_test
,y_test
)
from sklearn
.ensemble
import GradientBoostingClassifier
gb_clf
=GradientBoostingClassifier
(max_depth
=2,n_estimators
=30)
gb_clf
.fit
(X_train
,y_train
)
gb_clf
.score
(X_test
,y_test
)
from sklearn
.ensemble
import AdaBoostRegressor
from sklearn
.ensemble
import GradientBoostingRegressor
6.Stacking
一種集成學習的思路,邏輯回歸解決的是一個分類的問題但是卻叫做邏輯回歸?邏輯回歸本質上計算的是我們的樣本屬于某一類的概率是多少。
總結
以上是生活随笔為你收集整理的第13章 集成学习和随机森林的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。