用隨機(jī)森林分類(lèi)算法進(jìn)行Iris 數(shù)據(jù)分類(lèi)訓(xùn)練,是怎樣的體驗(yàn)?
MLlib是Spark的機(jī)器學(xué)習(xí)(ML)庫(kù),旨在簡(jiǎn)化機(jī)器學(xué)習(xí)的工程實(shí)踐工作,并方便擴(kuò)展到更大規(guī)模。
MLlib由一些通用的學(xué)習(xí)算法和工具組成,包括分類(lèi)、回歸、聚類(lèi)、協(xié)同過(guò)濾、降維等,同時(shí)還包括底層的優(yōu)化原語(yǔ)和高層的管道API。
MLllib目前分為兩個(gè)代碼包:spark.mllib 包含基于RDD的原始算法API。
spark.ml ,提供了基于DataFrames高層次的API,可以用來(lái)構(gòu)建機(jī)器學(xué)習(xí)管道,F(xiàn)EA-spk技術(shù)的機(jī)器學(xué)習(xí)就是基于spark.ml 包。
spark.ml 包,是基于DataFrame的,未來(lái)將成為Spark機(jī)器學(xué)習(xí)的主要API。它可以在分布式集群上進(jìn)行大規(guī)模的機(jī)器學(xué)習(xí)模型訓(xùn)練,并且可以對(duì)數(shù)據(jù)進(jìn)行可視化。
一、隨機(jī)森林分類(lèi)算法的介紹
隨機(jī)森林顧名思義,是用隨機(jī)的方式建立一個(gè)森林,森林里面有很多的決策樹(shù)組成,隨機(jī)森林的每一棵決策樹(shù)之間是沒(méi)有關(guān)聯(lián)的。在得到森林之后,當(dāng)有一個(gè)新的輸入樣本進(jìn)入時(shí),就讓森林中的每一棵決策樹(shù)分別進(jìn)行一下判斷,看看這個(gè)樣本應(yīng)該屬于哪一類(lèi)(對(duì)應(yīng)分類(lèi)算法),然后看看哪一類(lèi)被選擇最多,就預(yù)測(cè)這個(gè)樣本為那一類(lèi)。
使用Spark MLlib隨機(jī)森林算法存在不足,需要改進(jìn)!
具體來(lái)講,使用Spark MLlib進(jìn)行模型的訓(xùn)練,需要進(jìn)行大量的數(shù)據(jù)轉(zhuǎn)化,列聚合為向量等。非常麻煩,并且不能做數(shù)據(jù)的可視化。
而FEA-spk技術(shù)可以很好的解決這些問(wèn)題。對(duì)模型進(jìn)行訓(xùn)練只需要一句命令就行了,并且可以對(duì)結(jié)果數(shù)據(jù)進(jìn)行可視化展示。
二、Iris 數(shù)據(jù)分類(lèi)訓(xùn)練案例
下面列舉一個(gè)用隨機(jī)森林分類(lèi)算法進(jìn)行Iris 數(shù)據(jù)分類(lèi)的例子。
1. 數(shù)據(jù)準(zhǔn)備
原始的數(shù)據(jù)以及相應(yīng)的說(shuō)明可以到https://pan.baidu.com/s/1c2d0hpA下載。 我在這基礎(chǔ)之上,增加了header信息。
這里將下載好的數(shù)據(jù)放到hdfs上面進(jìn)行讀取。
2. Iris 數(shù)據(jù)進(jìn)行訓(xùn)練的具體步驟
(1)要使用FEA-spk技術(shù),首先要?jiǎng)?chuàng)建一個(gè)spk的連接,所有的操作都是以它為上下文進(jìn)行的。在fea界面運(yùn)行以下命令
(2)加載數(shù)據(jù),數(shù)據(jù)在hdfs上面,數(shù)據(jù)的格式為csv文件格式,目錄為/data/iris_data.txt
(3)使用ML_si方法將字符型的label變成index
(4)將特征列的類(lèi)型轉(zhuǎn)化為double類(lèi)型,因?yàn)閟park.ml只支持double類(lèi)型,使用 ML_double方法
(5)使用隨機(jī)森林模型進(jìn)行訓(xùn)練
在訓(xùn)練RandomForest模型的時(shí)候,我們需要設(shè)置好幾個(gè)參數(shù):
- maxBins
***裝箱數(shù),為了近似統(tǒng)計(jì)變量,比如變量有100個(gè)值,我只分成10段去做統(tǒng)計(jì),默認(rèn)值是32;
- numTrees
森林里有幾棵樹(shù),默認(rèn)值是20;
- minInstancesPerNode
每個(gè)節(jié)點(diǎn)最少實(shí)例,默認(rèn)值是1;
- minInfoGain
最小信息增益,默認(rèn)值是0.0;
- maxDepth
***樹(shù)深度,默認(rèn)值是5;
- maxMemoryInMB
***內(nèi)存MB單位,這個(gè)值越大,一次處理的節(jié)點(diǎn)劃分就越多,默認(rèn)值是256;
- cacheNodeIds
是否緩存節(jié)點(diǎn)id,緩存可以加速深層樹(shù)的訓(xùn)練,默認(rèn)值是False;
- checkpointInterval
檢查點(diǎn)間隔,就是多少次迭代固化一次,默認(rèn)值是10;
- impurity
隨機(jī)森林有三種方式,entropy,gini,variance,回歸肯定就是variance,默認(rèn)值是gini;
- seed
采樣種子,種子不變,采樣結(jié)果不變,默認(rèn)值None;
- featureSubsetStrategy
auto: 默認(rèn)參數(shù)。讓算法自己決定,每顆樹(shù)使用幾條數(shù)據(jù)。
使用的參數(shù)如下圖所示
(6)對(duì)訓(xùn)練好的模型進(jìn)行打分
可以看到準(zhǔn)確率達(dá)到了97%
(7)將訓(xùn)練好的模型保存到hdfs上面,以供下次使用
這個(gè)非常實(shí)用,對(duì)于模型比較大的情況下,利用HDFS的分布式結(jié)構(gòu)就可以提高加載性能。
(8)將hdfs上面保存的模型加載進(jìn)來(lái)
(9)對(duì)加載后的模型做預(yù)測(cè)
其中prediction列就是預(yù)測(cè)的結(jié)果
以上就是使用FEA-spk技術(shù)進(jìn)行機(jī)器學(xué)習(xí)的步驟,它非常適合數(shù)據(jù)分析處理大規(guī)模的數(shù)據(jù),簡(jiǎn)單、強(qiáng)大、可視化,不懂Java\Python同樣可以玩轉(zhuǎn)Spark!