人工智能之随机森林算法项目实战
文章目錄
- (1)隨機森林算法介紹
- 隨機性體現(xiàn)
- (2)隨機森林應(yīng)用場景
- (3) Spark隨機森林訓(xùn)練和預(yù)測過程
- 訓(xùn)練
- 預(yù)測
- 分類
- 回歸
- (4) Spark隨機森林模型參數(shù)詳解
- (5) Spark隨機森林源碼實戰(zhàn)
- 工作原理
- 隨機森林的優(yōu)勢
- 隨機森林的缺點
- (6)Spark隨機森林訓(xùn)練和預(yù)測過程
- (7) 隨機森林和GBDT的聯(lián)系和區(qū)別
- 總結(jié)
隨機森林(Random Forest)是一個集成算法,多棵決策樹就組成了一個森林,下面具體講一下這個算法和應(yīng)用的源碼。
(1)隨機森林算法介紹
隨機森林是以決策樹作為基礎(chǔ)模型的集成算法。隨機森林是機器學(xué)習(xí)模型中用于分類和回歸的最成功的模型之一。通過組合大量的決策樹來降低過擬合的風(fēng)險。與決策樹一樣,隨機森林處理分類特征,擴展到多類分類設(shè)置,不需要特征縮放,并且能夠捕獲非線性和特征交互。
隨機森林分別訓(xùn)練一系列的決策樹,所以訓(xùn)練過程是并行的。因算法中加入隨機過程,所以每個決策樹又有少量區(qū)別。通過合并每個樹的預(yù)測結(jié)果來減少預(yù)測的方差,提高在測試集上的性能表現(xiàn)。
隨機性體現(xiàn)
1.每次迭代時,對原始數(shù)據(jù)進行二次抽樣來獲得不同的訓(xùn)練數(shù)據(jù)
2.對于每個樹節(jié)點,考慮不同的隨機特征子集來進行分裂
除此之外,決策時的訓(xùn)練過程和單獨決策樹訓(xùn)練過程相同。
對新實例進行預(yù)測時,隨機森林需要整合其各個決策樹的預(yù)測結(jié)果。回歸和分類問題的整合的方式略有不同。分類問題采取投票制,每個決策樹投票給一個類別,獲得最多投票的類別為最終結(jié)果。回歸問題每個樹得到的預(yù)測結(jié)果為實數(shù),最終的預(yù)測結(jié)果為各個樹預(yù)測結(jié)果的平均值。
Spark的隨機森林算法支持二分類、多分類以及回歸的隨機森林算法,適用于連續(xù)特征以及類別特征。
(2)隨機森林應(yīng)用場景
分類任務(wù):
1、廣告系統(tǒng)的點擊率預(yù)測
2、推薦系統(tǒng)的二次rerank排序
3、金融行業(yè)可以用隨機森林做貸款風(fēng)險評估
4、保險行業(yè)可以用隨機森林做險種推廣預(yù)測
5、醫(yī)療行業(yè)可以用隨機森林生成輔助診斷處置模型
回歸任務(wù)
1、預(yù)測一個孩子的身高
2、電商網(wǎng)站的商品銷量預(yù)測
隨機森林是由多顆決策樹組成,決策能做的隨機森林也都能做,并且效果更好。
(3) Spark隨機森林訓(xùn)練和預(yù)測過程
隨機森林分別訓(xùn)練一組決策樹,因此訓(xùn)練可以并行完成。該算法將隨機性注入訓(xùn)練過程,以使每個決策樹略有不同。結(jié)合每棵樹的預(yù)測可以減少預(yù)測的方差,提高測試數(shù)據(jù)的性能。
訓(xùn)練
注入訓(xùn)練過程的隨機性包括:
在每次迭代時對原始數(shù)據(jù)集進行二次采樣,以獲得不同的訓(xùn)練集(例如,bootstrapping)
考慮在每個樹節(jié)點處分割的不同隨機特征子集
除了這些隨機化之外,決策樹訓(xùn)練的方式與單個決策樹的方式相同
預(yù)測
要對新實例進行預(yù)測,隨機森林必須整合各個決策樹的預(yù)測。對于分類和回歸,這種整合的方式不同
分類
多數(shù)票原則。每棵樹的預(yù)測都算作一個類的投票。預(yù)計該標簽是獲得最多選票的類別
回歸
平均。每棵樹預(yù)測一個真實的值。預(yù)測標簽是各個樹預(yù)測的平均值
(4) Spark隨機森林模型參數(shù)詳解
隨機森林的參數(shù)比較多,我們實際工作中經(jīng)常會調(diào)整參數(shù)值,讓模型達到一個最優(yōu)的狀態(tài),除了調(diào)參的方法,還有就是通過手工改進每個特征的計算公式,增加數(shù)據(jù)特征,不斷的優(yōu)化模型。參數(shù)調(diào)優(yōu)是實際工作中不可或缺的一個必要環(huán)節(jié),讓我們看一下都有哪些參數(shù):
類型1:整數(shù)型
含義:設(shè)置檢查點間隔(>=1),或不設(shè)置檢查點(-1)
類型2:字符串型
含義:每次分裂候選特征數(shù)量
類型3:字符串型
含義:特征列名
類型4:字符串型
含義:計算信息增益的準則(不區(qū)分大小寫)
類型5:字符串型
含義:計算信息增益的準則(不區(qū)分大小寫)
類型6:字符串型
含義:標簽列名
類型7:整數(shù)型
含義:連續(xù)特征離散化的最大數(shù)量,以及選擇每個節(jié)點分裂特征的方式
類型8:整數(shù)型
含義:樹的最大深度(>=0)
決策樹最大深度max_depth, 默認可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,數(shù)據(jù)少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決于數(shù)據(jù)的分布。常用的可以取值10-100之間
參數(shù)效果:值越大,決策樹越復(fù)雜,越容易過擬合
類型9:雙精度型
含義:分裂節(jié)點時所需最小信息增益
類型10:整數(shù)型
含義:分裂后自節(jié)點最少包含的實例數(shù)量
類型11:整數(shù)型
含義:訓(xùn)練的樹的數(shù)量
類型12:字符串型
含義:預(yù)測結(jié)果列名
類型13:字符串型
含義:類別條件概率預(yù)測結(jié)果列名
類型14:字符串型
含義:原始預(yù)測
類型15:長整型
含義:隨機種子
類型16:雙精度型
含義:學(xué)習(xí)一棵決策樹使用的訓(xùn)練數(shù)據(jù)比例,范圍[0,1]
類型17:雙精度數(shù)組型
含義:多分類預(yù)測的閥值,以調(diào)整預(yù)測結(jié)果在各個類別的概率
上面的參數(shù)有的對準確率影響很大,有的比較小。其中maxDepth最大深度這個參數(shù)對精準度影響很大,但設(shè)置過高容易過擬合。應(yīng)該根據(jù)實際情況設(shè)置一個合理的值,但一般不超過20。
(5) Spark隨機森林源碼實戰(zhàn)
訓(xùn)練數(shù)據(jù)格式和上面講的決策樹是一樣的,隨機森林可以用來做二值分類,也可以多分類,還可以用它來做回歸,用來做回歸的應(yīng)用場景,比如做銷量預(yù)測,也能起到非常好的效果,雖然做銷量預(yù)測用時間序列算法比較多,但隨機森林的效果不遜色于時間序列,這得在參數(shù)調(diào)優(yōu)和特征工程調(diào)優(yōu)上下功夫。下面的代碼演示了如何訓(xùn)練數(shù)據(jù)模型,根據(jù)模型預(yù)測特征屬于哪個分類,并且演示了模型如何做持久化和加載的完整過程。
上面講的隨機森林算法是有多棵決策樹組成的,是一個集成算法,屬于Bagging詞袋模型,我們看下它是如何工作的。
工作原理
基于Bagging的隨機森林(Random Forest)是決策樹集合。在隨機森林中,我們收集了許多決策樹(被稱為“森林”)。為了根據(jù)屬性對新對象進行分類,每個樹都給出分類,然后對這些樹的結(jié)果進行“投票”,最終選擇投票得數(shù)最多的哪一類別。
每棵樹按以下方法構(gòu)建:
如果取 N 例訓(xùn)練樣本作為來訓(xùn)練每棵樹,則隨機抽取1例樣本,再有放回地進行下一次抽樣。每次抽樣得到的 N 個樣本作為一棵樹的訓(xùn)練數(shù)據(jù)。
如果存在 M 個輸入變量(特征值),則指定一個數(shù)字 m(遠小于 M),使得在每個節(jié)點處,隨機地從 M 中選擇 m 個特征,并使用這些m 個特征來對節(jié)點進行最佳分割。在森林生長過程中,m 的值保持不變。
每棵樹都盡可能自由生長。沒有修剪。
隨機森林的優(yōu)勢
該算法可以解決兩類問題,即分類和回歸,并在兩個方面進行了不錯的估計。
最令我興奮的隨機森林的好處之一是處理具有更高維度的大數(shù)據(jù)集的能力。它可以處理數(shù)千個輸入變量并識別最重要的變量,因此它被視為降維方法之一。此外,模型輸出變量的重要性, 這可以是一個非常方便的功能(在一些隨機數(shù)據(jù)集上)。
它有一種估算缺失數(shù)據(jù)的有效方法,并在大部分數(shù)據(jù)丟失時保持準確性。
它具有平衡類不平衡的數(shù)據(jù)集中的錯誤的方法。
上述功能可以擴展到未標記的數(shù)據(jù),從而導(dǎo)致無監(jiān)督的聚類,數(shù)據(jù)視圖和異常值檢測。
隨機森林涉及輸入數(shù)據(jù)的采樣,替換稱為自舉采樣。這里有三分之一的數(shù)據(jù)不用于培訓(xùn),可用于測試。這些被稱為袋外樣品。對這些袋外樣品的估計誤差稱為 袋外誤差。通過Out of bag進行誤差估計的研究,證明了袋外估計與使用與訓(xùn)練集相同大小的測試集一樣準確。因此,使用out-of-bag誤差估計消除了對預(yù)留測試集的需要。
隨機森林的缺點
它確實在分類方面做得很好,但不如回歸問題好,因為它沒有給出精確的連續(xù)性預(yù)測。在回歸的情況下,它不會超出訓(xùn)練數(shù)據(jù)的范圍進行預(yù)測,并且它們可能過度擬合特別嘈雜的數(shù)據(jù)集。
隨機森林可以感覺像統(tǒng)計建模者的黑盒子方法 - 你幾乎無法控制模型的作用。你最多可以嘗試不同的參數(shù)和隨機種子!
在實際使用中還發(fā)現(xiàn)Spark隨機森林有一個問題, Spark默認的隨機森林的二值分類預(yù)測只返回0和1,不能返回概率值。比如預(yù)測廣告被點擊的概率,如果都是1的話哪個排在前面,哪個排在后面呢?我們需要更嚴謹?shù)呐判?#xff0c;必須是一個連續(xù)的小數(shù)值。因此,需要對原始的Spark隨機森林算法做二次開發(fā),讓它能返回一個支持概率的數(shù)值。
改源碼一般來說會比較復(fù)雜,因為再改之前,得能看懂它的源碼。否則你不知道從哪兒下手。看懂后,找到最關(guān)鍵的需要修改的函數(shù)后,盡可能較小改動來實現(xiàn)你的業(yè)務(wù)功能,以免改動較多產(chǎn)生別的bug。下面我們講一下如果做二次開發(fā),使隨機森林能滿足我們的需求。
(6)Spark隨機森林訓(xùn)練和預(yù)測過程
Spark隨機森林改成支持概率值只需要改動一個類treeEnsembleModels.scala即可。
修改原來的兩個函數(shù)如下:
/**
-
Predict values for a single data point using the model trained.
-
@param features array representing a single data point
-
@return predicted category from the trained model
*/
def predict(features: Vector): Double = {
(algo, combiningStrategy) match {case (Regression, Sum) =>predictBySumming(features)case (Regression, Average) =>predictBySumming(features) / sumWeightscase (Classification, Sum) => // binary classificationval prediction = predictBySumming(features)// TODO: predicted labels are +1 or -1 for GBT. Need a better way to store this info.if (prediction > 0.0) 1.0 else 0.0case (Classification, Vote) =>predictByVoting(features)case _ =>throw new IllegalArgumentException("TreeEnsembleModel given unsupported (algo, combiningStrategy) combination: " +s"($algo, $combiningStrategy).")}}
/**
- Classifies a single data point based> */
private def predictByVoting(features: Vector): Double = {
val votes = mutable.Map.empty[Int, Double]trees.view.zip(treeWeights).foreach { case (tree, weight) =>val prediction = tree.predict(features).toIntvotes(prediction) = votes.getOrElse(prediction, 0.0) + weight}votes.maxBy(_._2)._1}
修改后的兩個函數(shù):
def predictChongDianLeMe(features: Vector): Double = {
(algo, combiningStrategy) match {case (Regression, Sum) =>predictBySumming(features)case (Regression, Average) =>predictBySumming(features) / sumWeightscase (Classification, Sum) => // binary classificationval prediction = predictBySumming(features)// TODO: predicted labels are +1 or -1 for GBT. Need a better way to store this info.if (prediction > 0.0) 1.0 else 0.0case (Classification, Vote) =>//我們用的是基于投票的分類算法,關(guān)鍵改這里。用我們自己實現(xiàn)的投票算法。predictByVotingChongDianLeMe(features)case _ =>throw new IllegalArgumentException("TreeEnsembleModel given unsupported (algo, combiningStrategy) combination: " +s"($algo, $combiningStrategy).")}}
private def predictByVotingChongDianLeMe(features: Vector): Double = {
val votes = mutable.Map.empty[Int, Double]trees.view.zip(treeWeights).foreach { case (tree, weight) =>val prediction = tree.predict(features).toIntvotes(prediction) = votes.getOrElse(prediction, 0.0) + weight}//通過filter篩選找到投票結(jié)果后的投贊成票的樹的記錄
val zVotes = votes.filter(p => p._1==1)var zTrees = 0.0if (zVotes.size > 0) {zTrees = zVotes.get(1).get}//返回投贊成票的樹的數(shù)量zTrees,我們訓(xùn)練設(shè)置樹的個數(shù)是總數(shù)total,zTrees*1.0/total=概率,就是廣告被點擊的一個概率小數(shù)值。zTrees}
這樣我們就修改完代碼,預(yù)測函數(shù)返回的是投贊成票的樹的數(shù)量zTrees,如果我們在調(diào)用端的時候改成我們的概率值,我們訓(xùn)練設(shè)置樹的個數(shù)是總數(shù)total,zTrees*1.0/total=概率,就是廣告被點擊的一個概率小數(shù)值。當(dāng)然你也可以不改成小數(shù),就按這個zTrees的贊成票數(shù)量來排序也是可以的。修改完之后需要對項目編譯打包。Spark的工程非常大,要是把源碼環(huán)境都調(diào)好了,不是那么容易。實際上會遇到很多的問題,才能把環(huán)境搞好。另外一個就是修改完代碼,打包的話如果之前沒搞過,也得摸索下。把編譯打好的jar包替換掉線上集群的對應(yīng)的jar包即可。
(7) 隨機森林和GBDT的聯(lián)系和區(qū)別
上面講的隨機森林是基于Bagging的詞袋模型,同樣在Spak里面有多棵樹組成集成算法還有GradientBoostedTrees算法,GradientBoostedTrees可以簡稱為GBDT,它也是集成算法,屬于Boosting集成算法,但它和Bagging有什么區(qū)別呢?
Bagging的方式算是比較簡單的,訓(xùn)練多個模型,利用每個模型進行投票,每個模型的權(quán)重都一樣,對于分類問題,取總票數(shù)最多作為分類,對于回歸,取平均值。利用多個弱分類器,集成一個性能高的分類器。典型代表是隨機森林。隨機森林在訓(xùn)練每個模型的時,增加隨機的因素,對特征和樣本進行隨機抽樣,然后把各顆樹訓(xùn)練的結(jié)果集成融合起來。隨機森林可以進行并行訓(xùn)練多顆樹。
Boosting的方式也是訓(xùn)練多個決策樹模型,是一種迭代的算法模型,在訓(xùn)練過程中更加關(guān)注錯分的樣本,對于越是容易錯分的樣本,后續(xù)的模型訓(xùn)練越要花更多精力去關(guān)注,提高上一次分錯的數(shù)據(jù)權(quán)重,越在意那些分錯的數(shù)據(jù)。在集成融合時,每次訓(xùn)練的模型權(quán)重也會不一樣,最終通過加權(quán)的方式融合成最終的模型。Adaboost、GBDT采用的都是boosting的思想。
總結(jié)
此文章有對應(yīng)的配套視頻,其它更多精彩文章請大家下載充電了么app,可獲取千萬免費好課和文章,配套新書教材請看陳敬雷新書:《分布式機器學(xué)習(xí)實戰(zhàn)》(人工智能科學(xué)與技術(shù)叢書)
【新書介紹】
《分布式機器學(xué)習(xí)實戰(zhàn)》(人工智能科學(xué)與技術(shù)叢書)【陳敬雷編著】【清華大學(xué)出版社】
新書特色:深入淺出,逐步講解分布式機器學(xué)習(xí)的框架及應(yīng)用配套個性化推薦算法系統(tǒng)、人臉識別、對話機器人等實戰(zhàn)項目
【新書介紹視頻】
分布式機器學(xué)習(xí)實戰(zhàn)(人工智能科學(xué)與技術(shù)叢書)新書【陳敬雷】
視頻特色:重點對新書進行介紹,最新前沿技術(shù)熱點剖析,技術(shù)職業(yè)規(guī)劃建議!聽完此課你對人工智能領(lǐng)域?qū)⒂幸粋€嶄新的技術(shù)視野!職業(yè)發(fā)展也將有更加清晰的認識!
【精品課程】
《分布式機器學(xué)習(xí)實戰(zhàn)》大數(shù)據(jù)人工智能AI專家級精品課程
【免費體驗視頻】:
人工智能百萬年薪成長路線/從Python到最新熱點技術(shù)
從Python編程零基礎(chǔ)小白入門到人工智能高級實戰(zhàn)系列課
視頻特色: 本系列專家級精品課有對應(yīng)的配套書籍《分布式機器學(xué)習(xí)實戰(zhàn)》,精品課和書籍可以互補式學(xué)習(xí),彼此相互補充,大大提高了學(xué)習(xí)效率。本系列課和書籍是以分布式機器學(xué)習(xí)為主線,并對其依賴的大數(shù)據(jù)技術(shù)做了詳細介紹,之后對目前主流的分布式機器學(xué)習(xí)框架和算法進行重點講解,本系列課和書籍側(cè)重實戰(zhàn),最后講幾個工業(yè)級的系統(tǒng)實戰(zhàn)項目給大家。 課程核心內(nèi)容有互聯(lián)網(wǎng)公司大數(shù)據(jù)和人工智能那些事、大數(shù)據(jù)算法系統(tǒng)架構(gòu)、大數(shù)據(jù)基礎(chǔ)、Python編程、Java編程、Scala編程、Docker容器、Mahout分布式機器學(xué)習(xí)平臺、Spark分布式機器學(xué)習(xí)平臺、分布式深度學(xué)習(xí)框架和神經(jīng)網(wǎng)絡(luò)算法、自然語言處理算法、工業(yè)級完整系統(tǒng)實戰(zhàn)(推薦算法系統(tǒng)實戰(zhàn)、人臉識別實戰(zhàn)、對話機器人實戰(zhàn))、就業(yè)/面試技巧/職業(yè)生涯規(guī)劃/職業(yè)晉升指導(dǎo)等內(nèi)容。
【充電了么公司介紹】
充電了么App是專注上班族職業(yè)培訓(xùn)充電學(xué)習(xí)的在線教育平臺。
專注工作職業(yè)技能提升和學(xué)習(xí),提高工作效率,帶來經(jīng)濟效益!今天你充電了么?
充電了么官網(wǎng)
http://www.chongdianleme.com/
充電了么App官網(wǎng)下載地址
https://a.app.qq.com/o/simple.jsp?pkgname=com.charged.app
功能特色如下:
【全行業(yè)職位】 - 專注職場上班族職業(yè)技能提升
覆蓋所有行業(yè)和職位,不管你是上班族,高管,還是創(chuàng)業(yè)都有你要學(xué)習(xí)的視頻和文章。其中大數(shù)據(jù)智能AI、區(qū)塊鏈、深度學(xué)習(xí)是互聯(lián)網(wǎng)一線工業(yè)級的實戰(zhàn)經(jīng)驗。
除了專業(yè)技能學(xué)習(xí),還有通用職場技能,比如企業(yè)管理、股權(quán)激勵和設(shè)計、職業(yè)生涯規(guī)劃、社交禮儀、溝通技巧、演講技巧、開會技巧、發(fā)郵件技巧、工作壓力如何放松、人脈關(guān)系等等,全方位提高你的專業(yè)水平和整體素質(zhì)。
【牛人課堂】 - 學(xué)習(xí)牛人的工作經(jīng)驗
1.智能個性化引擎:
海量視頻課程,覆蓋所有行業(yè)、所有職位,通過不同行業(yè)職位的技能詞偏好挖掘分析,智能匹配你目前職位最感興趣的技能學(xué)習(xí)課程。
2.聽課全網(wǎng)搜索
輸入關(guān)鍵詞搜索海量視頻課程,應(yīng)有盡有,總有適合你的課程。
3.聽課播放詳情
視頻播放詳情,除了播放當(dāng)前視頻,更有相關(guān)視頻課程和文章閱讀,對某個技能知識點強化,讓你輕松成為某個領(lǐng)域的資深專家。
【精品閱讀】 - 技能文章興趣閱讀
1.個性化閱讀引擎:
千萬級文章閱讀,覆蓋所有行業(yè)、所有職位,通過不同行業(yè)職位的技能詞偏好挖掘分析,智能匹配你目前職位最感興趣的技能學(xué)習(xí)文章。
2.閱讀全網(wǎng)搜索
輸入關(guān)鍵詞搜索海量文章閱讀,應(yīng)有盡有,總有你感興趣的技能學(xué)習(xí)文章。
【機器人老師】 - 個人提升趣味學(xué)習(xí)
基于搜索引擎和智能深度學(xué)習(xí)訓(xùn)練,為您打造更懂你的機器人老師,用自然語言和機器人老師聊天學(xué)習(xí),寓教于樂,高效學(xué)習(xí),快樂人生。
【精短課程】 - 高效學(xué)習(xí)知識
海量精短牛人課程,滿足你的時間碎片化學(xué)習(xí),快速提高某個技能知識點。
總結(jié)
以上是生活随笔為你收集整理的人工智能之随机森林算法项目实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5G无线频段划分
- 下一篇: 最新的ssm毕业设计题目50例