1. 程式人生 > >關於整合學習的總結(一) 投票法

關於整合學習的總結(一) 投票法

最近在寫那個完整的機器學習專案部落格時候,我本來打算用一篇部落格來寫的。結果發現要寫的越來越多。而且最關鍵的是,以前以為有些地方理解了,其實並沒有理解。大概這就是寫部落格記筆記的好處吧。。。可惜我上高中初中那會,從來都沒記過233333

這篇整合學習的總結呢,將結合sklearn 的運用說一說有關整合學習的一些東西,包括bagging、boosting、stacking和其他一些演算法,我們會重點討論隨機森林、GBDT、Xgboost、LightGBM。也包括sklearn 當中怎麼使用它們,sklearn中對這些引數怎麼進行調參等。

每一篇打算要最後回答這樣幾個問題:

該整合學習方法的流程? 該整合學習方法如何選擇特徵 ? 該整合學習方法 如何構建特徵 ? 該整合學習方法如何用於分類或迴歸? 該整合學習方法通過什麼方式減少誤差 ? 該整合學習方法的效果相比於傳統的LR,SVM效果為什麼好一些 ? 該整合學習方法 如何加速訓練? 該整合學習方法的引數有哪些,如何調參 ? 該整合學習方法實戰當中遇到的一些問題 ? 該整合學習方法的優缺點 ? 該整合學習演算法與其他整合方法的不同?

投票分類

假設你已經訓練了一些分類器,每一個都有 80% 的準確率。你可能有了一個邏輯斯蒂迴歸、或一個 SVM、或一個隨機森林,或者一個 KNN,或許還有更多。現在我們可以在這些基學習器的基礎上得到一個投票的分類器,把票數最多的類作為我們要預測的類別

為什麼這樣的基分類器有效呢?這其實和大數定律有關係。

讓我們考慮下面一個問題:

假設你有一個有偏差的硬幣,他有 51% 的機率為正面,49% 的機率為背面。如果你實驗 1000 次,你會得到差不多 510 次正面,490 次背面,因此大多數都是正面。如果你用數學計算,你會發現在實驗 1000 次後,正面概率為 51% 的人比例為 75%。你實驗的次數越多,正面的比例越大(例如你試驗了 10000 次,總體比例可能性就會達到 97%)。這是因為大數定律

 :當你一直用硬幣實驗時,正面的比例會越來越接近 51%。你可以看到當實驗次數上升時,正面的概率接近於 51%。最終所有 10 種實驗都會收斂到 51%,它們都大於 50%。

假設你建立了一個包含 1000 個分類器的整合模型,其中每個分類器的正確率只有 51%(僅比瞎猜好一點點)。如果你用投票去預測類別,你可能得到 75% 的準確率!然而,這僅僅在所有的分類器都獨立執行的很好、不會發生有相關性的錯誤的情況下才會這樣,然而每一個分類器都在同一個資料集上訓練,導致其很可能會發生這樣的錯誤。他們可能會犯同一種錯誤,所以也會有很多票投給了錯誤類別導致整合的準確率下降。

這個的原理是什麼呢?讓我們翻出周志華老師的機器學習第172頁:

由上面的不等式可以看出隨著基分類器個數T的增大,整合的數目將成指數級下降,但是一定注意到這個相互獨立的假設!!!

如果使每一個分類器都獨立自主的分類,那麼整合模型會工作的很好。去得到多樣的分類器的方法之一就是用完全不同的演算法,這會使它們會做出不同種類的預測,這會提高整合的正確率

投票器的使用

我們拿sklearn 中的make_moons 做一次實驗,用sklearn 中的VotingClassifier 進行實驗

from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import 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)
vote_clf = VotingClassifier(estimators = [('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],voting='hard')
vote_clf.fit(X_train,y_train)
from sklearn.metrics import accuracy_score
for clf in (log_clf,rnd_clf,svm_clf,vote_clf):
    clf.fit(X_train,y_train)
    y_pred = clf.predict(X_test)
    print(clf.__class__.__name__,accuracy_score(y_pred,y_test))
#輸出結果
LogisticRegression 0.864
RandomForestClassifier 0.872
SVC 0.888
VotingClassifier 0.896

可以看到實驗結果有了輕微的提升。

現在我們可以試著回答開頭的幾個問題了

1.投票法的流程?

 投票法的流程是尋找幾個基分類器,然後基於分類器的超過半數的結果作為最終的預測分類。

2.投票法如何選擇特徵 ?

投票法不尋找特徵,尋找特徵是各個基分類器要乾的事情。

3.投票法 如何構建特徵 ?

同第二問

4.投票法如何用於分類或迴歸?

如果是分類,投票法把超過半數以上的投票結果作為要預測的分類,投票法處理迴歸問題,是將各個基分類器的迴歸結果簡單求平均

5.投票法通過什麼方式減少誤差 ?

通過上文給的證明可以看出,在基分類器的個數足夠多且相互獨立,即使他們之比什麼都不幹好一點點,也能指數級減少誤差。

6.投票法的效果相比於傳統的LR,SVM效果為什麼好一些 ?

事實上如果基分類器都是這些傳統模型且相互獨立,投票法確實從上文中要比傳統的方法的要好一些。但是呢,周志華老師給了一個非常精彩的例子在機器學習172頁,當基分類器差不多時,投票法反而效果下降了

投票法 如何加速訓練? 投票法的引數有哪些,如何調參 ? 投票法實戰當中遇到的一些問題 ? 投票法的優缺點 ? 該整合學習演算法與其他整合方法的不同

這幾個問題 一起回答,加速訓練即加速基分類器的訓練就好,調參是基分類器的引數,投票法的優缺點主要看基分類的獨立性,如果是決策樹、SVM這幾種完全不同的思路的基分類器,可能效果會好些。如果都是樹模型說不定會取得比較差的結果。