日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第13章 集成学习和随机森林

發(fā)布時(shí)間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第13章 集成学习和随机森林 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.什么是集成學(xué)習(xí)?

kNN,邏輯回歸,SVM,決策樹,神經(jīng)網(wǎng)絡(luò),貝葉斯—>>用多數(shù)算法最終給出的結(jié)果當(dāng)做最終的決策依據(jù),投票:少數(shù)服從多數(shù) Voting Classifier(scikit-learn提供的接口,Voting Classifier分類器)

Voting Classifier:
1)少數(shù)服從多數(shù):hard voting
2)很多時(shí)候少數(shù)服從多數(shù)并不是最合理的,比如說專業(yè)人士的票的權(quán)值應(yīng)該更高一些,更合理的投票,應(yīng)該有權(quán)值。這時(shí)候就有了soft voting,soft voting要求集合的每一個(gè)模型都能估計(jì)概率:邏輯回歸算法本身就是基于概率模型創(chuàng)建的。使用predict_proba函數(shù),說明這個(gè)學(xué)習(xí)算法是可以估計(jì)概率的。
回顧分類算法,看是不是都支持估計(jì)概率。
1.邏輯回歸算法:本身就是基于概率模型,Sigmoid的函數(shù)就是在模擬使用我們的特征計(jì)算一個(gè)值,基于這個(gè)值的不同,相應(yīng)的它屬于某一類的概率是多少,所以邏輯回歸算法是可以預(yù)測(cè)我們分給某一類相應(yīng)的概率的;
2.kNN;
3.決策樹;
4.SVM:SVC中有一個(gè)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)# Hard Voting Classifier 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)# Soft Voting Classifier 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效果好,但是這些只是集成學(xué)習(xí)的入門方式,雖然我們集成了不同的算法,但是算法的種類再多它也是非常有限的,怎么才能集成更多的分類器為我們創(chuàng)建更多的分類結(jié)果?

2.Bagging and Pasting

雖然有很多機(jī)器學(xué)習(xí)算法,但是從投票的角度看,仍然不夠多,我們希望有更多的投票者,才能保證我們最終的結(jié)果更加的可信。概率論中有大數(shù)定理這一說,所以我們就要?jiǎng)?chuàng)建更多的子模型,集成更多子模型的意見。而且更加重要的是:子模型之間不能一致!子模型之間要有差異性。
1)如何創(chuàng)建差異性?–>>每個(gè)子模型只看樣本數(shù)據(jù)的一部分。
例如:一共有500個(gè)樣本數(shù)據(jù);每一個(gè)子模型只看100個(gè)樣本數(shù)據(jù)。每一個(gè)子模型所使用的算法可以是共同的一個(gè)算法,這樣就可以創(chuàng)建很多的子模型,而且這些子模型之間是存在差異性的,這是因?yàn)槊恳粋€(gè)子模型它所看的樣本數(shù)據(jù)時(shí)不一樣的100個(gè)樣本數(shù)據(jù),訓(xùn)練出來的這個(gè)模型肯定是有一定的差異性。—>>可能導(dǎo)致每一個(gè)子模型它的準(zhǔn)確率變得很低,集成學(xué)習(xí)集成了諸多的子模型來投票決定最終的分類結(jié)果,這個(gè)過程中每一個(gè)子模型并不需要太高的準(zhǔn)確率
例子:每個(gè)子模型只有51%的準(zhǔn)確率。

如果我們只有1個(gè)子模型,整體準(zhǔn)確率:51%
如果我們只有3個(gè)子模型,整體準(zhǔn)確率: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個(gè)子模型,整體準(zhǔn)確率:∑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,更常用,產(chǎn)生的子模型更多,更隨機(jī)。統(tǒng)計(jì)學(xué)中放回取樣:bootstrap
選擇決策樹模型:這種非參數(shù)的學(xué)習(xí)方式更能產(chǎn)生出差異相對(duì)比較大的子模型,它里面有很多參數(shù)以及剪枝方式都能幫助使得集成的每一個(gè)模型更加有差異性,更加隨機(jī)。

# 使用Bagging 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相關(guān)的內(nèi)容

