1. 程式人生 > >spark 隨機森林算法案例實戰

spark 隨機森林算法案例實戰

方法 ring table shel evel 算法 下使用 org trap

隨機森林算法

由多個決策樹構成的森林,算法分類結果由這些決策樹投票得到,決策樹在生成的過程當中分別在行方向和列方向上添加隨機過程,行方向上構建決策樹時采用放回抽樣(bootstraping)得到訓練數據,列方向上采用無放回隨機抽樣得到特征子集,並據此得到其最優切分點,這便是隨機森林算法的基本原理。圖 3 給出了隨機森林算法分類原理,從圖中可以看到,隨機森林是一個組合模型,內部仍然是基於決策樹,同單一的決策樹分類不同的是,隨機森林通過多個決策樹投票結果進行分類,算法不容易出現過度擬合問題。

圖 3. 隨機森林示意圖

技術分享

技術分享

隨機森林算法案例實戰

本節將通過介紹一個案例來說明隨機森林的具體應用。一般銀行在貨款之前都需要對客戶的還款能力進行評估,但如果客戶數據量比較龐大,信貸審核人員的壓力會非常大,此時常常會希望通過計算機來進行輔助決策。隨機森林算法可以在該場景下使用,例如可以將原有的歷史數據輸入到隨機森林算法當中進行數據訓練,利用訓練後得到的模型對新的客戶數據進行分類,這樣便可以過濾掉大量的無還款能力的客戶,如此便能極大地減少信貨審核人員的工作量。

假設存在下列信貸用戶歷史還款記錄:

表 2. 信貸用戶歷史還款數據表

上述信貸用戶歷史還款記錄被格式化為 label index1:feature1 index2:feature2 index3:feature3 這種格式,例如上表中的第一條記錄將被格式化為 0 1:0 2:1 3:10,各字段含義如下:

是否具備還款能力 是否擁有房產 婚姻情況,0 表示單身、 年收入

0 表示是,1 表示否 0 表示否,1 表示是 1 表示已婚、2 表示離婚 填入實際數字

0 1:0 2:1 3:10

將表中所有數據轉換後,保存為 sample_data.txt,該數據用於訓練隨機森林。測試數據為:

表 3. 測試數據表

如果隨機森林模型訓練正確的話,上面這條用戶數據得到的結果應該是具備還款能力,為方便後期處理,我們將其保存為 input.txt,內容為:

0 1:0 2:1 3:12

將 sample_data.txt、input.txt 利用 hadoop fs –put input.txt sample_data.txt /data 上傳到 HDFS 中的/data 目錄當中,再編寫如清單 9 所示的代碼進行驗證

清單 9. 判斷客戶是否具有還貸能力
package cn.ml
 
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.tree.RandomForest
import org.apache.spark.mllib.tree.model.RandomForestModel
import org.apache.spark.mllib.linalg.Vectors
 
object RandomForstExample {
 def main(args: Array[String]) {
 val sparkConf = new SparkConf().setAppName("RandomForestExample").
          setMaster("spark://sparkmaster:7077")
 val sc = new SparkContext(sparkConf)
 
 val data: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "/data/sample_data.txt")
 
 val numClasses = 2
 val featureSubsetStrategy = "auto"
 val numTrees = 3
 val model: RandomForestModel =RandomForest.trainClassifier(
                    data, Strategy.defaultStrategy("classification"),numTrees, 
 featureSubsetStrategy,new java.util.Random().nextInt())
  
 val input: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "/data/input.txt")
 
 val predictResult = input.map { point =>
 val prediction = model.predict(point.features)
 (point.label, prediction)
}
//打印輸出結果,在 spark-shell 上執行時使用
 predictResult.collect()
 //將結果保存到 hdfs //predictResult.saveAsTextFile("/data/predictResult")
 sc.stop()
 
 }
}

上述代碼既可以打包後利用 spark-summit 提交到服務器上執行,也可以在 spark-shell 上執行查看結果. 圖 10 給出了訓練得到的RadomForest 模型結果,圖 11 給出了 RandomForest 模型預測得到的結果,可以看到預測結果與預期是一致的。

圖 10. 訓練得到的 RadomForest 模型

技術分享

圖 11. collect 方法返回的結果

技術分享

spark 隨機森林算法案例實戰