python機器學習Sklearn實戰(zhàn)adaboost算法示例詳解_第1頁
python機器學習Sklearn實戰(zhàn)adaboost算法示例詳解_第2頁
python機器學習Sklearn實戰(zhàn)adaboost算法示例詳解_第3頁
python機器學習Sklearn實戰(zhàn)adaboost算法示例詳解_第4頁
python機器學習Sklearn實戰(zhàn)adaboost算法示例詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第python機器學習Sklearn實戰(zhàn)adaboost算法示例詳解importmatplotlib.pyplotasplt

data=pd.read_excel(/Users/zhucan/Desktop/18級高一體測成績匯總.xls)

cond=data[班級]!=班級

data=data[cond]

data.fillna(0,inplace=True)

data.isnull().any()#沒有空數(shù)據(jù)了

結(jié)果:

班級False

性別False

姓名False

1000米False

50米False

跳遠False

體前屈False

引體False

肺活量False

身高False

體重False

dtype:bool

data.head()

#1000米成績有string有int

defconvert(x):

ifisinstance(x,str):

minute,second=x.split()

int(minute)

minute=int(minute)

second=int(second)

returnminute+second/100.0

else:

returnx

data[1000米]=data[1000米].map(convert)

score=pd.read_excel(/Users/zhucan/Desktop/體側(cè)成績評分表.xls,header=[0,1])

score

defconvert(item):

m,s=item.strip().split()

m,s=int(m),int(s)

returnm+s/100.0

score.iloc[:,-4]=score.iloc[:,-4].map(convert)

defconvert(item):

m,s=item.strip().split()

m,s=int(m),int(s)

returnm+s/100.0

score.iloc[:,-2]=score.iloc[:,-2].map(convert)

score

data.columns=[班級,性別,姓名,男1000,男50米跑,跳遠,體前屈,引體,肺活量,身高,體重]

data[男50米跑]=data[男50米跑].astype(np.float)

forcolin[男1000,男50米跑]:

#獲取成績的標準

s=score[col]

defconvert(x):

foriinrange(len(s)):

ifx=s[成績].iloc[0]:

ifx==0:

return0#沒有參加這個項目

return100

elifxs[成績].iloc[-1]:

return0#跑的太慢

elif(xs[成績].iloc[i-1])and(x=s[成績].iloc[i]):

returns[分數(shù)].iloc[i]

data[col+成績]=data[col].map(convert)

forcolin[跳遠,體前屈,引體,肺活量]:

s=score[男+col]

defconvert(x):

foriinrange(len(s)):

ifxs[成績].iloc[i]:

returns[分數(shù)].iloc[i]

return0

data[col+成績]=data[col].map(convert)

data.columns

結(jié)果:

Index([班級,性別,姓名,男1000,男50米跑,跳遠,體前屈,引體,肺活量,身高,

體重,男1000成績,男50米跑成績,跳遠成績,體前屈成績,引體成績,肺活量成績],

dtype=object)

#根據(jù)索引的順序,去data取值

cols=[班級,性別,姓名,男1000,男1000成績,男50米跑,男50米跑成績,跳遠,跳遠成績,體前屈,體前屈成績,引體,引體成績,肺活量,肺活量成績,身高,體重]

data[cols]

#計算BMI

data[BMI]=data[體重]/data[身高]

defconvert(x):

ifx100:

returnx/100

else:

returnx

data[身高]=data[身高].map(convert)

data[BMI]=data[體重]/(data[身高])**2

defconvert_bmi(x):

ifx=26.4:

return60

elif(x=16.4)or(x23.3andx=26.3):

return80

elifx=16.5andx=23.2:

return100

else:

return0

data[BMI_score]=data[BMI].map(convert_bmi)

#統(tǒng)計分析

data[BMI_score].value_counts().plot(kind=pie,autopct=%0.2f%%)

#統(tǒng)計分析

data[BMI_score].value_counts().plot(kind=bar)

data.groupby([男1000成績])[BMI_score].count().plot(kind=bar)

adaboost

越大,特征越明顯,越被容易分開;越后面的學習器,權(quán)重越大

梯度提升樹沒有修改原來的數(shù)據(jù),使用的是殘差,最終結(jié)果就是最后一棵樹