**OOB **:Out of Bag,放回取樣有一定的概率導(dǎo)致一部分樣本很有可能沒有取到。平均大概有37%的樣本沒有取到,沒有取到的樣本通常叫做Out of Bag。
不使用測(cè)試數(shù)據(jù)集,而使用這部分沒有取到的樣本做測(cè)試/驗(yàn)證。oob_score_
Bagging的思路極易并行化處理,n_jobs,傳入-1時(shí),使用計(jì)算機(jī)所有的核。
其他產(chǎn)生差異化的方式:1)針對(duì)特征進(jìn)行隨機(jī)采樣(Random Subspaces);2)既針對(duì)樣本,又針對(duì)特征進(jìn)行隨機(jī)采樣(Random Patches)

# 使用oob 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_ # 不是用戶傳進(jìn)去的參數(shù),而是經(jīng)過我們的類計(jì)算出的結(jié)果# n_jobs %%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)# bootstrap_features 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.隨機(jī)森林

Bagging:使用隨機(jī)取樣的方式,包括在特征空間中隨機(jī)取特征的方式來創(chuàng)建諸多的子模型,然后將他們集成在一起,這種方式就叫做Bagging。
隨機(jī)森林:在演示Bagging這種集成學(xué)習(xí)的方式的時(shí)候,使用的這個(gè)基礎(chǔ)的分類器(或者說基礎(chǔ)的評(píng)估的算法)都是決策樹,我們整個(gè)集成學(xué)習(xí)就相當(dāng)于集成了成百上千個(gè)決策樹,對(duì)于這樣的一個(gè)集成學(xué)習(xí)的模型通常叫做隨機(jī)森林(我們有很多樹,每一顆樹都是通過隨機(jī)取樣的方式來訓(xùn)練生成的,所以具有隨機(jī)性;這么多樹放在一起,就形成了森林)
Bagging,Base Estimator:Decision Tree ,
scikit-learn中封裝的隨機(jī)森林,決策樹在節(jié)點(diǎn)劃分上,在隨機(jī)的特征子集上尋找最優(yōu)劃分特征。增加了每一個(gè)子模型的隨機(jī)性。
Extra-Trees:和隨機(jī)森林相似的另外一種方法(極其隨機(jī)的森林:決策樹在節(jié)點(diǎn)的劃分上,使用隨機(jī)的特征和隨機(jī)的閾值)
特點(diǎn):提供額外的隨機(jī)性,抑制過擬合,但增大的bias(偏差),遏制的方差。需要根據(jù)實(shí)際情況進(jìn)行選擇。
優(yōu)點(diǎn):更快的訓(xùn)練速度。

# 隨機(jī)森林 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) # 每一個(gè)決策樹最多有16個(gè)節(jié)點(diǎn) rf_clf2.fit(X,y) rf_clf2.oob_score_ # 使用Extra-Trees 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_ # 集成學(xué)習(xí)解決回歸問題 from sklearn.ensemble import BaggingRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.ensemble import ExtraTreesRegressor

5.Boosting

是另一種集成學(xué)習(xí)的思路,集成多個(gè)模型,和Bagging不同的是,Boosting每個(gè)模型之間不是彼此獨(dú)立的關(guān)系,而是一個(gè)相互增強(qiáng)的關(guān)系,集成多個(gè)模型,每個(gè)模型都在嘗試增強(qiáng)(boosting)整體的效果
舉例:

1)Ada Boosting

2)Gradient Boosting

訓(xùn)練一個(gè)模型m1,產(chǎn)生錯(cuò)誤e1;
針對(duì)e1訓(xùn)練第二個(gè)模型m2,產(chǎn)生錯(cuò)誤e2;
針對(duì)e2訓(xùn)練第三個(gè)模型m3,產(chǎn)生錯(cuò)誤e3;
最終預(yù)測(cè)結(jié)果是:m1+m2+m3…

# AdaBoosting 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) # Gradient Boosting 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) # Boosting解決回歸問題 from sklearn.ensemble import AdaBoostRegressor from sklearn.ensemble import GradientBoostingRegressor

6.Stacking

一種集成學(xué)習(xí)的思路,邏輯回歸解決的是一個(gè)分類的問題但是卻叫做邏輯回歸?邏輯回歸本質(zhì)上計(jì)算的是我們的樣本屬于某一類的概率是多少。

總結(jié)

以上是生活随笔為你收集整理的第13章 集成学习和随机森林的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。