Python數(shù)據(jù)分析與挖掘算法從入門到機(jī)器學(xué)習(xí) 課件 第17章 集成學(xué)習(xí)_第1頁
Python數(shù)據(jù)分析與挖掘算法從入門到機(jī)器學(xué)習(xí) 課件 第17章 集成學(xué)習(xí)_第2頁
Python數(shù)據(jù)分析與挖掘算法從入門到機(jī)器學(xué)習(xí) 課件 第17章 集成學(xué)習(xí)_第3頁
Python數(shù)據(jù)分析與挖掘算法從入門到機(jī)器學(xué)習(xí) 課件 第17章 集成學(xué)習(xí)_第4頁
Python數(shù)據(jù)分析與挖掘算法從入門到機(jī)器學(xué)習(xí) 課件 第17章 集成學(xué)習(xí)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第十七章集成學(xué)習(xí)原理應(yīng)用舉例目錄原理在機(jī)器學(xué)習(xí)的有監(jiān)督學(xué)習(xí)算法中,我們的目標(biāo)是學(xué)習(xí)出一個穩(wěn)定的且在各個方面表現(xiàn)都較好的模型,但實際情況往往不這么理想,有時我們只能得到多個有偏好的模型(弱監(jiān)督模型,在某些方面表現(xiàn)的比較好)。集成學(xué)習(xí)就是組合這里的多個弱監(jiān)督模型以期得到一個更好更全面的強(qiáng)監(jiān)督模型,集成學(xué)習(xí)潛在的思想是即便某一個弱分類器得到了錯誤的預(yù)測,其他的弱分類器也可以將錯誤糾正回來。集成方法是將幾種機(jī)器學(xué)習(xí)技術(shù)組合成一個預(yù)測模型的元算法,以達(dá)到減小方差、偏差或改進(jìn)預(yù)測的效果。原理集成學(xué)習(xí)在各個規(guī)模的數(shù)據(jù)集上都有很好的策略。數(shù)據(jù)集大:劃分成多個小數(shù)據(jù)集,學(xué)習(xí)多個模型進(jìn)行組合。數(shù)據(jù)集?。豪肂ootstrap方法進(jìn)行抽樣,得到多個數(shù)據(jù)集,分別訓(xùn)練多個模型再進(jìn)行組合。集合方法可分為兩類:序列集成方法,其中參與訓(xùn)練的基礎(chǔ)學(xué)習(xí)器按照順序生成(例如

AdaBoost)。序列方法的原理是利用基礎(chǔ)學(xué)習(xí)器之間的依賴關(guān)系。通過對之前訓(xùn)練中錯誤標(biāo)記的樣本賦值較高的權(quán)重,可以提高整體的預(yù)測效果。并行集成方法,其中參與訓(xùn)練的基礎(chǔ)學(xué)習(xí)器并行生成(例如隨機(jī)森林)。并行方法的原理是利用基礎(chǔ)學(xué)習(xí)器之間的獨(dú)立性,通過平均可以顯著降低錯誤。原理總結(jié)一下,集成學(xué)習(xí)法的特點(diǎn):將多個分類方法聚集在一起,以提高分類的準(zhǔn)確率(這些算法可以是不同的算法,也可以是相同的算法)。集成學(xué)習(xí)法由訓(xùn)練數(shù)據(jù)構(gòu)建一組基分類器,然后通過對每個基分類器的預(yù)測進(jìn)行投票來進(jìn)行分類。嚴(yán)格來說,集成學(xué)習(xí)并不算是一種分類器,而是一種分類器結(jié)合的方法。通常一個集成分類器的分類性能會好于單個分類器。如果把單個分類器比作一個決策者的話,集成學(xué)習(xí)的方法就相當(dāng)于多個決策者共同進(jìn)行一項決策。原理下面介紹集成學(xué)習(xí)的幾個方法:Bagging,Boosting以及Stacking。1.Bagging(bootstrap

aggregating,裝袋)Bagging即套袋法,先說一下bootstrap,bootstrap也稱為自助法,它是一種有放回的抽樣方法,目的為了得到統(tǒng)計量的分布以及置信區(qū)間,其算法過程如下:從原始樣本集中抽取訓(xùn)練集。每輪從原始樣本集中使用

