1. 程式人生 > 程式設計 >pyspark 隨機森林的實現

pyspark 隨機森林的實現

隨機森林是由許多決策樹構成,是一種有監督機器學習方法,可以用於分類和迴歸,通過合併彙總來自個體決策樹的結果來進行預測,採用多數選票作為分類結果,採用預測結果平均值作為迴歸結果。

“森林”的概念很好理解,“隨機”是針對森林中的每一顆決策樹,有兩種含義:第一種隨機是資料取樣隨機,構建決策樹的訓練資料集通過有放回的隨機取樣,並且只會選擇一定百分比的樣本,這樣可以在資料集合存在噪聲點、異常點的情況下,有些決策樹的構造過程中不會選擇到這些噪聲點、異常點從而達到一定的泛化作用在一定程度上抑制過擬合;第二種隨機是特徵隨機,訓練集會包含一系列特徵,隨機選擇一部分特徵進行決策樹的構建。通過這些差異點來訓練的每一顆決策樹都會學習輸入與輸出的關係,隨機森林的強大之處也就在於此。

廢話不多說,直接上程式碼:

from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import StringIndexer
from pyspark.ml.classification import RandomForestClassifier
from pyspark.sql import Row
import pandas as pd
from sklearn import metrics
 
if __name__ == "__main__":
  appname = "RandomForestClassifier"
  master ="local[4]" 
  conf = SparkConf().setAppName(appname).setMaster(master) #spark配置        
  spark=SparkSession.builder.config(conf=conf).getOrCreate()#spark例項化
  
#讀取資料
  data=spark.read.csv('良惡性乳腺癌資料.csv',header=True)
  
#構造訓練資料集
  dataSet = data.na.fill('0').rdd.map(list)#用0填充空值  
  trainData,testData= dataSet.randomSplit([0.7,0.3],seed=7)
  trainingSet = trainData.map(lambda x:Row(label=x[-1],features=Vectors.dense(x[:-1]))).toDF()  
  train_num = trainingSet.count()
  print("訓練樣本數:{}".format(train_num))
 
   
#使用隨機森林進行訓練
  stringIndexer = StringIndexer(inputCol="label",outputCol="indexed")
  si_model = stringIndexer.fit(trainingSet)
  train_tf = si_model.transform(trainingSet)
  train_tf.show(5)  
  rf = RandomForestClassifier(numTrees=100,labelCol="indexed",seed=7)
  rfModel = rf.fit(train_tf)
   
#輸出模型特徵重要性、子樹權重
  print("模型特徵重要性:{}".format(rfModel.featureImportances))
  print("模型特徵數:{}".format(rfModel.numFeatures))
  
#預測測試集
  testSet = testData.map(lambda x:Row(label=x[-1],features=Vectors.dense(x[:-1]))).toDF()
  test_num=testSet.count()
  print("測試樣本數:{}".format(test_num))  
  si_model = stringIndexer.fit(testSet)
  test_tf = si_model.transform(testSet)  
  predictResult = rfModel.transform(test_tf)
  predictResult.show(5)
  spark.stop()
 
#將預測結果轉為python中的dataframe
  columns=predictResult.columns#提取強表字段
  predictResult=predictResult.take(test_num)#
  predictResult=pd.DataFrame(predictResult,columns=columns)#轉為python中的dataframe
 
#效能評估
  y=list(predictResult['indexed'])
  y_pred=list(predictResult['prediction'])
  y_predprob=[x[1] for x in list(predictResult['probability'])]
  precision_score=metrics.precision_score(y,y_pred)#精確率
  recall_score=metrics.recall_score(y,y_pred)#召回率
  accuracy_score=metrics.accuracy_score(y,y_pred)#準確率
  f1_score=metrics.f1_score(y,y_pred)#F1分數
  auc_score=metrics.roc_auc_score(y,y_predprob)#auc分數
  print("精確率:",precision_score )#精確率
  print("召回率:",recall_score )#召回率
  print("準確率:",accuracy_score )#準確率
  print("F1分數:",f1_score)#F1分數
  print("auc分數:",auc_score )#auc分數

執行結果:

pyspark 隨機森林的實現

到此這篇關於pyspark 隨機森林的實現的文章就介紹到這了,更多相關pyspark 隨機森林內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!