pyspark 隨機(jī)森林的實(shí)現(xiàn)
隨機(jī)森林是由許多決策樹構(gòu)成,是一種有監(jiān)督機(jī)器學(xué)習(xí)方法,可以用于分類和回歸,通過合并匯總來自個(gè)體決策樹的結(jié)果來進(jìn)行預(yù)測(cè),采用多數(shù)選票作為分類結(jié)果,采用預(yù)測(cè)結(jié)果平均值作為回歸結(jié)果。
“森林”的概念很好理解,“隨機(jī)”是針對(duì)森林中的每一顆決策樹,有兩種含義:第一種隨機(jī)是數(shù)據(jù)采樣隨機(jī),構(gòu)建決策樹的訓(xùn)練數(shù)據(jù)集通過有放回的隨機(jī)采樣,并且只會(huì)選擇一定百分比的樣本,這樣可以在數(shù)據(jù)集合存在噪聲點(diǎn)、異常點(diǎn)的情況下,有些決策樹的構(gòu)造過程中不會(huì)選擇到這些噪聲點(diǎn)、異常點(diǎn)從而達(dá)到一定的泛化作用在一定程度上抑制過擬合;第二種隨機(jī)是特征隨機(jī),訓(xùn)練集會(huì)包含一系列特征,隨機(jī)選擇一部分特征進(jìn)行決策樹的構(gòu)建。通過這些差異點(diǎn)來訓(xùn)練的每一顆決策樹都會(huì)學(xué)習(xí)輸入與輸出的關(guān)系,隨機(jī)森林的強(qiáng)大之處也就在于此。
廢話不多說,直接上代碼:
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實(shí)例化
#讀取數(shù)據(jù)
data=spark.read.csv('良惡性乳腺癌數(shù)據(jù).csv',header=True)
#構(gòu)造訓(xùn)練數(shù)據(jù)集
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("訓(xùn)練樣本數(shù):{}".format(train_num))
#使用隨機(jī)森林進(jìn)行訓(xùn)練
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)
#輸出模型特征重要性、子樹權(quán)重
print("模型特征重要性:{}".format(rfModel.featureImportances))
print("模型特征數(shù):{}".format(rfModel.numFeatures))
#預(yù)測(cè)測(cè)試集
testSet = testData.map(lambda x:Row(label=x[-1], features=Vectors.dense(x[:-1]))).toDF()
test_num=testSet.count()
print("測(cè)試樣本數(shù):{}".format(test_num))
si_model = stringIndexer.fit(testSet)
test_tf = si_model.transform(testSet)
predictResult = rfModel.transform(test_tf)
predictResult.show(5)
spark.stop()
#將預(yù)測(cè)結(jié)果轉(zhuǎn)為python中的dataframe
columns=predictResult.columns#提取強(qiáng)表字段
predictResult=predictResult.take(test_num)#
predictResult=pd.DataFrame(predictResult,columns=columns)#轉(zhuǎn)為python中的dataframe
#性能評(píng)估
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)#準(zhǔn)確率
f1_score=metrics.f1_score(y, y_pred)#F1分?jǐn)?shù)
auc_score=metrics.roc_auc_score(y, y_predprob)#auc分?jǐn)?shù)
print("精確率:",precision_score )#精確率
print("召回率:",recall_score )#召回率
print("準(zhǔn)確率:",accuracy_score )#準(zhǔn)確率
print("F1分?jǐn)?shù):", f1_score)#F1分?jǐn)?shù)
print("auc分?jǐn)?shù):",auc_score )#auc分?jǐn)?shù)
運(yùn)行結(jié)果:

到此這篇關(guān)于pyspark 隨機(jī)森林的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)pyspark 隨機(jī)森林內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python制作flappybird游戲的詳細(xì)步驟
python中pygame模塊能讓我們很方便的編寫游戲,下面這篇文章主要給大家介紹了關(guān)于如何基于Python制作flappybird游戲的詳細(xì)步驟,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
python 高效去重復(fù) 支持GB級(jí)別大文件的示例代碼
今天小編就為大家分享一篇python 高效去重復(fù) 支持GB級(jí)別大文件的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python設(shè)計(jì)模式之代理模式實(shí)例
這篇文章主要介紹了設(shè)計(jì)模式中的代理模式Python實(shí)例,需要的朋友可以參考下2014-04-04
Python使用SocketServer模塊編寫基本服務(wù)器程序的教程
SocketServer模塊中集成了實(shí)現(xiàn)socket通信服務(wù)器功能所需的各種類和方法,這里我們就來看一下Python使用SocketServer模塊編寫基本服務(wù)器程序的教程:2016-07-07
利用Python實(shí)現(xiàn)快捷操作文件和文件夾
shutil是Python標(biāo)準(zhǔn)庫中的一個(gè)模塊,提供了許多用于文件和文件夾操作的高級(jí)接口,本文主要詳細(xì)介紹了Python如何使用shutil實(shí)現(xiàn)快捷操作文件和文件夾,需要的可以參考下2024-02-02
python在html中插入簡(jiǎn)單的代碼并加上時(shí)間戳的方法
今天小編就為大家分享一篇python在html中插入簡(jiǎn)單的代碼并加上時(shí)間戳的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
pandas中g(shù)roupby操作實(shí)現(xiàn)
本文主要介紹了pandas中g(shù)roupby操作實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Python?matplotlib實(shí)現(xiàn)折線圖的繪制
Matplotlib作為Python的2D繪圖庫,它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。本文將利用Matplotlib庫繪制折線圖,感興趣的可以了解一下2022-03-03

