智能算法之提升方法

提升方法

提升方法的核心思想是通過將多個效果很一般的分類器(弱分類器)組合起來綜合考慮,以實現一個效果較好的分類器,這就像“三個臭皮匠賽過諸葛亮”。弱學習者學習出來的效果可能只比隨機分類器效果好一點,於是有人提出用一個弱分類器集合生成一個強分類器。

因為是將弱分類器提升為強分類器,所以叫提升方法。

智能算法之提升方法

這裡寫圖片描述

AdaBoost

提升方法有很多算法,最具代表性的是 AdaBoost 。AdaBoost 是 adaptive boosting 的縮寫,核心思想是提高那麼被前一輪弱分類分類錯誤的樣本的權值,同時降低分類正確的樣本的權值,讓錯誤的樣本能在下一輪得到更多的關注。另外,AdaBoost 最終的分類器是由多個弱分類器的線性組合,線性係數即為每個弱分類器的權重,錯誤率小的弱分離器的權重大,使之能在最終結果作用更大,反之錯誤率大的權重應該小一些。

AdaBoost基本步驟

  1. 樣本集

  2. 給樣本數據集中的每一個樣本初始化一個權重,

  3. 設一共有M個分類器,

  4. 使用訓練樣本集數據以及其初始權重訓練得到第一個分類器 G1。

  5. 計算第一個分類器的錯誤率,

  1. ,最終的分類器為

  2. 根據上一步的錯誤率計算第一個分類器分配的權重,

  3. 對第一個分類器分錯的樣本增加權重,分對的樣本減少權重,具體的權重更新公式為,

    ,其中

智能算法之提升方法

智能算法之提升方法

  1. 有了新的樣本權重後再繼續訓練第二個分類器G2,然後再計算第二個分類器的錯誤率e2以及第二個分類器分配的權重

智能算法之提升方法

  1. ,並且繼續更新權重得到D3

  2. 重複上述操作直到分類器錯誤率為0,或者達到指定的迭代次數。

  1. 將所有弱分類器加權求和,即線性組合,

智能算法之提升方法

關於弱分類器

adaboost 的弱分類器沒有具體的標準,只要能實現分類的分類器都可以用作弱分類器,常見的可以有如下幾種:

  • 邏輯迴歸

  • 簡單的神經網絡

  • SVM

adaboost 的弱分類器必須要是同一種分類器,不能使用不同的分類器。

關於權值

adaboost 過程中涉及兩類權值,一類是樣本權值,另外一類是弱分類器的權值。樣本權值用於標明各個樣本的權重,被標明的樣本在訓練中有不同的重要性,它樣本的所有權重加起來和為1。弱分類器權值用於標明各個分類器的權值,它其實就是最終分類器線性組合的係數,表示每個弱分類器對結果的貢獻程度,弱分類器權值加起來和不一定為1。

github

https://github.com/sea-boat/MachineLearning_Lab

demo

import numpy as npdef weak_model(data, Dt): m = data.shape[0] pred = [] pos = None mark = None min_err = np.inf for j in range(m): pred_temp = [] sub_mark = None lsum = np.sum(data[:j, 1]) rsum = np.sum(data[j:, 1]) if lsum < rsum: sub_mark = -1 pred_temp.extend([-1.] * (j)) pred_temp.extend([1.] * (m - j)) else: sub_mark = 1 pred_temp.extend([1.] * (j)) pred_temp.extend([-1.] * (m - j)) err = np.sum(1 * (data[:, 1] != pred_temp) * Dt) if err < min_err: min_err = err pos = (data[:, 0][j - 1] + data[:, 0][j]) / 2 mark = sub_mark pred = pred_temp[:] model = [pos, mark, min_err] return model, preddef adaboost(data): models = [] N = data.shape[0] D = np.zeros(N) + 1.0 / N M = 3 y = data[:, -1] for t in range(M): Dt = D[:] model, y_ = weak_model(data, Dt) errt = model[-1] alpha = 0.5 * np.log((1 - errt) / errt) Zt = np.sum([Dt[i] * np.exp(-alpha * y[i] * y_[i]) for i in range(N)]) D = np.array([Dt[i] * np.exp(-alpha * y[i] * y_[i]) for i in range(N)]) / Zt models.append([model, alpha]) return modelsdef predict(models, X): pred = [] for x in X: result = 0 for base in models: alpha = base[1] if x[0] > base[0][0]: result -= base[0][1] * alpha else: result += base[0][1] * alpha pred.append(np.sign(result)) return predif __name__ == "__main__": data = np.array([[0, 1], [1, 1], [2, 1], [3, -1], [4, -1], [5, -1], [6, 1], [7, 1], [8, 1], [9, -1]], dtype=np.float32) models = adaboost(data) X = data Y = data[:, -1] Y_ = predict(models, X) acc = np.sum(1 * (Y == Y_)) / float(len(X)) print(acc)


分享到:


相關文章: