PySpark-ml-隨機(jī)森林

內(nèi)容摘入自<<Python大數(shù)據(jù)分析從入門到精通>>

附書源碼下載地址

更多信息https://blue-shadow.top/

信息熵-熵的計(jì)算

  • 信息熵:常被用來作為一個(gè)系統(tǒng)的信息含量的量化指標(biāo)卸勺,從而可以進(jìn)一步用來作為系統(tǒng)方程優(yōu)化的目標(biāo)或者參數(shù)選擇的判據(jù),
    可以作為一個(gè)系統(tǒng)復(fù)雜程度的度量,如果系統(tǒng)越復(fù)雜淹禾,出現(xiàn)不同情況的種類越多冀自,那么他的信息熵是比較大的峦剔。
entropy.png
  • 信息熵的三個(gè)性質(zhì)
    • 單調(diào)性,即發(fā)生概率越高的事件,其所攜帶的信息熵越低
    • 非負(fù)性站绪,即信息熵不能為負(fù)
    • 累加性蔓肯,即多隨機(jī)事件同時(shí)發(fā)生存在的總不確定性的量度是可以表示為各事件不確定性的量度的和

可以發(fā)現(xiàn),上述的公式中計(jì)算是相當(dāng)與 將所有的期望值相加了遂鹊。

設(shè)想:在一個(gè)封閉系統(tǒng)的盒子中,其中有各種的信息源蔗包,這些信息源間秉扑,可能相互關(guān)聯(lián),或彼此獨(dú)立〉飨蓿現(xiàn)在從這個(gè)盒子外部看接受信息舟陆。

 對(duì)于單調(diào)性 : 如果 盒子中只有一個(gè)數(shù)據(jù)源,每次都可以確定信息耻矮,這樣對(duì)應(yīng)的必然事件秦躯,對(duì)應(yīng)的概率是1,對(duì)于熵值為0 淘钟。

 累加性:如果盒子中有很多數(shù)據(jù)源宦赠,兩個(gè)獨(dú)立數(shù)據(jù)源發(fā)生時(shí)的概率:P(A)*P(B) ;兩個(gè)關(guān)聯(lián)事件發(fā)生的條件概率為 P(A|B) = P(A∩B)/P(B)
        可以發(fā)現(xiàn)需要間概率計(jì)算中的乘除轉(zhuǎn)為為可以進(jìn)行累加米母,所以使用對(duì)數(shù)進(jìn)行處理勾扭,這樣可以將概率計(jì)算中的乘除化解為加減。

結(jié)合概率統(tǒng)計(jì)中概率計(jì)算
概率計(jì)算及相關(guān)

決策樹-Decision Tree

由于隨機(jī)森林是由很多的決策樹構(gòu)成的铁瞒,所以在使用隨機(jī)森林模型前妙色,先了解決策樹中的構(gòu)建過程,有助于對(duì)隨機(jī)森林的學(xué)習(xí)

  • 使用如下測(cè)試表中的數(shù)據(jù)來說明:
年齡段 是否購(gòu)車 是否購(gòu)房 薪資水平 貸款額度
中年
少年 中等
青年 中等
中年
青年
少年
少年
中年
少年 中等
青年
青年
少年 中等
青年 中等
中年 中等
  • 對(duì)于決策樹的計(jì)算中慧耍,需要使用到熵

為了能夠計(jì)算目標(biāo)變量-貸款額度身辨,需要計(jì)算每類的概率丐谋,然后使用熵公式進(jìn)行計(jì)算。

高貸款額度概率 : 9/14 = 0.64
低貸款額度概率 :5/14 = 0.36

所以 熵值為 : E(貸款額度) = - P(高貸款額度) * log(2)(P(高貸款額度))  - P(低貸款額度) * log(2)(P(低貸款額度))  
                = -( 0.64 * log(2)(0.64)) - (0.36 * log(2)(0.36))
                = -( 0.64 * -0.643856 ) - (0.36 * -1.473931)
                = 0.41206784 + 0.53061516
                = 0.94

用同樣的方式煌珊,計(jì)算各個(gè)特征的熵值: E(年齡) = 0.69 ; E(購(gòu)車) = 0.79 ; E(購(gòu)房) = 0.89 ; E(薪資) = 0.91

  • 信息增益

