日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

复现经典:《统计学习方法》第 8 章 提升方法

發布時間:2025/3/8 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复现经典:《统计学习方法》第 8 章 提升方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是李航老師的《統計學習方法》[1]一書的代碼復現。

作者:黃海廣[2]

備注:代碼都可以在github[3]中下載。

我將陸續將代碼發布在公眾號“機器學習初學者”,敬請關注。

代碼目錄

  • 第 1 章 統計學習方法概論

  • 第 2 章 感知機

  • 第 3 章 k 近鄰法

  • 第 4 章 樸素貝葉斯

  • 第 5 章 決策樹

  • 第 6 章 邏輯斯諦回歸

  • 第 7 章 支持向量機

  • 第 8 章 提升方法

  • 第 9 章 EM 算法及其推廣

  • 第 10 章 隱馬爾可夫模型

  • 第 11 章 條件隨機場

  • 第 12 章 監督學習方法總結

代碼參考:wzyonggege[4],WenDesi[5],火燙火燙的[6]

第 8 章 提升方法

1.提升方法是將弱學習算法提升為強學習算法的統計學習方法。在分類學習中,提升方法通過反復修改訓練數據的權值分布,構建一系列基本分類器(弱分類器),并將這些基本分類器線性組合,構成一個強分類器。代表性的提升方法是 AdaBoost 算法。

AdaBoost 模型是弱分類器的線性組合:

2.AdaBoost 算法的特點是通過迭代每次學習一個基本分類器。每次迭代中,提高那些被前一輪分類器錯誤分類數據的權值,而降低那些被正確分類的數據的權值。最后,AdaBoost 將基本分類器的線性組合作為強分類器,其中給分類誤差率小的基本分類器以大的權值,給分類誤差率大的基本分類器以小的權值。

3.AdaBoost 的訓練誤差分析表明,AdaBoost 的每次迭代可以減少它在訓練數據集上的分類誤差率,這說明了它作為提升方法的有效性。

4.AdaBoost 算法的一個解釋是該算法實際是前向分步算法的一個實現。在這個方法里,模型是加法模型,損失函數是指數損失,算法是前向分步算法。 每一步中極小化損失函數

得到參數。

5.提升樹是以分類樹或回歸樹為基本分類器的提升方法。提升樹被認為是統計學習中最有效的方法之一。

Boost

“裝袋”(bagging)和“提升”(boost)是構建組合模型的兩種最主要的方法,所謂的組合模型是由多個基本模型構成的模型,組合模型的預測效果往往比任意一個基本模型的效果都要好。

  • 裝袋:每個基本模型由從總體樣本中隨機抽樣得到的不同數據集進行訓練得到,通過重抽樣得到不同訓練數據集的過程稱為裝袋。

  • 提升:每個基本模型訓練時的數據集采用不同權重,針對上一個基本模型分類錯誤的樣本增加權重,使得新的模型重點關注誤分類樣本

AdaBoost

AdaBoost 是 AdaptiveBoost 的縮寫,表明該算法是具有適應性的提升算法。

算法的步驟如下:

1)給每個訓練樣本()分配權重,初始權重均為 1/N。

2)針對帶有權值的樣本進行訓練,得到模型(初始模型為 G1)。

3)計算模型的誤分率

4)計算模型的系數

5)根據誤分率 e 和當前權重向量更新權重向量。

6)計算組合模型的誤分率。

7)當組合模型的誤分率或迭代次數低于一定閾值,停止迭代;否則,回到步驟 2)

import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt %matplotlib inline # data def create_data():iris = load_iris()df = pd.DataFrame(iris.data, columns=iris.feature_names)df['label'] = iris.targetdf.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']data = np.array(df.iloc[:100, [0, 1, -1]])for i in range(len(data)):if data[i,-1] == 0:data[i,-1] = -1# print(data)return data[:,:2], data[:,-1] X, y = create_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) plt.scatter(X[:50,0],X[:50,1], label='0') plt.scatter(X[50:,0],X[50:,1], label='1') plt.legend()

AdaBoost in Python

