sklearn快速入门教程:(五)集成学习
sklearn快速入門教程–(五)集成學習
一、集成學習簡述
集成學習是目前各類競賽和工程中應用最廣泛的模型提升方法。比如在kaggle中就有關于集成學習的介紹(Kaggle模型融合原文)。這里所謂的模型融合實際上主要就是集成學習方法。
常見的集成學習有以下幾種:
- Boosting
- Bagging
- Stacking
其中boosting和bagging應用最多。比如目前流行的xgboost就是(gradient)boosting的一種,而random forest則是bagging的一種。
二、集成學習的兩種主要思路
各種集成學習的思路不盡相同,尤其對于初學者通常一看到集成學習的理論都會很頭疼。那么要快速學會集成學習的使用,就先要對其關鍵的思路有所了解。
顧名思義,集成學習是將多個模型放在一起,通過某種方式將其組合起來,從而得到一個統一的預測模型。自然地,在集成之前就要有基本的模型用于集成。目前所用的集成學習模式主要分為兩種:
- 采用同一基模型,在樣本的不同子集上進行訓練,從而得到對應的多個不同的具體模型。這類學習方法的代表就是boosting, bagging。
- 采用多種基模型,在同一樣本上進行訓練,將多個模型組合起來得到具體模型。voting和stacking都是采用這類方式。
明白這一點之后其實就很容易分析sklearn中的對應方法了,對單一模型對應的方法,它的語法通常是這樣:
ensemble_method(estimator,**args)這里estimator是指sklearn中的基模型,比如Tree,LinearRegression等都屬于這一類型,而**args則表示其它參數。結合上一教程中的內容不難想到,這個estimator實際上就是一種通用模式,也就是說它只要屬于這一類型,其它的方面就可以完全自由設定。比如我想用一個SVC來進行集成,同時又想指定它的核函數,那么就可以直接將SVC(kernel='rbf')傳入函數。這種靈活的操作方式會給我們各類改進和提升提供便利。
而對于多個模型通常是這樣:
ensemble_method(estimators,**args)注意這里是estimators,也就是多個模型。那么很自然地想到多個模型肯定是以集合的形式輸入。事實上在sklearn中,這里是用列表表示多個模型,而每個模型則由其名稱和實體類型來表示。比如:
estimators = [('lr', RidgeCV()),('svr', LinearSVR(random_state=42))]可想而知,如果有更多的模型,則直接在列表中繼續加入即可。
三、單一模型集成 - - 以Adaboost為例
這里我們以iris數據集作為樣本,將100個Logistic Regression模型用Adaboost集成起來。
from sklearn.model_selection import cross_val_score from sklearn.datasets import load_iris from sklearn.ensemble import AdaBoostClassifier from sklearn.linear_model import LogisticRegressionX, y = load_iris(return_X_y=True) clf = AdaBoostClassifier(LogisticRegression(), n_estimators=100) clf.fit(X,y) clf.predict(X)運行結果:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2,2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2])可以看到,在sklearn中實現這樣的集成學習是非常簡單的,只需要一句代碼即可。訓練和預測和直接使用機器學習模型是完全一樣的語法。這一點也是sklearn中一個亮點,它盡最大可能減小了程序員去背工具模式的工作,從而可以將更多精力集中在問題本身。
四、多模型集成 - - 以Voting例
Voting是一種多模型集成的常用方法,它先將多個模型進行投票,再按照投票結果對模型進行組合。這里我們以iris數據集為基礎,將Logistic Regression, 高斯樸素貝葉斯和隨機森林進行集成。
from sklearn import datasets from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import GaussianNB from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import VotingClassifieriris = datasets.load_iris() X, y = iris.data[:, 1:3], iris.targetclf1 = LogisticRegression(random_state=1) clf2 = RandomForestClassifier(n_estimators=50, random_state=1) clf3 = GaussianNB()eclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)],voting='hard')for clf, label in zip([clf1, clf2, clf3, eclf], ['Logistic Regression', 'Random Forest', 'naive Bayes', 'Ensemble']):scores = cross_val_score(clf, X, y, scoring='accuracy', cv=5)print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))運行結果:
Accuracy: 0.95 (+/- 0.04) [Logistic Regression] Accuracy: 0.94 (+/- 0.04) [Random Forest] Accuracy: 0.91 (+/- 0.04) [naive Bayes] Accuracy: 0.95 (+/- 0.04) [Ensemble]如上文所述,在sklearn中對多個模型進行集成時是將多個模型實例傳給集成方法,源碼中的第16行即是如此。
五、小結
本文簡要介紹了sklearn中集成學習的使用方法,從基模型的角度上可以簡單地將方法分為兩類,從而快速掌握兩類方法的基本使用。以下小結了sklearn中對應的方法和模型類型:
| Adaboost | 單個模型 |
| Bagging | 單個模型 |
| Gradient boost | 決策樹 |
| Voting | 多個模型 |
| Staking | 多個模型 |
在本文的基礎上,強烈建議再去學習Kaggle模型融合原文 ,此時在文中提到的各類集成方法其實都可以用sklearn中的方法進行實現了。而仔細學完這篇文章,參加各類競賽的入門級標準也就基本達到了。
sklearn的快速入門到此就結束。當然這個系列只是一個簡單的入門教程,涉及的模型和方法都非常有限,要想掌握更多的方法,更有效地解決自己的問題,則需要耐心地長期積累。
-
sklearn快速入門教程:(一)準備工作
-
klearn快速入門教程:(二)線性回歸
-
sklearn快速入門教程:(三)機器學習的通用模式及實現方法
-
sklearn快速入門教程:(四)模型自動調參
總結
以上是生活随笔為你收集整理的sklearn快速入门教程:(五)集成学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn快速入门教程:(四)模型自
- 下一篇: 模糊数学笔记:一、模糊集及其运算性质