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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

spark.mllib:bagging方法

發布時間:2024/1/23 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spark.mllib:bagging方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在訓練集成分類器時,關鍵的一步在于如何從全訓練樣本集中構建子樣本集提供給子分類器進行訓練。目前主流的兩種子樣本集構造方式是bagging方法和boosting方法。bagging方法的思想是從全樣本集中有放回的進行抽樣來構造多個子樣本集,每個子樣本集中可以包含重復的樣本。對每個子樣本集訓練一個模型,然后取平均得到最后的集成結果。

bagging
bagging方法的主要目的是為了降低模型的variance,由于子樣本集的相似性以及使用的是同種模型,因此各模型有近似相等的bias和variance(事實上,各模型的分布也近似相同,但不獨立)。由于

所以bagging后的bias和單個子模型的接近,一般來說不能顯著降低bias。另一方面,若各子模型獨立,則有

此時可以顯著降低variance。若各子模型完全相同,則

此時不會降低variance。bagging方法得到的各子模型是有一定相關性的,屬于上面兩個極端狀況的中間態,因此可以一定程度降低variance。(摘自知乎)。

如需要進一步的降低模型的variance,則需要降低各個子模型之間的相關性,Random forest通過隨機選取特征集子集來做到這一點。因此,在需要降低模型variance時,一方面可以通過bagging方法來選取子樣本集構造子模型,另外一方面,每個子模型之間的特征相關性需要盡量小。

boosting
boosting方法是各個子模型在迭代中串行地產生的。訓練時著重關注訓練集中那些不容易區分的樣本。AdaBoost是一種典型的boosting方法,其算法思想是:給訓練集中的元組重新分配權重,權重影響抽樣,權重越大,越可能被抽取。迭代訓練若干個分類器,在前一個分類器中被錯誤分類的元組被提高權重;最后由所有分類器一起投票(投票權重取決于分類器的準確率),決定分類。由于boosting方法在子模型的訓練過程中關注那些被上一個子模型損失較大的樣本(在分類問題中是誤分的樣本,在回歸問題中是殘差較大的樣本),在逐輪的迭代過程中,整個模型的輸出會逐漸收斂至目標值,因此,boosting方法會降低模型的bias。

????目前,bagging方法和boosting方法方法在Spark中都有實現,其中bagging方法的抽樣過程是由BaggedPoint類實現的,而boosting方法則主要提現在模型迭代的過程中,目前僅對決策樹實現了boosting方法即GradientBoostedTrees類。

????????在這一篇博客中將主要介紹bagging方法的Spark實現,boosting方法留待后續分析GBDT時介紹。BaggedPoint是Spark實現樣本抽樣來構造子樣本集的類,BaggedPoint進行樣本抽樣,分為有放回抽樣和無放回抽樣兩種。

有放回抽樣,使用柏松分布根據輸入的抽樣比率,抽樣份數進行抽樣。

/**
?* 使用PoissonDistribution模擬抽樣,有放回抽樣
?* @param input
?* @param subsample
?* @param numSubsamples
?* @param seed
?* @tparam Datum
?* @return
?* p(x=k)=theta^^k / k! ?* e^^(-theta)
?* 樣本均值的期望為p,此處為抽樣率subsample。因此抽樣樣本數的期望為 subsample*樣本總數
?*/
private def convertToBaggedRDDSamplingWithReplacement[Datum] (
? ? input: RDD[Datum],
? ? subsample: Double,
? ? numSubsamples: Int,
? ? seed: Long): RDD[BaggedPoint[Datum]] = {
? input.mapPartitionsWithIndex { (partitionIndex, instances) => //partitionIndex:分區ID, instances:分區數據的迭代器
? ? // Use random seed = seed + partitionIndex + 1 to make generation reproducible.
? ? val poisson = new PoissonDistribution(subsample)//設定抽樣比率
? ? poisson.reseedRandomGenerator(seed + partitionIndex + 1)
? ? instances.map { instance => //
? ? ? val subsampleWeights = new Array[Double](numSubsamples)
? ? ? var subsampleIndex = 0
? ? ? while (subsampleIndex < numSubsamples) {//在每個分區抽樣numSubsamples次,BaggedPoint保存的是<數據實例,<2,0,3...>>
? ? ? ? subsampleWeights(subsampleIndex) = poisson.sample()
? ? ? ? subsampleIndex += 1
? ? ? }
? ? ? new BaggedPoint(instance, subsampleWeights)
? ? }
? }
}
無放回抽樣,使用XORShiftRandom隨機數生成算法進行抽樣。

//無放回抽樣,每個子樣本集只包含一次該樣本
private def convertToBaggedRDDSamplingWithoutReplacement[Datum] (
? ? input: RDD[Datum],
? ? subsamplingRate: Double,
? ? numSubsamples: Int,
? ? seed: Long): RDD[BaggedPoint[Datum]] = {
? input.mapPartitionsWithIndex { (partitionIndex, instances) =>
? ? // Use random seed = seed + partitionIndex + 1 to make generation reproducible.
? ? val rng = new XORShiftRandom
? ? rng.setSeed(seed + partitionIndex + 1)
? ? instances.map { instance =>
? ? ? val subsampleWeights = new Array[Double](numSubsamples)
? ? ? var subsampleIndex = 0
? ? ? while (subsampleIndex < numSubsamples) {
? ? ? ? val x = rng.nextDouble()
? ? ? ? subsampleWeights(subsampleIndex) = {
? ? ? ? ? if (x < subsamplingRate) 1.0 else 0.0
? ? ? ? }
? ? ? ? subsampleIndex += 1
? ? ? }
? ? ? new BaggedPoint(instance, subsampleWeights)
? ? }
? }
}
????????

????????抽樣方法返回的是一個BaggedRDD<BaggedPoint>,BaggedPoint(datainstance, subsampleWeights),其中data instance 即為一個樣本實例,subsampleWeights是一個形式為[1, 0, 4]的數組,表示抽樣份數為3份,數組中的數字表示該樣本在對應抽樣樣本集中出現的次數。這樣的好處是只保留了一份原始樣本集,構建了多個不同的"視圖"即抽樣樣本集,一定程度上節省了內存。

????????另外,目前業界對bagging方法的實現主要是Randomforest,其它的諸如邏輯斯蒂回歸、SVM等等算法上并沒有采用這一方法,個人認為,其主要原因決策樹具有良好的特征自選擇性,而不會去使用全部的特征,一定程度上降低了各個子模型的相關性。當然,我們也可以人工的為各個子模型選擇特征子集,這樣就可以適用于其它算法上了。
————————————————
版權聲明:本文為CSDN博主「大愚若智_」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zbc1090549839/article/details/69329584

總結

以上是生活随笔為你收集整理的spark.mllib:bagging方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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