class AdaBoost:def __init__(self, n_estimators=50, learning_rate=1.0):self.clf_num = n_estimatorsself.learning_rate = learning_ratedef init_args(self, datasets, labels):self.X = datasetsself.Y = labelsself.M, self.N = datasets.shape# 弱分類器數目和集合self.clf_sets = []# 初始化weightsself.weights = [1.0 / self.M] * self.M# G(x)系數 alphaself.alpha = []def _G(self, features, labels, weights):m = len(features)error = 100000.0 # 無窮大best_v = 0.0# 單維featuresfeatures_min = min(features)features_max = max(features)n_step = (features_max - features_min +self.learning_rate) // self.learning_rate# print('n_step:{}'.format(n_step))direct, compare_array = None, Nonefor i in range(1, int(n_step)):v = features_min + self.learning_rate * iif v not in features:# 誤分類計算compare_array_positive = np.array([1 if features[k] > v else -1 for k in range(m)])weight_error_positive = sum([weights[k] for k in range(m)if compare_array_positive[k] != labels[k]])compare_array_nagetive = np.array([-1 if features[k] > v else 1 for k in range(m)])weight_error_nagetive = sum([weights[k] for k in range(m)if compare_array_nagetive[k] != labels[k]])if weight_error_positive < weight_error_nagetive:weight_error = weight_error_positive_compare_array = compare_array_positivedirect = 'positive'else:weight_error = weight_error_nagetive_compare_array = compare_array_nagetivedirect = 'nagetive'# print('v:{} error:{}'.format(v, weight_error))if weight_error < error:error = weight_errorcompare_array = _compare_arraybest_v = vreturn best_v, direct, error, compare_array# 計算alphadef _alpha(self, error):return 0.5 * np.log((1 - error) / error)# 規范化因子def _Z(self, weights, a, clf):return sum([weights[i] * np.exp(-1 * a * self.Y[i] * clf[i])for i in range(self.M)])# 權值更新def _w(self, a, clf, Z):for i in range(self.M):self.weights[i] = self.weights[i] * np.exp(-1 * a * self.Y[i] * clf[i]) / Z# G(x)的線性組合def _f(self, alpha, clf_sets):passdef G(self, x, v, direct):if direct == 'positive':return 1 if x > v else -1else:return -1 if x > v else 1def fit(self, X, y):self.init_args(X, y)for epoch in range(self.clf_num):best_clf_error, best_v, clf_result = 100000, None, None# 根據特征維度, 選擇誤差最小的for j in range(self.N):features = self.X[:, j]# 分類閾值,分類誤差,分類結果v, direct, error, compare_array = self._G(features, self.Y, self.weights)if error < best_clf_error:best_clf_error = errorbest_v = vfinal_direct = directclf_result = compare_arrayaxis = j# print('epoch:{}/{} feature:{} error:{} v:{}'.format(epoch, self.clf_num, j, error, best_v))if best_clf_error == 0:break# 計算G(x)系數aa = self._alpha(best_clf_error)self.alpha.append(a)# 記錄分類器self.clf_sets.append((axis, best_v, final_direct))# 規范化因子Z = self._Z(self.weights, a, clf_result)# 權值更新self._w(a, clf_result, Z)# print('classifier:{}/{} error:{:.3f} v:{} direct:{} a:{:.5f}'.format(epoch+1, self.clf_num, error, best_v, final_direct, a)) # print('weight:{}'.format(self.weights)) # print('\n')def predict(self, feature):result = 0.0for i in range(len(self.clf_sets)):axis, clf_v, direct = self.clf_sets[i]f_input = feature[axis]result += self.alpha[i] * self.G(f_input, clf_v, direct)# signreturn 1 if result > 0 else -1def score(self, X_test, y_test):right_count = 0for i in range(len(X_test)):feature = X_test[i]if self.predict(feature) == y_test[i]:right_count += 1return right_count / len(X_test)

例 8.1

