AdaBoost提升分類器性能

目錄

AdaBoost算法原理

AdaBoost工作詳情

初始權重分配

第一輪

第二輪

后續輪次

最終模型

AdaBoost的API解釋

AdaBoost 對房價進行預測

AdaBoost 與決策樹模型的比較

結論


AdaBoost算法原理

在數據挖掘中,分類算法可以說是核心算法,其中 AdaBoost算法與隨機森林算法一樣都屬于分類算法中的集成算法.

集成的含義就是集思廣益,博取眾長,當我們做決定的時候,我們先聽取多個專家的意見,再做決定。集成算法通常有兩種方式,分別是投票選舉(bagging)和再學習(boosting)。 投票選舉的場景類似把專家召集到一個會議桌前,當做一個決定的時候,讓 K 個專家(K 個模 型)分別進行分類,然后選擇出現次數最多的那個類作為最終的分類結果。再學習相當于把 K 個專家(K 個分類器)進行加權融合,形成一個新的超級專家(強分類器),讓這個超級專家 做判斷.

Boosting 算法的原理

AdaBoost 的關鍵在于它會給訓練數據中的每個樣本分配一個權重,并在每一輪迭代中調整這些權重。錯誤分類的樣本在下一輪迭代中會得到更高的權重,從而使弱分類器集中注意力于難以分類的樣本。以下是一個具體的示例來解釋 AdaBoost 算法的原理:

AdaBoost工作詳情

假設我們有一個簡單的二分類問題,訓練數據集包含5個樣本:{x1, x2, x3, x4, x5},它們的真實標簽分別為 {1, -1, 1, 1, -1}

初始權重分配

首先,每個樣本都被賦予相同的權重,即 1/5

第一輪

  1. 訓練第一個弱分類器:例如,一個簡單的決策樹。
  2. 計算錯誤率:弱分類器在加權訓練數據上的錯誤率。例如,假設它錯誤地分類了樣本 x2x5
  3. 更新樣本權重:增加被錯誤分類的樣本的權重,減少正確分類的樣本的權重。例如,x2x5 的權重增加,而其余樣本的權重減少。
  4. 計算分類器權重:基于錯誤率計算分類器權重,錯誤率越低的分類器在最終模型中的權重越高。
分類器權重的計算公式

第二輪

  1. 訓練第二個弱分類器:使用更新后的樣本權重。
  2. 重復計算錯誤率、更新樣本權重和分類器權重的過程。

后續輪次

重復以上步驟,直到達到預定的迭代次數,或者達到某個性能閾值。

最終模型

最終的 AdaBoost 模型是所有弱分類器的加權組合,其中每個弱分類器的貢獻由其權重決定。這樣,模型在預測新數據時,會考慮所有弱分類器的預測并加權得到最終結果。

AdaBoost的API解釋

AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)

這個函數,其中有幾 個比較主要的參數,我分別來講解下:

1. base_estimator:代表的是弱分類器。在 AdaBoost 的分類器和回歸器中都有這個參數, 在 AdaBoost 中默認使用的是決策樹,一般我們不需要修改這個參數,當然你也可以指定 具體的分類器。

2. ? n_estimators:算法的最大迭代次數,也是分類器的個數,每一次迭代都會引入一個新的 弱分類器來增加原有的分類器的組合能力。默認是 50。

3. ? learning_rate:代表學習率,取值在 0-1 之間,默認是 1.0。如果學習率較小,就需要比 較多的迭代次數才能收斂,也就是說學習率和迭代次數是有相關性的。當你調整 learning_rate 的時候,往往也需要調整 n_estimators 這個參數。

4. ? algorithm:代表我們要采用哪種 boosting 算法,一共有兩種選擇:SAMME 和 SAMME.R。默認是 SAMME.R。這兩者之間的區別在于對弱分類權重的計算方式不同。

5. ? random_state:代表隨機數種子的設置,默認是 None。隨機種子是用來控制隨機模式 的,當隨機種子取了一個值,也就確定了一種隨機規則,其他人取這個值可以得到同樣的結果。如果不設置隨機種子,每次得到的隨機數也就不同