bootstrap的方法抽取n個訓(xùn)練樣本(在訓(xùn)練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中)。共進(jìn)行k輪抽取,得到k個訓(xùn)練集。(k個訓(xùn)練集之間是相互獨(dú)立的)每次使用一個訓(xùn)練集得到一個模型,k個訓(xùn)練集共得到k個模型。(注:這里并沒有具體的分類算法或回歸方法,我們可以根據(jù)具體問題采用不同的分類或回歸方法,如決策樹、感知器等)原理(3)對分類問題:將上步得到的k個模型采用投票的方式得到分類結(jié)果;對回歸問題,計算上述模型的均值作為最后的結(jié)果。(所有模型的重要性相同)原理由此,總結(jié)一下bagging方法:Bagging通過降低基分類器的方差,改善了泛化誤差。其性能依賴于基分類器的穩(wěn)定性;如果基分類器不穩(wěn)定,bagging有助于降低訓(xùn)練數(shù)據(jù)的隨機(jī)波動導(dǎo)致的誤差;如果穩(wěn)定,則集成分類器

的誤差主要由基分類器的偏倚引起。由于每個樣本被選中的概率相同,因此bagging并不側(cè)重于訓(xùn)練數(shù)據(jù)集中的任何特定實例。常用的集成算法類是隨機(jī)森林。在隨機(jī)森林中,集成中的每棵樹都是由從訓(xùn)練集中抽取的樣本(即bootstrap樣本)構(gòu)建的。另外,與使用所有特征不同,這里隨機(jī)選擇特征子集,從而進(jìn)一步達(dá)到對樹的隨機(jī)化目的。因此,隨機(jī)森林產(chǎn)生的偏差略有增加,但是由于對相關(guān)性較小的樹計算平均值,估計方差減小了,導(dǎo)致模型的整體效果更好。原理Boosting其主要思想是將弱分類器組裝成一個強(qiáng)分類器。在PAC(probablyapproximately

correct,概率近似正確)學(xué)習(xí)框架下,則一定可以將弱分類器組裝成一個強(qiáng)分類器。關(guān)于Boosting的兩個核心問題:在每一輪如何改變訓(xùn)練數(shù)據(jù)的權(quán)值或概率分布?通過提高那些在前一輪被弱分類器分錯樣例的權(quán)值,減小前一輪分對樣例的權(quán)值,來使得分類器對誤分的數(shù)據(jù)有較好的效果。通過什么方式來組合弱分類器?通過加法模型將弱分類器進(jìn)行線性組合,比如:

AdaBoost(Adaptiveboosting)算法:剛開始訓(xùn)練時對每一個訓(xùn)練例賦相等的權(quán)重,然后用該算法對訓(xùn)練集訓(xùn)練t輪,每次訓(xùn)練后,對訓(xùn)練失敗的訓(xùn)練例賦以較大的權(quán)重,也就是讓學(xué)習(xí)算法在每次學(xué)習(xí)以后更注意學(xué)原理GBDT(GradientBoostDecisionTree),每一次的計算是為了減少上一次的殘差,GBDT在殘差減少(負(fù)梯度)的方向上建立一個新的模型。原理StackingStacking方法是指訓(xùn)練一個模型用于組合其他各個模型。首先我們先訓(xùn)練多個不同的模型,然后把之前訓(xùn)練的各個模型的輸出為輸入來訓(xùn)練一個模型,以得到一個最終的輸出。理論上,Stacking可以表示上面提到的兩種Ensemble方法,只要我們采用合適的模型組合策略即可。但在實際中,我們通常使用logistic回歸作為組合策略。先在整個訓(xùn)練數(shù)據(jù)集上通過bootstrap抽樣得到各個訓(xùn)練集合,得到一系列分類模型,然后將輸出用于訓(xùn)練第二層分類器。具體的過程如下:(1)劃分訓(xùn)練數(shù)據(jù)集為兩個不相交的集合。在第一個集合上訓(xùn)練多個學(xué)習(xí)器。在第二個集合上測試這幾個學(xué)習(xí)器。把第三步得到的預(yù)測結(jié)果作為輸入,把正確的回應(yīng)作為輸出,訓(xùn)練一個高層學(xué)習(xí)器。這里需要注意的是(1)-(3)步的效果,我們不是用贏家通吃,而是使用非線性組合學(xué)習(xí)器的方法。原理4.Bagging,Boosting二者之間的區(qū)別

