Random Forests預測森林植被類型

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/humanity11/article/details/78169900


Colorado北部,有一片森林,森林裏中有多種類型的植被,有人已經將其大概總結出來了7種:

1 - Spruce/Fir
2 - Lodgepole Pine
3 - Ponderosa Pine
4 - Cottonwood/Willow
5 - Aspen
6 - Douglas-fir
7 - Krummholz

如果將它們的特徵劃,可以劃分成12種,在這12中類型中,其中兩種特徵又可以劃分成4和40中,這樣可以任務這些植被有54中類型。現在有人已經根據樣本的特性手動劃分了植被類型一部分,現在需要自動識別未劃分的植被類型

(1)本文將基於隨機森林算法在spark的集羣上做模型係數的優化,來識別不同的植被類型。

1.1 數據的預處理:

在其給出的數據中存在54中數據類型如圖:


很顯然,這些特徵屬於類別型特徵,其中比較特殊是wilderness_area和soil_type,它們是one-hot類型,有4和40個特徵值。

val data=sparkSession.sparkContext.textFile(fileName).map(_.split(",").map(_.toDouble)).map(lin=>{
        LabeledPoint(line.last-1,Vectors.dense(line.init))
      })
val Array(trainData,cvData,testData)=data.randomSplit(Array(0.8,0.1,0.1));
這裏我們用80%做訓練集,10%做校驗,10%做測試。

(2)建立模型和調節參數;

隨機森林的模型val model=RandomForest.trainClassifier(trainData,numclass,map,numTrees,"auto",inpurity,maxDepth,maxBin)

說明:trainData:訓練數據,LabeledPoint類型

numclass:分類數量

map(k->v) 類別k是v的特徵

numTrees:建立數的棵樹

auto:評估特徵選擇策略

inpuity:採用哪種信息純度計算方式

maxDepth:數的最大深度

maxbin:數的最大同數

好了,下面來確定參數,參數確定當然是根據預測的準確度、召回率、錯誤率、、、

這裏spark中有一個類MulticlassMetrics來幫我們計算,這樣我們就不用自己寫了。這個類有個方法accuracy就等到了準確率,調節參數過程如下:

 val evaluations=for(numtrees<- 1 to 20;depth<- 20 to 30;bins<-2- to 300;inpuity<-Array("gini","entropy"))yield {
      val model=RandomForest.trainClassifier(trainData,7,Map(10->4,11->40),numtrees,"auto",inpuity,depth,bins);
      val trainAccuracy=desionTree3.getForestMetra(model,cvData).accuracy;
      (inpuity,depth,bins,trainAccuracy)
    }
    evaluations.sortBy(_._4).reverse.take(10).foreach(println)
  }

最後的結果:


顯然當深度取30,桶數取40時,準確率最高達到93.9%

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章