上面的圖不是GBDT

Boosting與Bagging模型相比,Boosting可以同時降低偏差和方差,Bagging只能降低模型的方差。在實際應用中,Boosting算法也還是存在明顯的高方差問題,也就是過擬合。

importnumpyasnp

y=np.array([0,1]*5)

y_=np.array([0,0,0,0,0,0,0,1,0,1])

w=0.1*(y!=y_).sum()

round(w,1)

結(jié)果:

0.3

0.5*np.log((1-0.3)/0.3)

round((0.5*np.log((1-0.3)/0.3)),2)

結(jié)果:

0.42

adaboost原理案例舉例

fromsklearn.ensembleimportAdaBoostClassifier

fromsklearnimporttree

importmatplotlib.pyplotasplt

X=np.arange(10).reshape(-1,1)

y=np.array([1,1,1,-1,-1,-1,1,1,1,-1])

ada=AdaBoostClassifier(n_estimators=3)

ada.fit(X,y)

plt.figure(figsize=(9,6))

_=tree.plot_tree(ada[0])

y_=ada[0].predict(X),4

y_

結(jié)果:

array([1,1,1,-1,-1,-1,-1,-1,-1,-1])

e1=np.round(0.1*(y!=y_).sum(),4)

e1

結(jié)果:

0.3

#計算第一棵樹權(quán)重

#隨機森林中每棵樹的權(quán)重是一樣的

#adaboost提升樹中每棵樹的權(quán)重不同

a1=np.round(1/2*np.log((1-e1)/e1),4)

a1

結(jié)果:

0.4236

#樣本預測準確:更新的權(quán)重

w2=0.1*np.e**(-a1*y*y_)

w2=w2/w2.sum()

np.round(w2,4)

結(jié)果:

array([0.0714,0.0714,0.0714,0.0714,0.0714,0.0714,0.1667,0.1667,

0.1667,0.0714])

#樣本預測準確:更新的權(quán)重

w2=0.1*np.e**(-a1*y*y_)

w2=w2/w2.sum()

np.round(w2,4)

結(jié)果:

array([0.0714,0.0714,0.0714,0.0714,0.0714,0.0714,0.1667,0.1667,

0.1667,0.0714])

從上述第一輪的整個迭代過程可以看出:被誤分類樣本的權(quán)值之和影響誤差率,誤差率影響基本分類器在最終分類器中所占的權(quán)重

分類函數(shù)f1(x)=a1*G1(x)=0.4236G1(x)

plt.figure(figsize=(9,6))

_=tree.plot_tree(ada[1])

e2=0.0714*3

e2

結(jié)果:

0.2142

a2=np.round(1/2*np.log((1-e2)/e2),4)

a2

結(jié)果:

0.6499

y_=ada[1].predict(X)

#樣本預測準確:更新的權(quán)重

w3=w2*np.e**(-a2*y*y_)

w3=w3/w3.sum()

np.round(w3,4)

結(jié)果:

array([0.0454,0.0454,0.0454,0.1667,0.1667,0.1667,0.106,0.106,

0.106,0.0454])

plt.figure(figsize=(9,6))

_=tree.plot_tree(ada[2])

樹劃分按照gini系數(shù);結(jié)果和按照誤差率是一致的~

y_=ada[2].predict(X)

e3=(w3*(y_!=y)).sum()

a3=1/2*np.log((1-e3)/e3)

#樣本預測準確:更新的權(quán)重

w4=w3*np.e**(-a3*y*y_)

w4=w4/w4.sum()

np.round(w4,4)

結(jié)果:

array([0.125,0.125,0.125,0.1019,0.1019,0.1019,0.0648,0.0648,

0.0648,0.125])

display(a1,a2,a3)

結(jié)果:

0.4236

0.6498960745553556

0.7521752700597043

弱分類器合并成強分類器

綜上,將上面計算得到的a1、a2、a3各值代入G(x)中

G(x)=sign[f3(x)]=sign[a1*G1(x)+a2*G2(x)+a3*G3(x)]

得到最終的分類器為:

G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]

ada.predict(X)

結(jié)果:

array([1,1,

溫馨提示

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

評論

0/150

提交評論