X = np.arange(10).reshape(10, 1) y = np.array([1, 1, 1, -1, -1, -1, 1, 1, 1, -1]) clf = AdaBoost(n_estimators=3, learning_rate=0.5) clf.fit(X, y) X, y = create_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)clf = AdaBoost(n_estimators=10, learning_rate=0.2) clf.fit(X_train, y_train) clf.score(X_test, y_test)0.6363636363636364 # 100次結果 result = [] for i in range(1, 101):X, y = create_data()X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)clf = AdaBoost(n_estimators=100, learning_rate=0.2)clf.fit(X_train, y_train)r = clf.score(X_test, y_test)# print('{}/100 score:{}'.format(i, r))result.append(r)print('average score:{:.3f}%'.format(sum(result)))average score:65.000%

scikit-learn 實例


sklearn.ensemble.AdaBoostClassifier

  • algorithm:這個參數只有 AdaBoostClassifier 有。主要原因是 scikit-learn 實現了兩種 Adaboost 分類算法,SAMME 和 SAMME.R。兩者的主要區別是弱學習器權重的度量,SAMME 使用了和我們的原理篇里二元分類 Adaboost 算法的擴展,即用對樣本集分類效果作為弱學習器權重,而 SAMME.R 使用了對樣本集分類的預測概率大小來作為弱學習器權重。由于 SAMME.R 使用了概率度量的連續值,迭代一般比 SAMME 快,因此 AdaBoostClassifier 的默認算法 algorithm 的值也是 SAMME.R。我們一般使用默認的 SAMME.R 就夠了,但是要注意的是使用了 SAMME.R, 則弱分類學習器參數 base_estimator 必須限制使用支持概率預測的分類器。SAMME 算法則沒有這個限制。

  • n_estimators: AdaBoostClassifier 和 AdaBoostRegressor 都有,就是我們的弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說 n_estimators 太小,容易欠擬合,n_estimators 太大,又容易過擬合,一般選擇一個適中的數值。默認是 50。在實際調參的過程中,我們常常將 n_estimators 和下面介紹的參數 learning_rate 一起考慮。

  • learning_rate: AdaBoostClassifier 和 AdaBoostRegressor 都有,即每個弱學習器的權重縮減系數 ν

  • base_estimator:AdaBoostClassifier 和 AdaBoostRegressor 都有,即我們的弱分類學習器或者弱回歸學習器。理論上可以選擇任何一個分類或者回歸學習器,不過需要支持樣本權重。我們常用的一般是 CART 決策樹或者神經網絡 MLP。

from sklearn.ensemble import AdaBoostClassifier clf = AdaBoostClassifier(n_estimators=100, learning_rate=0.5) clf.fit(X_train, y_train) AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None,learning_rate=0.5, n_estimators=100, random_state=None) clf.score(X_test, y_test) 0.9393939393939394參考資料[1] 《統計學習方法》:?https://baike.baidu.com/item/統計學習方法/10430179 [2] 黃海廣:?https://github.com/fengdu78 [3] github:?https://github.com/fengdu78/lihang-code [4] wzyonggege:?https://github.com/wzyonggege/statistical-learning-method [5] WenDesi:?https://github.com/WenDesi/lihang_book_algorithm [6] 火燙火燙的:?https://blog.csdn.net/tudaodiaozhale 關于本站“機器學習初學者”公眾號由是黃海廣博士創建,黃博個人知乎粉絲23000+,github排名全球前100名(33000+)。本公眾號致力于人工智能方向的科普性文章,為初學者提供學習路線和基礎資料。原創作品有:吳恩達機器學習個人筆記、吳恩達深度學習筆記等。往期精彩回顧 那些年做的學術公益-你不是一個人在戰斗 適合初學者入門人工智能的路線及資料下載 吳恩達機器學習課程筆記及資源(github標星12000+,提供百度云鏡像)吳恩達深度學習筆記及視頻等資源(github標星8500+,提供百度云鏡像) 《統計學習方法》的python代碼實現(github標星7200+) 機器學習的數學精華(在線閱讀版)備注:加入本站微信群或者qq群,請回復“加群”

總結

以上是生活随笔為你收集整理的复现经典:《统计学习方法》第 8 章 提升方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。