簡單說說我對集成學習算法的一點理解

概要

集成學習(Ensemble Learning)是一種機器學習技術框架,它通過構建并結合多個學習器(也稱為個體學習器或基學習器)來完成學習任務。

  • 集成學習旨在通過組合多個基學習器的預測結果來提高整體模型的性能。
  • 每個基學習器都可以是一個簡單的機器學習模型,如決策樹、邏輯回歸等。
  • 基學習器可以是同質的(即所有基學習器都使用相同的算法),也可以是異質的(即基學習器使用不同的算法)。

工作原理

????????生成基學習器:首先,使用某種算法從訓練數據中產生多個基學習器。這些基學習器通常會在訓練數據的不同子集或不同特征子集上進行訓練,以實現多樣性。

????????結合策略:然后,使用一種結合策略將基學習器的預測結果結合起來,以產生最終的預測結果。常見的結合策略包括平均法(如簡單平均、加權平均)、投票法(如硬投票、軟投票)和學習法(如Stacking)。

代表性方法

????????Bagging:一種基于數據隨機重抽樣的集成學習方法。它通過從原始數據集中有放回地抽取樣本來訓練多個基學習器,并對所有基學習器的預測結果進行平均或投票來產生最終的預測結果。

????????Boosting:一族可將弱學習器提升為強學習器的算法。它主要是通過對樣本集的操作獲得樣本子集,然后用弱分類算法在樣本子集上訓練生成一系列的基分類器,并通過加權投票等方式將基分類器的預測結果結合起來。

????????隨機森林:Bagging的一個擴展變體,它以決策樹為基學習器構建Bagging集成,并在決策樹的訓練過程中引入了隨機屬性選擇。

優勢和目的

????????集成學習的主要優勢在于,通過結合多個基學習器的預測結果,可以減小模型的方差、偏差或改進預測性能。

????????集成學習的目的通常是為了提高模型的泛化能力,降低模型選擇不當的可能性,以及提高模型的穩定性和魯棒性。

總結

集成學習是一種通過構建并結合多個學習器來提高模型性能的技術框架。

它通過生成多個基學習器并使用一種結合策略將它們的預測結果結合起來,以實現更好的預測效果。

集成學習在機器學習和數據科學領域中被廣泛應用,是提升模型性能的重要工具之一。

詳細介紹

在機器學習算法(分類算法)中,將算法分為2類:

弱分類器:邏輯回歸(Lr)分類算法、決策樹(DT)分類算法

強分類器

相當于弱分類器算法而言進行稱呼,往往是多個弱分類器算法組成的,變成強分類器

即:三個臭皮匠,頂個諸葛亮

集成學習算法常見的有兩類:

Boosting算法

????????直譯為提升算法

選擇某個弱分類器算法,逐步優化算法模型,逐步提升Boosting,最終獲取最佳算法模型

?

Bagging算法

????????直譯為袋子算法

?

所面臨的問題?:

? ? ? ? 欠擬合以及過擬合

?集成學習概念

如下圖所示:使用不同算法(LR、DT等)構建不同模型,最終合并模型(取其優秀),進行預測分類。

?集成學習算法

Bagging

????????袋子,有很多模型(每個模型不一樣),預測時:讓每個模型進行預測

????????????????如果是分類:使用投票vote機制,決定預測結果(類別最多)

????????????????如果是回歸:使用平均avg機制,決定預測結果(對每個模型預測值求其平均值)

????????最典型算法:隨機森林

????????????????森林中有很多決策樹模型DTM

Boosting

????????提升,有很多模型,但是模型之間依賴關系(后續的模型“修正”前面模型不足的地方),最終合并所有模型優秀的地方,構建出一個模型進行預測。

Ensemble集成學習算法/融合學習算法

?

Bagging算法詳細介紹

RandomForest-隨機森林

隨機森林是一個包含多個決策樹的分類器,并且其輸出的類別是由個別樹輸出的類別的眾數而定。