AdaBoost 對房價進行預測

了解了 AdaBoost 工具包之后,我們看下 sklearn 中自帶的波士頓房價數據集。這個數據集一共包括了 506 條房屋信息數據,每一條數據都包括了 13 個指標,以及一個房屋 價位。13 個指標的含義,可以參考下面的表格

這些指標分析得還是挺細的,但實際上,我們不用關心具體的含義,要做的就是如何通過這 13 個指標推導出最終的房價結果。
?
首先加載數據,將數據分割成訓練集和測試集,然后創建 AdaBoost 回歸模型,傳入訓練集 數據進行擬合,再傳入測試集數據進行預測,就可以得到預測結果。最后將預測的結果與實際 結果進行對比,得到兩者之間的誤差。具體代碼如下:

from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from sklearn.datasets import load_boston
from sklearn.ensemble import AdaBoostRegressor
# 加載數據
data=load_boston()
# 分割數據
train_x, test_x, train_y, test_y = train_test_split(data.data, data.target, test_size=0.25, random_state=33)
# 使用AdaBoost回歸模型
regressor=AdaBoostRegressor()regressor.fit(train_x,train_y) 12 
pred_y = regressor.predict(test_x)mse = mean_squared_error(test_y, pred_y)
print("房價預測結果  ", pred_y) 15 
print("均方誤差  = ",round(mse,2))
運行結果

同樣,我們可以使用不同的回歸分析模型分析這個數據集,比如使用決策樹回歸和 KNN 回歸。
編寫代碼如下:

# 使用決策樹回歸模型
dec_regressor=DecisionTreeRegressor() dec_regressor.fit(train_x,train_y) 
pred_y = dec_regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y)
print("決策樹均方誤差 = ",round(mse,2))# 使用KNN回歸模型
knn_regressor=KNeighborsRegressor()
knn_regressor.fit(train_x,train_y) 
pred_y = knn_regressor.predict(test_x) 
mse = mean_squared_error(test_y, pred_y)
print("KNN均方誤差  = ",round(mse,2))
運行結果

你能看到相比之下,AdaBoost 的均方誤差更小,也就是結果更優。雖然 AdaBoost 使用了弱 分類器,但是通過 50 個甚至更多的弱分類器組合起來而形成的強分類器,在很多情況下結果 都優于其他算法。因此 AdaBoost 也是常用的分類和回歸算法之一?

AdaBoost 與決策樹模型的比較

在 sklearn 中 AdaBoost 默認采用的是決策樹模型,我們可以隨機生成一些數據,然后對比 下 AdaBoost 中的弱分類器(也就是決策樹弱分類器)、決策樹分類器和 AdaBoost 模型在 分類準確率上的表現。

如果想要隨機生成數據,我們可以使用 sklearn 中的 make_hastie_10_2 函數生成二分類數 據。假設我們生成 12000 個數據,取前 2000 個作為測試集,其余作為訓練集。有了數據和訓練模型后,我們就可以編寫代碼。我設置了 AdaBoost 的迭代次數為 200,代 表 AdaBoost 由 200 個弱分類器組成。針對訓練集,我們用三種模型分別進行訓練,然后用測試集進行預測,并將三個分類器的錯誤率進行可視化對比,可以看到這三者之間的區別:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.metrics import zero_one_loss
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import  AdaBoostClassifier
# 設置AdaBoost迭代次數
n_estimators=200
# 使用
X,y=datasets.make_hastie_10_2(n_samples=12000,random_state=1)
# 從12000個數據中取前2000行作為測試集,其余作為訓練集
train_x, train_y = X[2000:],y[2000:]
test_x, test_y = X[:2000],y[:2000]
# 弱分類器
dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1)
dt_stump.fit(train_x, train_y)
dt_stump_err = 1.0-dt_stump.score(test_x, test_y)
# 決策樹分類器
dt = DecisionTreeClassifier()
dt.fit(train_x,  train_y)
dt_err = 1.0-dt.score(test_x, test_y)
# AdaBoost分類器
ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=n_estimators)
ada.fit(train_x,  train_y)
# 三個分類器的錯誤率可視化
fig = plt.figure()
# 設置plt正確顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
ax = fig.add_subplot(111)
ax.plot([1,n_estimators],[dt_stump_err]*2, 'k-', label=u'決策樹弱分類器 錯誤率')
ax.plot([1,n_estimators],[dt_err]*2,'k--', label=u'決策樹模型 錯誤率')
ada_err = np.zeros((n_estimators,))
# 遍歷每次迭代的結果 i為迭代次數, pred_y為預測結果
for i,pred_y in enumerate(ada.staged_predict(test_x)):# 統計錯誤率ada_err[i]=zero_one_loss(pred_y, test_y)
# 繪制每次迭代的AdaBoost錯誤率
ax.plot(np.arange(n_estimators)+1, ada_err, label='AdaBoost Test 錯誤率', color='orange')
ax.set_xlabel('迭代次數')
ax.set_ylabel('錯誤率')
leg=ax.legend(loc='upper right',fancybox=True)
plt.show()
運行結果

