生活随笔
收集整理的這篇文章主要介紹了
集成学习之Adaboost(提升方法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Adaboost
提升方法就是從弱學習器出發,反復學習,得到一系列弱分類器(基本分類器),然后組合這些弱分類器,構成一個強分類器。
基本思路
待解決問題
1、每一輪如何改變訓練數據的權值或概率分布
2、如何將弱分類器組合成強分類器
解決方法
1、高低賦權:提高在前一輪分類中分類錯誤的樣本的權值,降低分類正確的樣本的權值(分類問題被一系列弱分類器“分而治之”)
2、加權多數表決:加大分類誤差率小的弱分類器的權值,使其在表決中起較大的作用。(因為Adaboost最終目標就是要提高分類效率,分類誤差率低作用就好,因此要提高其在整個系統中的權值)
*弱分類器采用串聯的形式,后一輪的演變與前一輪的訓練結果緊密相關。
Adaboost算法
以二分類訓練數據集為例 ,每個樣本由實例和標記組成,T={(x~i~, y~i~)} x屬于Rn,y屬于{1, -1}
步驟
(2)(a)中I函數表示指數函數,當括號內為True時,輸出為1否則輸出為0,所以整個et可以理解為所有被分類器誤分類的樣本占所有樣本的比例,即該分類器的出錯率。值得強調的一點是,由于第一輪所有樣本的權重相同,所以et就是出錯率,但是隨著新一輪的測試的進行,就要開始調節權重,即前文所提到的高低賦權,著重調高被誤分類的樣本的權值,調低被正確分類的樣本的權值。
此外et=∑P(Ht(xi)≠yi)(被G誤分類樣本的權值之和)
(b)中的at表示各基本分類器在最終分類器的線性組合中的重要性,因為et是分類錯誤率,一旦分類錯誤率大于1/2,那么它對應基本分類器的分類性能就比較弱,分類效果還不如瞎猜的好,那么當錯誤率小于等于1/2的時候,at>0,而且log函數是一個隨著et減小而增大的函數,那么它在最終分類器中的作用就比較強,即分類誤差率越小的基本分類器在最終分類器中的作用越大。
?對新一輪權值的更新,誤分類樣本的權值得到擴大,正確分類的樣本權值減小,因為分子位置 會隨著正誤分類指數的位置為正或負,若指數位置為正的時候相比于負對最終結果影響會大。
at之和并不為1.其中sign為符號函數,最終結果取決于所有分類器的分類結果,少數服從多數。
import pdb
import numpy
as np
import operator
import math
def dataset():data
=[0,1,2,3,4,5,6,7,8,9]labels
=[1,1,1,-1,-1,-1,1,1,1,-1]return data
,labels
def mytree(data
,label
,D1
): point
=(np
.array
(data
[:-1])+np
.array
(data
[1:]))/2 dic
={}sign
={}for i
in point
: predict1
=np
.array
(data
<i
) predict1
=(predict1
+0)+(predict1
-1) result1
=sum(abs(predict1
-label
)/2*D1
) predict2
= np
.array
(data
> i
) predict2
= (predict2
+ 0) + (predict2
- 1) result2
= sum(abs(predict2
- label
) / 2 * D1
) if result1
<=result2
: dic
[i
]=result1sign
[i
]='<'else:dic
[i
]=result2sign
[i
]='>'bestpoint
= sorted(dic
.items
(),key
=operator
.itemgetter
(1)) return bestpoint
[0],sign
[bestpoint
[0][0]]
def Zm1(label
,Gm
,a
,D1
): sum=0for i
in range(len(label
)): sum+=D1
[i
]*math
.e
**(-a
*label
[i
]*Gm
[i
]) newD1
=[] for i
in range(len(label
)):w
=D1
[i
]/sum*math
.e
**(-a
*label
[i
]*Gm
[i
])newD1
.append
(w
)return newD1
def adaboot1():data
,label
=dataset
() D1
=[1/len(data
)]*len(data
) bestpoint
=[] besta
=[] signall
=[] result
=[] for i
in range(20):ht
,sign
=mytree
(data
,label
,D1
)print(ht
)signall
.append
(sign
) bestpoint
.append
(ht
[0]) if sign
==str('>'):Gm
= np
.array
(data
> ht
[0]) Gm
= (Gm
+0) + (Gm
-1)else:Gm
= np
.array
(data
< ht
[0])Gm
= (Gm
+ 0) + (Gm
- 1) a
=0.5*(math
.log
((1-ht
[1])/ht
[1])) besta
.append
(a
) result
.append
(Gm
) D1
=Zm1
(label
,Gm
,a
,D1
) sum1
=[0]*len(data
) print(len(result
),len(besta
)) for i
in range(len(result
)): sum1
+=result
[i
]*besta
[i
]print(sum1
)sum1
= np
.array
(sum1
>=0) sum1
= (sum1
+ 0) + (sum1
- 1) if sum(sum1
==label
)==len(data
): print("一種生成{}棵基函數".format(len(result
)))for i
in range(len(result
)): dic
= {} print ("第{}棵決策樹是".format(i
+1)) if signall
[i
]==str('>'): dic
['num'+'>' + str(bestpoint
[i
])]=1 dic
['num'+'<' + str(bestpoint
[i
])] = -1if signall
[i
] == str('<'):dic
['num'+'<' + str(bestpoint
[i
])] = 1dic
['num'+'>' + str(bestpoint
[i
])] = -1print(dic
)print ("權值是{}".format(besta
[i
]))print()break
adaboot1
()在這里插入代碼片
代碼借鑒https://blog.csdn.net/qq_37960402/article/details/88539253
總結
以上是生活随笔為你收集整理的集成学习之Adaboost(提升方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。