注:MLlib中的SVM只實(shí)現(xiàn)了線性二分類雪猪。沒(méi)有非線性(核函數(shù)),也沒(méi)有多分類和回歸起愈。線性二分類的優(yōu)化過(guò)程類似于邏輯回歸。以下從三個(gè)方面進(jìn)行分析:(一)SVM的目標(biāo)函數(shù)译仗、損失函數(shù)和最優(yōu)化方法抬虽。(二)從MLlib實(shí)現(xiàn)的源碼分析模型創(chuàng)建以及優(yōu)化的過(guò)程。(三)參考ML中NaiveBayes的實(shí)現(xiàn)纵菌,探索SVM-Pipeline的實(shí)現(xiàn)思路阐污。
一、SVM 公式
1.1 目標(biāo)函數(shù)
目標(biāo)函數(shù):** y = wx **
(注:w是超平面的法向量)
1.2 損失函數(shù)
損失函數(shù):HingeGradient
公式:** avg( max(0, 1 - (2 y - 1) f_w(x))) )**
(注:0 1分類label咱圆,在svm中要轉(zhuǎn)為 -1笛辟,1 <- (2y -1))
1.3 優(yōu)化函數(shù)(隨機(jī)梯度下降)
梯度:** -(2y - 1) * x **
正則項(xiàng):** L2 = (1/2) * w^2 **
梯度更新方法:** weight = weight - lambda (gradient + regParam * weight) **
二功氨、MLlib源碼實(shí)現(xiàn)分析
下圖是SVMWithSGD的類圖,SVMWithSGD繼承了GeneralizdLinearAlgorithm手幢。run()方法會(huì)調(diào)用optimitor:GradientDescent(gradient, updater)優(yōu)化得到模型的權(quán)值參數(shù)weights捷凄,并調(diào)用createModel(weights)方法new一個(gè)SVMModel,返回SVMModel围来。
2.1 創(chuàng)建SVM模型入口
2.1.1 SVMWithSGD 伴生對(duì)象(單例對(duì)象)
org.apache.spark.mllib.classification.SVMWithSGD
??線性SVM伴生對(duì)象是SVMWithSGD跺涤,是建立SVM分類模型的入口。它定義了訓(xùn)練SVM分類模型的train方法监透。
2.1.2 GeneralizdLinearAlgorithm的run執(zhí)行模型訓(xùn)練
org.apache.spark.mllib.regression.GeneralizdLinearAlgorithm
2.2 SVMWithSGD 類設(shè)置損失函數(shù)-最優(yōu)化方法
org.apache.spark.mllib.classification.SVMWithSGD
??分別創(chuàng)建** 梯度下降方法HingeGradient ** 和 ** L2正則化權(quán)重更新方法SquaredL2Updater**桶错,兩者封裝在GradientDescent中,作為優(yōu)化器optimizer胀蛮。
2.2.1 HingeGradient
org.apache.spark.mllib.optimization.HingeGradient
??損失函數(shù):max(0, 1 - (2 y - 1) f_w(x)))
??梯度:-(2y - 1) * x
2.2.2 SquaredL2Updater
org.apache.spark.mllib.optimization.SquaredL2Updater
??梯度更新方法:** weight = weight - lambda (gradient + regParam * weight) **
2.3 優(yōu)化過(guò)程的入口:GradientDescent
org.apache.spark.mllib.optimization.GradientDescent
迭代優(yōu)化的過(guò)程如下:
while( 未收斂 并且 小于迭代次數(shù) ) {
??計(jì)算本次迭代抽樣樣本的梯度和院刁,以及損失和(調(diào)用HingeGradient)
??記錄本次迭代的平均誤差(loss)
??更新權(quán)重(調(diào)用SquaredL2Updater)
??判斷是否收斂
}
三、Pipeline實(shí)現(xiàn)探索
Spark MLlib的Pipeline粪狼,是指將多個(gè)機(jī)器學(xué)習(xí)的算法串聯(lián)到一個(gè)工作鏈中退腥,依次執(zhí)行各種算法;其出現(xiàn)旨在向用戶提供基于 DataFrame 之上的更加高層次的 API 庫(kù)鸳玩,以便構(gòu)建復(fù)雜的機(jī)器學(xué)習(xí)工作流式應(yīng)用阅虫。
??一個(gè) Pipeline 在結(jié)構(gòu)上會(huì)包含一個(gè)或多個(gè) PipelineStage,每一個(gè) PipelineStage 都會(huì)完成一個(gè)任務(wù)不跟,如數(shù)據(jù)集處理轉(zhuǎn)化颓帝,模型訓(xùn)練,參數(shù)設(shè)置或數(shù)據(jù)預(yù)測(cè)等窝革。
3.1 參考NaiveBayes
3.1.1 R->pkg->R->mllib.R
mllib.R中將NaiveBayesWrapper封裝為sparkR中的naiveBayes方法
3.1.2 NaiveBayesWrapper生成一個(gè)Pipeline
org.apache.spark.ml.r.NaiveBayesWrapper
3.1.3 NaiveBayes
org.apache.spark.ml.classification.NaiveBayes
??**將dataset轉(zhuǎn)成RDD购城,并New一個(gè)MLlib中的NaiveBayes來(lái)訓(xùn)練模型 **
3.2 SVM-Pipeline思考
參照以上NaiveBayes的實(shí)現(xiàn),需要在R中的mllib.R中實(shí)現(xiàn)一個(gè)setMethod的方法虐译,以及在ML里實(shí)現(xiàn)** SVMWithSGD 類和 SVMWithSGDWrapper **類瘪板。