從圖中你能看出來,弱分類器的錯誤率最高,只比隨機分類結果略好,準確率稍微大于 50%。決策樹模型的錯誤率明顯要低很多。而 AdaBoost 模型在迭代次數超過 25 次之后,錯 誤率有了明顯下降,經過 125 次迭代之后錯誤率的變化形勢趨于平緩。

因此我們能看出,雖然單獨的一個決策樹弱分類器效果不好,但是多個決策樹弱分類器組合起來形成的AdaBoost 分類器,分類效果要好于決策樹模型。

結論

AdaBoost 算法有效地集中于那些難以正確分類的樣本,逐漸調整分類器以解決這些難題。這使得 AdaBoost 成為一種強大的集成方法,尤其適用于處理復雜的分類問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165823.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gitee推薦-PHP面試準備的資料

該內容為giee項目。PHP-Interview: 這個項目是自己準備PHP面試整理的資料。包括PHP、MySQL、Linux、計算機網絡等資料。方便自己以后查閱,會不定期更新,歡迎提交pr,如果錯誤,請指出,謝謝 在線預覽地址:Intr…

leetcode面試經典150題——31 無重復字符的最長子串(方法二極簡代碼!!!)

題目: 無重復字符的最長子串 描述: 給定一個字符串 s ,請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: s “abcabcbb” 輸出: 3 解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。 leetcode鏈接 方法…

【LeetCode刷題筆記】DFSBFS(三)

圖的基礎知識 鄰接矩陣是一個二維表,其中橫縱坐標交叉的格子值為 1 的表示這兩個頂點是連通的,否則是不連通的。

Python-csv庫進行數據保存和讀寫

在 Python 中使用 CSV 文件非常簡單,Python 提供了內置的 csv 模塊來處理 CSV 文件。你可以使用 csv 模塊來讀取、寫入和操作 CSV 文件中的數據。 基礎使用 讀取 CSV 文件 python import csv# 打開 CSV 文件進行讀取 with open(file.csv, moder) as file:reader …

NVM得介紹和詳細使用教程

NVM???????(Node Version Manager)是一個用于管理多個Node.js版本的工具。它允許您在同一臺計算機上輕松地切換和管理不同的Node.js版本。以下是NVM的介紹和詳細使用教程: 安裝NVM: 首先,您需要在計算機上安裝N…

C#串口通信從入門到精通(27)——高速通信下解決數據處理慢的問題(20ms以內)

前言 我們在開發串口通信程序時,有時候會遇到比如單片機或者傳感器發送的數據速度特別快,比如10ms、20ms發送一次,并且每次發送的數據量還比較大,如果按照常規的寫法,我們會發現接收的數據還沒處理完,新的數據又發送過來了,這就會導致處理數據滯后,軟件始終處理的不是…

python樹的雙親存儲結構

這種存儲結構是一種順序存儲結構,采用元素形如“[結點值,雙親結點索引]”的列表表示。通常每個結點有唯一的索引(或者偽地址),根結點的索引為0,它沒有雙親結點,其雙親結點的索引為-1。例如,所示的樹對應的雙…

