Spark ML隨機森林
隨機森林
做分類
做迴歸,即預測
多個決策樹構成,通過多個決策樹投票結果分數進行分類,不容易出現過度擬合
在生成的過程當中分別在行方向和 列方向上新增隨機過程,行方向上構建決策樹時採用放回抽樣(bootstraping)得到訓練資料,列方向上採用無放 回隨機抽樣得到特徵子集,並據此得到其最優切分點
Spark ML優化隨機森林
在 Spark 平臺上,傳統 單機形式的迭代方式必須要進行相應改進才能適用於分散式環境,這是因為在分散式環境下,資料也 是分散式的,演算法設計不得當會生成大量的IO 操作,影響演算法效率
三個優化策略
1.切分點抽樣統計
在單機環境下的決策樹對連續變數進行切分點選擇時,一般是通過對特徵點進 行排序,然後取相鄰兩個數之間的點作為切分點,
如果在分散式環境下 如此操作的話,會帶來大量的網路傳輸操作,特別是當資料量達到 PB 級時,演算法效率將極為低下
Spark 中的隨機森林在構建決策樹時,會對各分割槽採用一定的子特徵策略進行抽樣, 然後生成各個分割槽的統計資料,並最終得到切分點
2.切分特徵裝箱(Binning)
決策樹的構建過程就是對特徵的取值不斷進行劃分的過程
對於離散 的特徵,如果有 M 個值,最多 個劃分
如果值是有序的,那麼就最多 M-1 個劃分(按老,中,少的序,那麼只有 m-1 個,即 2 種劃分,老|中,少;老,中|少)
劃分的點就是 split(切分點),劃分出的區間就是 bin。對於連續特徵 ,理論上 split 是無數的,在分佈環境下不可能取出所有的值,因此它採用的是1中的切點抽樣統計方 法
3.逐層訓練(level-wise training)
單機版本的決策數生成過程是通過遞迴呼叫(本 質上是深度優先)的方式構造樹,在構造樹的同時,需要移動資料,將同一個子節點的資料移動到一 起
分散式環境下采用的策略是逐層構建樹節點(本質上是廣度優先),這樣遍歷所有資料的次數 等於所有樹中的最大層數。每次遍歷時,只需要計算每個節點所有切分點統計引數,遍歷完後,根據 節點的特徵劃分,決定是否切分,以及如何切分
使用Spark ML分別進行迴歸與分類建模
0 原資料集的模樣
No,year,month,day,hour,pm,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir
1,2010,1,1,0,NaN,-21.0,-11.0,1021.0,NW,1.79,0.0,0.0
2,2010,1,1,1,NaN,-21,-12,1020,NW,4.92,0,0
3,2010,1,1,2,NaN,-21,-11,1019,NW,6.71,0,0
4,2010,1,1,3,NaN,-21,-14,1019,NW,9.84,0,0
5,2010,1,1,4,NaN,-20,-12,1018,NW,12.97,0,0
6,2010,1,1,5,NaN,-19 ,-10,1017,NW,16.1,0,0
7,2010,1,1,6,NaN,-19,-9,1017,NW,19.23,0,0
8,2010,1,1,7,NaN,-19,-9,1017,NW,21.02,0,0
9,2010,1,1,8,NaN,-19,-9,1017,NW,24.15,0,0
10,2010,1,1,9,NaN,-20,-8,1017,NW,27.28,0,0
11,2010,1,1,10,NaN,-19,-7,1017,NW,31.3,0,0
12,2010,1,1,11,NaN,-18,-5,1017,NW,34.43,0,0
13,2010,1,1,12,NaN,-19,-5,1015,NW,37.56,0,0
14,2010,1,1,13,NaN,-18,-3 ,1015,NW,40.69,0,0
15,2010,1,1,14,NaN,-18,-2,1014,NW,43.82,0,0
16,2010,1,1,15,NaN,-18,-1,1014,cv,0.89,0,0
……
1 讀取pm.csv,將含有缺失值的行扔掉(或用均值填充)將資料集分為兩部分,0.8比例作為訓練集,0.2比例作為測試集
case class data(No: Int, year: Int, month: Int, day: Int, hour: Int, pm: Double, DEWP: Double, TEMP: Double, PRES: Double, cbwd: String, Iws: Double, Is: Double, Ir: Double)
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("foreast")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
Logger.getLogger("org").setLevel(Level.ERROR)
val root = MyRandomForeast.getClass.getResource("/")
import sqlContext.implicits._
val df = sc.textFile(root + "pm.csv").map(_.split(",")).filter(_ (0) != "No").filter(!_.contains("NaN")).map(x => data(x(0).toInt, x(1).toInt, x(2).toInt, x(3).toInt, x(4).toInt, x(5).toDouble, x(6).toDouble, x(7).toDouble, x(8).toDouble, x(9), x(10).toDouble, x(11).toDouble, x(12).toDouble)).toDF.drop("No").drop("year")
2 使用month,day,hour,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir作為特徵列(除去No,year,
pm),pm作為label列,使用訓練集、隨機森林演算法進行迴歸建模,使用迴歸模型對測試集進行預測,並評估。
val splitdf = df.randomSplit(Array(0.8, 0.2))
val (train, test) = (splitdf(0), splitdf(1))
val traindf = train.withColumnRenamed("pm", "label")
val indexer = new StringIndexer().setInputCol("cbwd").setOutputCol("cbwd_")
val assembler = new VectorAssembler().setInputCols(Array("month", "day", "hour", "DEWP", "TEMP", "PRES", "cbwd_", "Iws", "Is", "Ir")).setOutputCol("features")
import org.apache.spark.ml.Pipeline
val rf = new RandomForestRegressor().setLabelCol("label").setFeaturesCol("features")
// setMaxDepth最大20,會大幅增加計算時間,增大能有效減小根均方誤差
//setMaxBins我覺得和資料量相關,單獨增大適得其反,要和setNumTrees一起增大
//目前這個引數得到的評估結果(根均方誤差)46.0002637676162
// val numClasses=2
// val categoricalFeaturesInfo = Map[Int, Int]()// Empty categoricalFeaturesInfo indicates all features are continuous.
val pipeline = new Pipeline().setStages(Array(indexer, assembler, rf))
val model = pipeline.fit(traindf)
val testdf = test.withColumnRenamed("pm", "label")
val labelsAndPredictions = model.transform(testdf)
labelsAndPredictions.select("prediction", "label", "features").show(false)
val eva = new RegressionEvaluator().setLabelCol("label").setPredictionCol("prediction")
val accuracy = eva.evaluate(labelsAndPredictions)
println(accuracy)
val treemodel = model.stages(2).asInstanceOf[RandomForestRegressionModel]
println("Learned regression forest model:\n" + treemodel.toDebugString)
3 按照下面標準處理pm列,數字結果放進(levelNum)列,字串結果放進(levelStr)列
優(0) 50
良(1)50~100
輕度汙染(2) 100~150
中度汙染(3) 150~200
重度汙染(4) 200~300
嚴重汙染(5) 大於300及以上
//使用Bucketizer特徵轉換,按區間劃分
val splits = Array(Double.NegativeInfinity, 50, 100, 150, 200, 300, Double.PositiveInfinity)
val bucketizer = new Bucketizer().setInputCol("pm").setOutputCol("levelNum").setSplits(splits)
val bucketizerdf = bucketizer.transform(df)
val tempdf = sqlContext.createDataFrame(
Seq((0.0, "優"), (1.0, "良"), (2.0, "輕度汙染"), (3.0, "中度汙染"), (4.0, "重度汙染"), (5.0, "嚴重汙染"))
).toDF("levelNum", "levelStr")
val df2 = bucketizerdf.join(tempdf, "levelNum").drop("pm")
df2 show
4 使用month,day,hour,DEWP,TEMP,PRES,cbwd,Iws,Is,Ir作為特徵列(除去No,year,pm),levelNum作為label列,使用訓練集、隨機森林演算法進行分類建模。使用分類模型對測試集進行預測對預測結果df進行處理,基於prediction列生成predictionStr(0-5轉換優-嚴重汙染),對結果進行評估
val splitdf2 = df2.randomSplit(Array(0.8, 0.2))
val (train2, test2) = (splitdf2(0), splitdf2(1))
val traindf2 = train2.withColumnRenamed("levelNum", "label")
val indexer2 = new StringIndexer().setInputCol("cbwd").setOutputCol("cbwd_")
val assembler2 = new VectorAssembler().setInputCols(Array("month", "day", "hour", "DEWP", "TEMP", "PRES", "cbwd_", "Iws", "Is", "Ir")).setOutputCol("features")
val rf2 = new RandomForestClassifier().setLabelCol("label").setFeaturesCol("features")
val pipeline2 = new Pipeline().setStages(Array(indexer2, assembler2, rf2))
val model2 = pipeline2.fit(traindf2)
val testdf2 = test2.withColumnRenamed("levelNum", "label")
val labelsAndPredictions2 = model2.transform(testdf2)
labelsAndPredictions2.select("label", "prediction", "features").show
val eva2 = new MulticlassClassificationEvaluator().setLabelCol("label").setPredictionCol("prediction").setMetricName("precision")
val accuracy2 = eva2.evaluate(labelsAndPredictions2)
println("Test Error = " + (1.0 - accuracy2))
val treeModel2 = model2.stages(2).asInstanceOf[RandomForestClassificationModel]
println("learned classifier tree node:\n" + treeModel2.toDebugString)
相關推薦
Spark ML隨機森林
隨機森林 做分類 做迴歸,即預測 多個決策樹構成,通過多個決策樹投票結果分數進行分類,不容易出現過度擬合 在生成的過程當中分別在行方向和 列方向上新增隨機過程,行方向上構建決策樹時採用放回抽樣(bootstraping)得到訓練資料,列方向上採用無放 回
使用基於Apache Spark的隨機森林方法預測貸款風險
在本文中,我將向大家介紹如何使用Apache Spark的spark.ml庫中的隨機森林演算法來對銀行信用貸款的風險做分類預測。Spark的spark.ml庫基於DataFrame,它提供了大量的介面,幫助使用者建立和調優機器學習工作流。結合dataframe使用spa
SPARK官方例項:兩種方法實現隨機森林模型(ML/MLlib)
在spark2.0以上版本中,存在兩種對機器學習演算法的實現庫MLlib與ML,比如隨機森林:org.apache.spark.mllib.tree.RandomForest 和org.apache.spark.ml.classification.RandomForestCl
Spark ML包隨機森林迴歸
官方文件: trainRegressor(, categoricalFeaturesInfo: Map[Int, Int], numTrees: Int, featureSubsetStrategy: String, impurity: String, maxDepth:
隨機森林算法demo python spark
and led != stc gin 隨機 相對 overfit resin 關鍵參數 最重要的,常常需要調試以提高算法效果的有兩個參數:numTrees,maxDepth。 numTrees(決策樹的個數):增加決策樹的個數會降低預測結果的方差,這樣在測試時會有更高
spark 隨機森林算法案例實戰
方法 ring table shel evel 算法 下使用 org trap 隨機森林算法 由多個決策樹構成的森林,算法分類結果由這些決策樹投票得到,決策樹在生成的過程當中分別在行方向和列方向上添加隨機過程,行方向上構建決策樹時采用放回抽樣(bootstraping)得到
Spark-MLlib的快速使用之三(隨機森林)
(1)描述資訊 隨機森林演算法是機器學習、計算機視覺等領域內應用極為廣泛的一個演算法,它不僅可以用來做分類,也可用來做迴歸即預測,隨機森林機由多個決策樹構成,相比於單個決策樹演算法,它分類、預測效果更好,不容易出現過度擬合的情況。 隨機森林演算法基於決策樹,在正式講解隨機森林演算法之前,先來
ml課程:決策樹、隨機森林、GBDT、XGBoost相關(含程式碼實現)
以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。 基礎概念: 熵Entropy:是衡量純度的一個標準,表示式可以寫為: 資訊增益Information Gain:熵變化的一個量,表示式可以寫為: 資訊增益率Gain Ratio:資訊增益的變化率,表示式可以寫為:
Spark隨機森林RandomForest
位於ml/tree/impl/目錄下。mllib目錄下的隨機森林演算法也是呼叫的ml下的RandomForest。ml是mllib的最新實現,將來是要替換掉mllib庫的。 RandomForest核心程式碼 train方法
Spark隨機森林演算法實踐
例子1 object RunRF { def main(args: Array[String]) { val sparkConf = new SparkConf().setAppName(
Spark隨機森林演算法對資料分類(一)——計算準確率和召回率
1.召回率和正確率計算 對於一個K元的分類結果,我們可以得到一個K∗K的混淆矩陣,得到的舉證結果如下圖所示。 從上圖所示的結果中不同的元素表示的含義如下: mij :表示實際分類屬於類i,在預測過程中被預測到分類j 對於所有的mij可以概括為四種方式
隨機森林迴歸(Random Forest)演算法原理及Spark MLlib呼叫例項(Scala/Java/python)
隨機森林迴歸 演算法介紹: 隨機森林是決策樹的整合演算法。隨機森林包含多個決策樹來降低過擬合的風險。隨機森林同樣具有易解釋性、可處理類別特徵、易擴充套件到多分類問題、不需特徵縮放等性質。 隨機森林分別訓練一系列的決策樹,所以訓練過程是並行的。因演算法中加入隨機
spark mllib原始碼分析之隨機森林(Random Forest)(二)
4. 特徵處理 這部分主要在DecisionTree.scala的findSplitsBins函式,將所有特徵封裝成Split,然後裝箱Bin。首先對split和bin的結構進行說明 4.1. 資料結構 4.1.1. Split cl
Spark 隨機森林演算法原理、原始碼分析及案例實戰
圖 1. Spark 與其它大資料處理工具的活躍程度比較 回頁首 環境要求 作業系統:Linux,本文采用的 Ubuntu 10.04,大家可以根據自己的喜好使用自己擅長的 Linux 發行版Java 與 Scala 版本:Scala 2.10.4,Java 1.7Spar
【ML筆記】梯度提升決策樹(GBDT)和隨機森林(RF)的異同
GBDT和RF簡介 GBDT(Gradient Boosting Decision Tree) DT + Boosting = GBDT GBDT是一種boosting演算法。boosting工作機制:先從初始訓練集訓練處一個基學習器,然後在根據基學習器的表現對訓練樣本分佈
spark mllib原始碼分析之隨機森林(Random Forest)(三)
6. 隨機森林訓練 6.1. 資料結構 6.1.1. Node 樹中的每個節點是一個Node結構 class Node @Since("1.2.0") ( @Since("1.0.0") val id: Int, @S
Spark MLlib RandomForest(隨機森林)建模與預測
我要做的是發現異常使用者,而我們之前沒有已經打上異常不異常標籤的樣本,所以對原始資料進行清洗、特徵工程、降維後用Mahout/R做的聚類, 打上了標籤,本來打算繼續用Mahout/R做分類,Mahout太慢,而用R實現KNN、RandomForest之後發現無法
決策樹與隨機森林
隨機 tro 過程 能夠 ots pull 葉子節點 合並 pan 決策樹 決策樹學習采用的是自頂向下的遞歸方法, 其基本思想是以信息熵為度量構造一棵熵值下降最快的樹,到葉子節點處的熵值為零, 此時每個葉節點中的實例都屬於同一類。 決策樹三種生成算法 ID3 -
【機器學習】隨機森林 Random Forest 得到模型後,評估參數重要性
img eas 一個 increase 裏的 sum 示例 增加 機器 在得出random forest 模型後,評估參數重要性 importance() 示例如下 特征重要性評價標準 %IncMSE 是 increase in MSE。就是對每一個變量 比如 X1
決策樹模型組合之隨機森林與GBDT(轉)
get 9.png 生成 代碼 margin ast decision 損失函數 固定 版權聲明: 本文由LeftNotEasy發布於http://leftnoteasy.cnblogs.com, 本文可以被全部的轉載或者部分使用,但請註明出處,如果有問題,請