Random Forest = Bagging + CART decision Tree

先來分析一下什么是隨機森林算法:

????????隨機森林算法由三個詞分別組成:隨機、森林、算法,其中隨機和森林是關鍵,我們單獨拿出來進行解釋

????????森林Forest:其中會有多棵樹,每一棵樹都是決策樹。

????????我們還記得決策樹有什么特點,因為一棵樹的數據集固定,特征選擇也固定,會導致:無論決策樹執行多少次,結果都是不變的——出身就決定答案。

????????隨機Random:而機器學習需要的不是一成不變的東西,所以隨機Random就幫我們解決了這個問題

????????????????它會使數據集不一樣——從源數據集有放回的去抽樣數據

????????????????他會使特征選擇不一樣——假設數據集有20哥特征,每次抽取獲取15個特征

?由于決策樹分類模型屬于【概率分類模型】,所以要求標簽label值從0開始計算。

Bagging官方樣例

import org.apache.spark.ml.classification.{RandomForestClassificationModel, RandomForestClassifier}
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.feature.{StringIndexer, StringIndexerModel, VectorIndexer, VectorIndexerModel}
import org.apache.spark.sql.DataFrame
import org.apache.spark.storage.StorageLevel/*** Spark ML官方案例,基于隨機森林分類算法* 	    http://spark.apache.org/docs/2.2.0/ml-classification-regression.html#random-forest-classifier*/
object ExampleRfClassification {def main(args: Array[String]): Unit = {// 構建SparkSession實例對象,通過建造者模式創建import org.apache.spark.sql.SparkSessionval spark: SparkSession = {SparkSession.builder().appName(this.getClass.getSimpleName.stripSuffix("$")).master("local[3]").config("spark.sql.shuffle.partitions", "3").getOrCreate()}// 導入隱式轉換和函數庫import spark.implicits._import org.apache.spark.sql.functions._// TODO: 1. 加載數據、數據過濾與基本轉換val datasDF: DataFrame = spark.read.format("libsvm").load("datas/mllib/sample_libsvm_data.txt")// TODO: 2. 數據準備:特征工程(提取、轉換與選擇)// 將標簽數據轉換為從0開始下標索引val labelIndexer: StringIndexerModel = new StringIndexer().setInputCol("label").setOutputCol("label_index").fit(datasDF)val indexerDF = labelIndexer.transform(datasDF)// 自動識別特征數據中屬于類別特征的字段,進行索引轉換,決策樹中使用類別特征更加好val featureIndexer: VectorIndexerModel = new VectorIndexer().setInputCol("features").setOutputCol("index_features").setMaxCategories(4).fit(indexerDF)val dataframe = featureIndexer.transform(indexerDF)// 劃分數據集:訓練數據集和測試數據集val Array(trainingDF, testingDF) = dataframe.randomSplit(Array(0.8, 0.2))trainingDF.persist(StorageLevel.MEMORY_AND_DISK).count()// TODO: 3. 使用算法和數據構建模型:算法參數val rf: RandomForestClassifier = new RandomForestClassifier().setLabelCol("label_index").setFeaturesCol("index_features")// 超參數.setNumTrees(20) // 設置樹的數目// 抽樣獲取數據量.setSubsamplingRate(1.0)// 獲取特征的個數.setFeatureSubsetStrategy("auto")// 決策樹參數.setImpurity("gini").setMaxDepth(5).setMaxBins(32)val rfModel: RandomForestClassificationModel = rf.fit(trainingDF)//println(rfModel.featureImportances) // 每個特征的重要性// TODO: 4. 模型評估val predictionDF: DataFrame = rfModel.transform(testingDF)predictionDF.select("prediction", "label_index").show(50, truncate = false)val evaluator = new MulticlassClassificationEvaluator().setLabelCol("label_index").setPredictionCol("prediction").setMetricName("accuracy")val accuracy = evaluator.evaluate(predictionDF)println("Test Error = " + (1.0 - accuracy))// 應用結束,關閉資源spark.stop()}}

Boosting算法詳細介紹

????????梯度提升樹(GBT Gradient Boosting Tree)是一種迭代的決策樹算法,該算法由多顆決策樹組成,所有樹的結論累加起來做最終答案。他在被提出之初就被認為是泛化能力(generalization)較強的算法。

GBDT = 梯度提升 + Boosting + 決策樹

?

Boosting官方樣例代碼

import org.apache.spark.ml.classification.{GBTClassificationModel, GBTClassifier}
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.feature.{StringIndexer, StringIndexerModel, VectorIndexer, VectorIndexerModel}
import org.apache.spark.sql.DataFrame
import org.apache.spark.storage.StorageLevel/*** Spark ML官方案例,基于梯度提升樹分類算法* 	    http://spark.apache.org/docs/2.2.0/ml-classification-regression.html#gradient-boosted-tree-classifier*/
object ExampleGbtClassification {def main(args: Array[String]): Unit = {// 構建SparkSession實例對象,通過建造者模式創建import org.apache.spark.sql.SparkSessionval spark: SparkSession = {SparkSession.builder().appName(this.getClass.getSimpleName.stripSuffix("$")).master("local[3]").config("spark.sql.shuffle.partitions", "3").getOrCreate()}// 導入隱式轉換和函數庫import spark.implicits._import org.apache.spark.sql.functions._// TODO: 1. 加載數據、數據過濾與基本轉換val datasDF: DataFrame = spark.read.format("libsvm").load("datas/mllib/sample_libsvm_data.txt")// TODO: 2. 數據準備:特征工程(提取、轉換與選擇)// 將標簽數據轉換為從0開始下標索引val labelIndexer: StringIndexerModel = new StringIndexer().setInputCol("label").setOutputCol("label_index").fit(datasDF)val indexerDF = labelIndexer.transform(datasDF)// 自動識別特征數據中屬于類別特征的字段,進行索引轉換,決策樹中使用類別特征更加好val featureIndexer: VectorIndexerModel = new VectorIndexer().setInputCol("features").setOutputCol("index_features").setMaxCategories(4).fit(indexerDF)val dataframe = featureIndexer.transform(indexerDF)// 劃分數據集:訓練數據集和測試數據集val Array(trainingDF, testingDF) = dataframe.randomSplit(Array(0.8, 0.2))trainingDF.persist(StorageLevel.MEMORY_AND_DISK).count()// TODO: 3. 使用算法和數據構建模型:算法參數val gbt: GBTClassifier = new GBTClassifier().setLabelCol("label_index").setFeaturesCol("index_features")// 設置超參數.setMaxIter(10).setStepSize(0.1) // 學習率,(0, 1]之間,默認值為1.setSubsamplingRate(1.0) // 每次訓練決策樹數據集占比,默認為1.0//.setImpurity("variance")//.setLossType("logistic")// 樹的參數.setImpurity("gini").setMaxDepth(5).setMaxBins(32)val gbtModel: GBTClassificationModel = gbt.fit(trainingDF)// TODO: 4. 模型評估與參數調優val predictionDF: DataFrame = gbtModel.transform(testingDF)predictionDF.select("prediction", "label_index").show(50, truncate = false)val evaluator = new MulticlassClassificationEvaluator().setLabelCol("label_index").setPredictionCol("prediction").setMetricName("accuracy")val accuracy = evaluator.evaluate(predictionDF)println("Test Error = " + (1.0 - accuracy))Thread.sleep(10000000)// 應用結束,關閉資源spark.stop()}}

Bagging與Boosting的區別

?

以決策樹為基礎分類器:

Bagging

????????多棵樹,每棵樹是獨立存在的,沒有任何聯系 -> 多棵樹

????????????????訓練時的數據:“隨機” -> 數據集(重復)、特征部分

????????????????訓練時可以并行訓練模型,多棵樹可以同時構建,效率高

????????預測時

????????????????分類:vote投票;回歸:avg平均

Boosting

????????多棵樹,每棵樹是關聯的 -> 一棵樹

????????????????使用全局的數據(不重復)、全部特征

????????????????訓練時只能串行,一棵一棵的構建,彼此之間相互關聯

????????預測時

????????????????是什么就是什么

(疊甲:大部分資料來源于黑馬程序員,這里只是做一些自己的認識、思路和理解,主要是為了分享經驗,如果大家有不理解的部分可以私信我,也可以移步【黑馬程序員_大數據實戰之用戶畫像企業級項目】https://www.bilibili.com/video/BV1Mp4y1x7y7?p=201&vd_source=07930632bf702f026b5f12259522cb42,以上,大佬勿噴)

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

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

相關文章

常見儀表盤指示燈的含義,這次夠全了!

汽車是當前主要的交通工具之一,給人們的工作、生活提供了便利。大家在學會開車的同時,也得了解一些基本的汽車常識,可以及時的發現車輛的問題,并作出正確的判斷,以此降低車輛的損耗和維修成本。其中最基本的&#xff0…

房產證上加名?手把手教你操作,省錢又省心!

隨著《民法典》的實施,房產的權屬問題愈發受到重視。夫妻雙方及其親屬常希望能在房產證上增添自己的名字,以保障各自的權益。那么,房產證上到底能寫幾個名字呢?以下是對這一問題的詳細解答。 一、房產證命名無固定限制 在購房時&…

準確-K8s系列文章-修改containerd 默認數據目錄

修改 Kubernetes 集群中 containerd 默認數據目錄為 /data/containerd 前言 本文檔適用于 Kubernetes 1.24 及以上版本的集群,介紹如何將 containerd 默認的數據目錄從 /var/lib/containerd 修改為 /data/containerd。 步驟 1. 停止 containerd 服務(慎重!!!需評估風險!…

iOS中的UIScene和UISceneDelegate

目錄 ???????前言 一、AppDelegate和SceneDelegate的關系 1.AppDelegate 2.SceneDelegate 3.info.plist配置 4.生命周期方法對比 1.應用啟動 2.進入前臺 3.進入后臺 5.何時使用AppDelegate和SceneDelegate 1.AppDelegate 2.SceneDelegate 前言 在iOS 13及之…

Linux內核編程入門:深度探索與實戰挑戰

Linux內核編程入門:深度探索與實戰挑戰 在操作系統的心臟地帶,Linux內核以其強大、靈活和開源的特性吸引著眾多程序員。對于那些渴望深入了解系統底層機制并親手塑造操作系統的勇士們,Linux內核編程無疑是一個極具挑戰性和吸引力的領域。本文…

民國漫畫雜志《時代漫畫》第39期.PDF

時代漫畫39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了,截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Qt for Android : 使用libusb做CH340x串口傳輸的底層USB庫

簡介 Qt for Android自帶的串口方案并沒有適用在高的API版本中, 會出現permission denied的訪問問題, 所以就需要使用Android API, 也就是在CPP中使用JNI方式進行調用, 為了開發的方便, 使用libusb庫作為替代的底層usb…

SpringBoot注解--10--@Bean,對象注入的三種方法

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 Bean一、如何使用方法注解注意Bean 的命名規則,當沒有設置 name 屬性時,那么 bean 默認的名稱就是方法名,當設置了 name 屬性之后…

解析Java中1000個常用類:Runnable 類,你學會了嗎?

在 Java 編程中,處理并發和多線程是一個重要的主題。為了簡化多線程編程,Java 提供了多種工具和類,其中最基本的一個工具就是 Runnable 接口。 Runnable 接口為創建和管理線程提供了一種標準的方式。本文將詳細介紹 Runnable 接口的定義、實現原理、應用場景,并通過示例展…

33【Aseprite 作圖】樹——拆解

1 樹葉 畫樹葉真累啊,可以先畫一個輪廓,細節一點點修 2 1 2 ;2 2 2 (橫著橫),這樣一點點畫樹葉 填充顏色,用了噴霧工具 2 樹干部分 輪廓部分,左邊的是3 3 3 ;上下都是…

網頁音頻提取在線工具有哪些 網頁音頻提取在線工具下載

別再到處去借會員賬號啦。教你一招,無視版權和地區限制,直接下載網頁中的音頻文件。沒有復雜的操作步驟,也不用學習任何代碼。只要是網頁中播放的音頻文件,都可以把它下載到本地保存。 一、網頁音頻提取在線工具有哪些 市面上的…

【數據結構】二叉樹:簡約和復雜的交織之美

專欄引入: 哈嘍大家好,我是野生的編程萌新,首先感謝大家的觀看。數據結構的學習者大多有這樣的想法:數據結構很重要,一定要學好,但數據結構比較抽象,有些算法理解起來很困難,學的很累…

Transformer中的位置編碼PE(position encoding)

Transformer中的位置編碼PE(position encoding) 1.提出背景 transformer模型的attention機制并沒有包含位置信息,即一句話中詞語在不同的位置時在transformer中是沒有區別的 2.解決背景 給encoder層和decoder層的輸入添加了一個額外的向量Positional Encoding&a…

平移數據c++

題目描述 將a數組中第一個元素移到數組末尾,其余數據依次往前平移一個位置。 輸入 第一行為數組a的元素個數n; 第二行為n個小于1000的正整數。 輸出 平移后的數組元素,每個數用一個空格隔開。 樣例輸入 10 1 2 3 4 5 6 7 8 9 10 樣例輸出 2 3 …

【專利 超音速】一種光伏檢測系統

申請號CN202410053901.0公開號(公開)CN118032774A申請日2024.01.12申請人(公開)超音速人工智能科技股份有限公司發明人(公開)張俊峰(總); 葉長春(總); 許春夏 摘要 本發明公開一種光伏檢測系統&#xff0…

iotdb時序庫在火電設備鍋爐場景下的實踐【原創文字,IoTDB社區可進行使用與傳播】

一.概述 1.1 說明 本文章主要介紹iotdb數據庫在電站鍋爐工業場景下,對輔助智能分析與預警的使用介紹。 【原創文字,IoTDB社區可進行使用與傳播】 1.2 項目背景 隨著人工智能算法在電力領域的發展,以及燃煤鍋爐設備精細化調整需求的增加&…

Java基礎八股

Java基礎八股 Java語言Java語言有什么特點Java與C區別Java如何實現跨平臺JVMvsJDKvsJRE標識符和關鍵字的區別是什么自增自減運算符移位運算符continue,break,return的區別是什么final,finally,finalize的區別final關鍵字的作用時什么 變量 Java語言 Java語言有什么特點 Java是…

LED燈編程:一步步探索光的魔法

LED燈編程:一步步探索光的魔法 在數字時代,LED燈早已超越了傳統的照明功能,成為編程與創意結合的完美載體。那么,LED燈怎么編程呢?本文將分四個方面、五個方面、六個方面和七個方面,帶您走進LED燈編程的奇…

如何在Python中管理內存

在Python中,內存管理主要是由解釋器自動處理的,這包括對象的分配和回收。Python使用引用計數和垃圾回收機制來管理內存,這大大簡化了開發者的工作,因為他們通常不需要手動管理內存。 然而,盡管Python自動管理內存&…

數據結構——經典鏈表OJ(二)

樂觀學習,樂觀生活,才能不斷前進啊!!! 我的主頁:optimistic_chen 我的專欄:c語言 點擊主頁:optimistic_chen和專欄:c語言, 創作不易,大佬們點贊鼓…