隨機森林算法
由多個決策樹構成的森林,算法分類結果由這些決策樹投票得到,決策樹在生成的過程當中分別在行方向和列方向上添加隨機過程,行方向上構建決策樹時采用放回抽樣(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 方法返回的結果
摘自:https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-random-forest/index.html