(1)Bagging和Boosting的區(qū)別:1)樣本選擇上:Bagging:訓(xùn)練集是在原始集中有放回選取的,從原始集中選出的各輪訓(xùn)練集之間是獨(dú)立的。Boosting:每一輪的訓(xùn)練集不變,只是訓(xùn)練集中每個樣例在分類器中的權(quán)重發(fā)生變化。而權(quán)值是根據(jù)上一輪的分類結(jié)果進(jìn)行調(diào)整。2)樣例權(quán)重:Bagging:使用均勻取樣,每個樣例的權(quán)重相等。Boosting:根據(jù)錯誤率不斷調(diào)整樣例的權(quán)值,錯誤率越大則權(quán)重越大。原理預(yù)測函數(shù):Bagging:所有預(yù)測函數(shù)的權(quán)重相等。Boosting:每個弱分類器都有相應(yīng)的權(quán)重,對于分類誤差小的分類器會有更大的權(quán)重。并行計算:Bagging:各個預(yù)測函數(shù)可以并行生成Boosting:各個預(yù)測函數(shù)只能順序生成,因為后一個模型參數(shù)需要前一輪模型的結(jié)果。(2)決策樹與這些算法框架進(jìn)行結(jié)合所得到的新的算法:1)Bagging+決策樹=隨機(jī)森林2)AdaBoost+決策樹=提升樹3)Gradient

Boosting+決策樹=GBDT應(yīng)用舉例【例17.1】泰坦尼克數(shù)據(jù)應(yīng)用集成學(xué)習(xí)舉例。1.獲取數(shù)據(jù),并輸出數(shù)據(jù)分析的結(jié)果,可以發(fā)現(xiàn)Age這列有缺失值

import

pandas

as

pdtitanic

=

pd.read_csv("Titanic.csv")titanic.head()print(titanic.describe())#輸出結(jié)果如圖所示應(yīng)用舉例2.使用中值進(jìn)行數(shù)據(jù)填充titanic["Age"]=titanic["Age"].fillna(titanic["Age"].median())

print(titanic.describe())#填充后輸出結(jié)果如圖17-2所示應(yīng)用舉例3.將Sex這一列的字符串轉(zhuǎn)成整數(shù),方便計算

print(titanic["Sex"].unique())#0:表示男,1表示女titanic.loc[titanic["Sex"]=="male","Sex"]=0titanic.loc[titanic["Sex"]=="female","Sex"]=14.將Embarked這一列的字符串轉(zhuǎn)成整數(shù)print(titanic["Embarked"].unique())titanic["Embarked"]

=

titanic["Embarked"].fillna("S")titanic.loc[titanic["Embarked"]

==

"S",

"Embarked"]

=0titanic.loc[titanic["Embarked"]

==

"C",

"Embarked"]

=1應(yīng)用舉例#預(yù)測所用到的特征predictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embark#初始化線性回歸函數(shù)lg

=

LinearRegression()#初始化K折交叉驗證函數(shù)#其中KFold是一個類,n_split=3表示,當(dāng)執(zhí)行KFold的split函數(shù)后,數(shù)據(jù)集被分成三份,兩份訓(xùn)練集和一份驗證集。kf

=

KFold(n_splits=3,shuffle=False)predictions

=

[]for

train,test

in

kf.split(titanic):應(yīng)用舉例import

numpy

as

nppredictions=np.concatenate(predictions,axis=0)#匹配輸出結(jié)果,1表示生存,0表示死亡predictions[predictions>.5]=1predictions[predictions<=.5]=0accuracy

=

sum(predictions==

titanic["Survived"])

/

len(predictions)print(accuracy)輸出結(jié)果:0.783389450056應(yīng)用舉例6.使用邏輯回歸方法from

sklearn.linear_model

import

LogisticRegressfromsklearn.model_selection

import

cross_val_score#初始化邏輯回歸函數(shù)lr=LogisticRegression(random_state=1,solver="liblinear")

#應(yīng)用交叉驗證并計算精確分?jǐn)?shù)scores

=

cross_val_score(lr,titanic[predictors],titanic["Survived"]print(scores.mean())輸出結(jié)果:0.7878787878787877應(yīng)用舉例7.使用隨機(jī)森林方法fromsklearn.model_selection

import

KFold,cross_val_scorefrom

sklearn.ensemble

import

RandomForestClassifierpredictors

=

["Pclass",

"Sex",

"Age",

"SibSp",

"Parch",

"Fare",

"Embark#n_estimators:數(shù)的個數(shù)#min_samples_split:如果某節(jié)點(diǎn)的樣本數(shù)少于min_samples_split,則不會續(xù)再嘗試選擇最優(yōu)特征來進(jìn)行劃分#如果樣本量不大,不需要管這個值。如果樣本量數(shù)量級非常大,則推薦增大這個值#min_samples_leaf:這個值限制了葉子節(jié)點(diǎn)最少的樣本數(shù),如果某葉子節(jié)點(diǎn)應(yīng)用舉例rfc

=

RandomForestClassifier(random_state=1,n_estimators=10,min_samples_split=2,min_samples_leaf=1)#初始化K折交叉驗證函數(shù)kf

=

KFold(n_splits=3,shuffle=False)scores

=

cross_val_score(rfc,titanic[predictors],titanic["Survived"

print(scores.mean())輸出結(jié)果:0.7856341189674523應(yīng)用舉例8.調(diào)整參數(shù)之后的隨機(jī)森林rfc

=

RandomForestClassifier(random_state=1,n_estimators=100,min_samples_split=4,min_samples_leaf=2)#初始化K折交叉驗證函數(shù)kf

=

KFold(n_splits=3,shuffle=False)應(yīng)用舉例9.構(gòu)造新的特征#生成一個家庭人數(shù)列titanic["FamilySize"]=titanic["SibSp"]+titanic["Parch"]#生成一個姓名長度seriestitanic["NameLength"]

=

titanic["Name"].apply(lambda

x:len(x))import

redef

get_title(name):#使用正則表達(dá)式搜索標(biāo)題。標(biāo)題總是由大寫字母和小寫字母組成,以應(yīng)用舉例#得到所有的名字的簡稱(title)titles

=

titanic["Name"].apply(get_title)

print(pd.value_counts(titles))#把每個title映射成整數(shù),一些title是比較稀少的,所以被壓縮成與其他標(biāo)題相同的編碼。title_mapping

=

{"Mr":

1,

"Miss":

2,

"Mrs":

3,

"Master":

4,

"Dr":

5,

"Rev"Major":

7,

"Col":

7,

"Mlle":

8,

"Mme":

8,

"Don":

9,

"Lady":

10,

"Countes"Jonkheer":

10,

"Sir":

9,

"Capt":

7,

"Ms":

2}應(yīng)用舉例10.特征重要性分析

import

numpy

as

np%matplotlibinlinefrom

sklearn.feature_selection

import

SelectKBest,f_classif#f_classif為方差分析,用來計算特征的f統(tǒng)計量的。import

matplotlib.pyplot

as

pltpredictors

=

["Pclass",

"Sex",

"Age",

"SibSp",

"Parch",

"Fare",

"Embark"FamilySize",

"Title",

"NameLength"]應(yīng)用舉例#畫出分?jǐn)?shù),觀察特征的分?jǐn)?shù)plt.bar(range(len(predictors)),scores)plt.xticks(range(len(predictors)),predictors,rotation="vertical")plt.show()#特征分?jǐn)?shù)如圖所示應(yīng)用舉例根據(jù)上一幅圖找出前四個最好的特征:predictors

=

["Pclass",

"Sex",

"Fare",

"Title"]rfc

=

RandomForestClassifier(random_state=1,n_estimators=50,min_samples_split=8,min_samples_leaf=4)scores

=

cross_val_score(rfc,titanic[predictors],titanic["Survived"應(yīng)用舉例11.每個算法都會有自己的優(yōu)缺點(diǎn),那么我們可不可以把兩個模型集成起來呢?將boosting算法與邏輯回歸算法分別進(jìn)行訓(xùn)練,然后給予不同的權(quán)值使得結(jié)果更加精確from

sklearn.ensemble

import

GradientBoostingClassifierimport

numpy

as

npalgorithms

=

[[GradientBoostingClassifier(random_state=1,n_estimators=25,max_de應(yīng)用舉例for

train,test

in

kf.split(titanic):

train_target

=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論