在信息增益中号俐,衡量標(biāo)準(zhǔn)是看特征能夠?yàn)榉诸愊到y(tǒng)帶來多少信息,帶來的信息越多定庵,該特征越重要吏饿。對(duì)一個(gè)特征而言,系統(tǒng)有它和沒它時(shí)信息量將發(fā)生變化蔬浙,而前后信息量的差值就是這個(gè)特征給系統(tǒng)帶來的信息量猪落。

IG(年齡段) = E(貸款額度) - E(年齡段)
          = 0.94 - 0.69
          = 0.25

IG(購(gòu)車)  = E(貸款額度) - E(購(gòu)車) 
          = 0.94 - 0.79
          = 0.15

IG(購(gòu)房)  = E(貸款額度) - E(購(gòu)房) 
          = 0.94 - 0.89
          = 0.05

IG(薪資)  = E(貸款額度) - E(薪資) 
          = 0.94 - 0.91
          = 0.03

通過求解信息增益量,可以發(fā)現(xiàn)年齡信息增益量最大畴博,所以其作為決策樹的root

所以最后的決策樹樣子應(yīng)該是這樣的:

DT.png

隨機(jī)森林

知道決策樹是如何工作的后,可以轉(zhuǎn)向隨機(jī)森林笨忌。正如名字所暗示的,隨機(jī)森林是由許多樹組成的,許多決策樹。
隨機(jī)森林也可以用于分類和回歸俱病。名字“隨機(jī)”的原因是,因?yàn)闃涞男纬墒请S機(jī)的官疲,集合的特性和隨機(jī)的訓(xùn)練。現(xiàn)在每個(gè)
決策樹接受不同數(shù)據(jù)點(diǎn)的訓(xùn)練試圖學(xué)習(xí)輸入和輸出之間的關(guān)系,最終實(shí)現(xiàn)了這一點(diǎn)與其他使用其他決策樹的預(yù)測(cè)相結(jié)合
一組數(shù)據(jù)點(diǎn)被訓(xùn)練,因此是隨機(jī)森林庶艾。

測(cè)試用數(shù)據(jù)

data_demo.png

示例代碼

from pyspark.sql import SparkSession
spark=SparkSession.builder.appName('random_forest').getOrCreate()

print('-----------讀取用于測(cè)得數(shù)據(jù),檢測(cè)數(shù)據(jù)質(zhì)量和相關(guān)的特征袁余。即相對(duì)數(shù)據(jù)有一定的認(rèn)識(shí),對(duì)后續(xù)進(jìn)行邏輯回歸訓(xùn)練做準(zhǔn)備------------------')

# 讀取數(shù)據(jù)
df=spark.read.csv('cars.csv',inferSchema=True,header=True)

print((df.count(),len(df.columns)))

df.printSchema()

df.describe().select('summary','地區(qū)','駕駛員年齡','駕齡','每年保養(yǎng)次數(shù)','汽車類型').show() # 全景數(shù)據(jù)分析統(tǒng)計(jì)咱揍,會(huì)對(duì)各列按 平均值颖榜,方差,最小值煤裙,最大值 , 函數(shù)統(tǒng)計(jì) 這幾個(gè)統(tǒng)計(jì)量來進(jìn)行統(tǒng)計(jì)掩完。
df.groupBy('故障').count().show()                                                        # 以故障匯總數(shù)據(jù)
df.groupBy('地區(qū)').count().show()                                                        # 以所在地進(jìn)行匯總數(shù)據(jù) 
df.groupBy('汽車類型','故障').count().orderBy('汽車類型','故障','count',ascending=True).show()  

df.groupBy('每年保養(yǎng)次數(shù)','故障').count().orderBy('每年保養(yǎng)次數(shù)','故障','count',ascending=True).show()

df.groupBy('故障').mean().show()                                                        # 計(jì)算均值


print('-----------數(shù)據(jù)轉(zhuǎn)換,將所有的特征值放到一個(gè)特征向量中硼砰,預(yù)測(cè)值分開.劃分?jǐn)?shù)據(jù)用于模型------------------')

from pyspark.ml.feature import VectorAssembler                                         #一個(gè) 導(dǎo)入VerctorAssembler 將多個(gè)列合并成向量列的特征轉(zhuǎn)換器,即將表中各列用一個(gè)類似list表示且蓬,輸出預(yù)測(cè)列為單獨(dú)一列。

