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