123. 股票買賣的最佳時機III(2次交易)

題目 題解 class Solution:def maxProfit(self, prices: List[int]) -> int:N len(prices)# 狀態定義 dp[i][j][k]代表在第i天,被允許完成j次交易時,持有或者不持有的最大利潤。k0代表不持有,k1代表持有dp [[[0 for k in range(2)] for…

醫學生秋招攻略,面試時一定要注意這些方面!

醫學生別拖了,今年秋招已經過去一波熱度了,趕早不趕晚!在籌備第二輪秋招以及明年的春招的醫學生一定要注意以下事項。 1.清晰目標 搜集秋招訊息 一定要早點多做準備,想清楚未來的目標,是繼續深造還是就業做醫生或者是…

FileReader與URL.createObjectURL實現圖片、視頻上傳預覽

之前做圖片、視頻上傳預覽常用的方案是先把文件上傳到服務器,等服務器返回文件的地址后,再把該地址字符串賦給img或video的src屬性,這才實現所謂的文件預覽。實際上這只是文件“上傳后再預覽”,這既浪費了用戶的時間,也…

java開發合同相關

【點我-這里送書】 本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(…

集合的分類

Python內建的集合類,有有序和無序之分,還有可修改和不可修改之分。 1 有序和無序 有序是說某數據集合中的每個元素都有一個位置信息,通常用index表示,可以借助這種集合類型名和位置信息訪問集合里的某元素值,在Pytho…

【開源】基于Vue.js的用戶畫像活動推薦系統

項目編號: S 061 ,文末獲取源碼。 \color{red}{項目編號:S061,文末獲取源碼。} 項目編號:S061,文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 數據中心模塊2.2 興趣標簽模塊2.3 活…

[Android]使用Git將項目提交到GitHub

如果你的Mac還沒有安裝Git,你可以通過Homebrew來安裝它: brew install git 方式一:終端管理 1.創建本地Git倉庫 在項目的根目錄下,打開終端(Terminal)并執行以下命令來初始化一個新的Git倉庫&#xff1…

vue3-組件傳參及計算屬性

?🌈個人主頁:前端青山 🔥系列專欄:Vue篇 🔖人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來vue篇專欄內容:vue3-組件傳參及計算屬性 目錄 vue3中的組件傳參 1、父傳子 2、子傳父 toRef 與 toRefs vue3中…

數據結構 查找基本概念

敬請期待。。。 1. 適用于折半查找的表的存儲方式及元素排列要求為(順序方式存儲,元素有序 )。 2. 有一個按元素值排好序的順序表(長度大于2),分別用順序查找和折半查找與給定值相等的元素,比較次數分別是s和b&am…

拼接合并yuv序列轉成mp4

ffmpeg需要用支持libx264的版本,如果需要,可以從這個網站下載編譯支持libx264\x265的ffmpeg https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1-essentials_build.7z #-*- coding:utf-8-*- import osif __name__ "__main__":# 1 輸入…

實例講解:在3dMax中如何使用python腳本?

如果你是Python或Maxscript的新手,你現在可以跟著這篇文章開始做一些代碼了,本文將讓我們從非常基本的東西開始學習。 如何在3dmax中獲取選定的節點并打印出它們的名稱?所有場景對象如何?我們直接看代碼: import MaxP…

Word/PPT/PDF怎么免費轉為JPG圖片?

1、打開金鳴表格文字識別網站。 2、點擊導航條上的“軟件下載” 3、安裝并打開金鳴表格文字識別軟件。 4、點擊頂部導航欄的“文件轉圖片”。 5、選擇需要轉換成圖片的文件(支持Word/PPT/PDF). 6、點“打開”程序將自動分頁轉換為圖片。

【論文閱讀筆記】Smil: Multimodal learning with severely missing modality

Ma M, Ren J, Zhao L, et al. Smil: Multimodal learning with severely missing modality[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2021, 35(3): 2302-2310.[開源] 本文的核心思想是探討和解決多模態學習中的一個重要問題:在訓練和測…