机器学习:AdaBoost算法及其实现
文章目錄
- 楔子
- 算法描述:
- adaboost里的樣本權(quán)重和話語權(quán)
- 算法描述
- AdaBoost的實(shí)現(xiàn):
- 數(shù)學(xué)基礎(chǔ)(了解)
楔子
前面提到boosting算法為一類算法,這一類算法框架分為3步:1、訓(xùn)練一個弱分類;2、根據(jù)分類結(jié)果調(diào)整樣本權(quán)重;3、最后決策時,根據(jù)弱模型的表現(xiàn)來決定其話語權(quán)。
那么這里面就有2個關(guān)鍵點(diǎn):
1、如何調(diào)整樣本權(quán)重;
2、如何根據(jù)弱模型的表現(xiàn)來決定其話語權(quán)。
算法描述:
adaboost里的樣本權(quán)重和話語權(quán)
事實(shí)上,能夠?qū)⑦@兩個問題的解決方案有機(jī)地糅合在一起、正是 AdaBoost 的巧妙之處之一。
如何調(diào)整樣本權(quán)重,一個弱分類器得到一個錯誤分類率e > 0.5, 我們調(diào)整樣本權(quán)重是分類錯誤率等于0.5,用這個樣本權(quán)重用于下一個分類器,這個這兩個分類器就不會強(qiáng)相關(guān),這個就是調(diào)整樣本權(quán)重的主要思想。
分類錯誤樣本權(quán)重乘以d倍,分類正確樣本權(quán)重處理d,得到e*d = (1-e)/d =====> d^2 = (1-e)/e
我們定義該分類器的話語權(quán)為:alpha = ln(d) = 0.5*ln (1-e)/e,話語權(quán)是隨著錯誤率的增大而減小的。
事實(shí)上,能夠?qū)⑦@兩個問題的解決方案有機(jī)地糅合在一起、正是 AdaBoost 的巧妙之處之一。
實(shí)際的樣本權(quán)重是歸一化處理過的:
算法描述
AdaBoost的實(shí)現(xiàn):
實(shí)現(xiàn)比較簡單,首先你的分類器需要支持樣本權(quán)重,然后按照序列調(diào)用你的分類器就行了,每次把計(jì)算好的樣本權(quán)重傳進(jìn)去。
class AdaBoost:# 弱分類器字典,如果想要測試新的弱分類器的話、只需將其加入該字典即可_weak_clf = {"SKMNB": SKMultinomialNB,"SKGNB": SKGaussianNB,"SKTree": SKTree,"MNB": MultinomialNB,"GNB": GaussianNB,"ID3": ID3Tree,"C45": C45Tree,"Cart": CartTree}"""AdaBoost框架的樸素實(shí)現(xiàn)使用的弱分類器需要有如下兩個方法:1) 'fit' 方法,它需要支持輸入樣本權(quán)重2) 'predict' 方法, 它用于返回預(yù)測的類別向量"""def __init__(self):# 初始化結(jié)構(gòu)# self._clf:記錄弱分類器名稱的變量# self._clfs:記錄弱分類器的列表# self._clfs_weights:記錄弱分類器“話語權(quán)”的列表self._clf, self._clfs, self._clfs_weights = "", [], []def fit(self, x, y, sample_weight=None, clf=None, epoch=10, eps=1e-12, **kwargs):# 默認(rèn)使用10個CART決策樹樁作為弱分類器if clf is None or AdaBoost._weak_clf[clf] is None:clf = "Cart"kwargs = {"max_depth": 1}# 當(dāng)前使用的分類器self._clf = clf# 樣本權(quán)重,注意是歸一化后的樣本權(quán)重,默認(rèn)樣本權(quán)重為[1/N,1/N,...]if sample_weight is None:sample_weight = np.ones(len(y)) / len(y)else:sample_weight = np.array(sample_weight)# AdaBoost算法的主循環(huán),epoch為迭代次數(shù)for _ in range(epoch):# 根據(jù)樣本權(quán)重訓(xùn)練弱分類器tmp_clf = AdaBoost._weak_clf[clf](**kwargs)tmp_clf.fit(x, y, sample_weight)# 調(diào)用弱分類器的predict方法進(jìn)行預(yù)測y_pred = tmp_clf.predict(x)# 計(jì)算加權(quán)錯誤率;考慮到數(shù)值穩(wěn)定性,在邊值情況加了一個小的常數(shù)# 點(diǎn)乘是行*列em = min(max((y_pred != y).dot(self._sample_weight[:, None])[0], eps), 1 - eps)# 計(jì)算該弱分類器的“話語權(quán)”,化簡了一下am = 0.5 * log(1 / em - 1)# 更新樣本權(quán)重并利用deepcopy將該弱分類器記錄在列表中sample_weight *= np.exp(-am * y * y_pred)sample_weight /= np.sum(sample_weight)# 記錄分類器和話語權(quán)self._clfs.append(deepcopy(tmp_clf))self._clfs_weights.append(am)def predict(self, x):x = np.atleast_2d(x)# 保存結(jié)果rs = np.zeros(len(x))# 根據(jù)各個弱分類器的“話語權(quán)”進(jìn)行決策for clf, am in zip(self._clfs, self._clfs_weights):rs += am * clf.predict(x)# 將預(yù)測值大于0的判為類別1,小于0的判為類別-1return np.sign(rs)數(shù)學(xué)基礎(chǔ)(了解)
AdaBoost 算法是前向分步算法的特例,AdaBoost 模型等價于損失函數(shù)為指數(shù)函數(shù)的加法模型。
所謂的前向分步算法,就是從前向后、一步一步地學(xué)習(xí)加法模型中的每一個基函數(shù)及其權(quán)重而非將f(x)作為一個整體來訓(xùn)練,這也正是 AdaBoost 的思想。
總結(jié)
以上是生活随笔為你收集整理的机器学习:AdaBoost算法及其实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习:随机森林算法及其实现
- 下一篇: 机器学习:从感知机模型体会随机梯度下降