df_assembler = VectorAssembler(inputCols=['地區(qū)', '駕駛員年齡', '駕齡', '每年保養(yǎng)次數(shù)', '汽車類型'], outputCol="features")
df = df_assembler.transform(df)
df.printSchema()

df.select(['features','故障']).show(10,False)

model_df=df.select(['features','故障'])                                               # 選擇用于模型訓(xùn)練的數(shù)據(jù)
train_df,test_df=model_df.randomSplit([0.75,0.25])                                    # 訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)分為75%和25%

train_df.groupBy('故障').count().show()
test_df.groupBy('故障').count().show()

print('-----------使用隨機(jī)深林進(jìn)行數(shù)據(jù)訓(xùn)練----------------')

from pyspark.ml.classification import RandomForestClassifier

rf_classifier=RandomForestClassifier(labelCol='故障',numTrees=50).fit(train_df)      # numTrees設(shè)置隨機(jī)數(shù)的數(shù)量為50,還有其他參數(shù):maxDepth 樹深;返回的模型類型為:RandomForestClassificationModel

rf_predictions=rf_classifier.transform(test_df)

print('{}{}'.format('評(píng)估每個(gè)屬性的重要性:',rf_classifier.featureImportances))   # featureImportances : 評(píng)估每個(gè)功能的重要性,

rf_predictions.select(['probability','故障','prediction']).show(10,False)

print("------查閱pyspark api题翰,沒有發(fā)現(xiàn)有訓(xùn)練準(zhǔn)確率的字段恶阴,所以還需要計(jì)算預(yù)測(cè)的準(zhǔn)確率------")

from pyspark.ml.evaluation import BinaryClassificationEvaluator      # 對(duì)二進(jìn)制分類的評(píng)估器,它期望兩個(gè)輸入列:原始預(yù)測(cè)值和標(biāo)簽
from pyspark.ml.evaluation import MulticlassClassificationEvaluator  # 多類分類的評(píng)估器,它期望兩個(gè)輸入列:預(yù)測(cè)和標(biāo)簽

rf_accuracy=MulticlassClassificationEvaluator(labelCol='故障',metricName='accuracy').evaluate(rf_predictions)
print('MulticlassClassificationEvaluator 隨機(jī)深林測(cè)試的準(zhǔn)確性: {0:.0%}'.format(rf_accuracy))

rf_auc=BinaryClassificationEvaluator(labelCol='故障').evaluate(rf_predictions)
print('BinaryClassificationEvaluator 隨機(jī)深林測(cè)試的準(zhǔn)確性: {0:.0%}'.format(rf_auc))


print('-----------保持模型,用于下次使用----------------')

rf_classifier.save("RF_model")
part1.png
part2.png
part3.png

上一篇:PySpark-ml-邏輯回歸
下一篇:PySpark-ml-推薦系統(tǒng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豹障,一起剝皮案震驚了整個(gè)濱河市冯事,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌血公,老刑警劉巖昵仅,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摔笤,警方通過查閱死者的電腦和手機(jī)够滑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吕世,“玉大人彰触,你說我怎么就攤上這事∶剑” “怎么了渴析?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吮龄。 經(jīng)常有香客問我,道長(zhǎng)咆疗,這世上最難降的妖魔是什么漓帚? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮午磁,結(jié)果婚禮上尝抖,老公的妹妹穿的比我還像新娘。我一直安慰自己迅皇,他們只是感情好昧辽,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著登颓,像睡著了一般搅荞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上框咙,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天咕痛,我揣著相機(jī)與錄音,去河邊找鬼喇嘱。 笑死茉贡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的者铜。 我是一名探鬼主播腔丧,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼作烟!你這毒婦竟也來了愉粤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俗壹,失蹤者是張志新(化名)和其女友劉穎科汗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绷雏,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡头滔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年怖亭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坤检。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兴猩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出早歇,到底是詐尸還是另有隱情倾芝,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布箭跳,位于F島的核電站晨另,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谱姓。R本人自食惡果不足惜借尿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屉来。 院中可真熱鬧路翻,春花似錦、人聲如沸茄靠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慨绳。三九已至掉冶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脐雪,已是汗流浹背郭蕉。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喂江,地道東北人召锈。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像获询,于是被迫代替她去往敵國(guó)和親涨岁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容