Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS
Spark MLlib回歸算法------線性回歸、邏輯回歸、SVM和ALS
?
1、線性回歸:
(1)模型的建立:
回歸正則化方法(Lasso,Ridge和ElasticNet)在高維和數(shù)據(jù)集變量之間多重共線性情況下運(yùn)行良好。
?
數(shù)學(xué)上,ElasticNet被定義為L(zhǎng)1和L2正則化項(xiàng)的凸組合:
通過(guò)適當(dāng)設(shè)置α,ElasticNet包含L1和L2正則化作為特殊情況。例如,如果用參數(shù)α設(shè)置為1來(lái)訓(xùn)練線性回歸模型,則其等價(jià)于Lasso模型。另一方面,如果α被設(shè)置為0,則訓(xùn)練的模型簡(jiǎn)化為ridge回歸模型。?
(2)實(shí)戰(zhàn):
利用線性回歸+隨機(jī)梯度下降算法構(gòu)建一個(gè)線性模型,并進(jìn)行預(yù)測(cè),最后計(jì)算均方誤差(Mean Squared Errors)來(lái)對(duì)模型進(jìn)行評(píng)估。
val conf = new SparkConf().setAppName("LeanerRegressionModelDemo").setMaster("local[4]")val sc = new SparkContext(conf)val data = sc.textFile("C://Users//BIGDATA//Desktop//文件//BigData//Spark//7.SparkMLlib_2//resource//resource//ridge-data//lpsa.data")val parsedData = data.map { line =>val parts = line.split(',')LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))}.cache()// Building the modelval numIterations = 20val model = LinearRegressionWithSGD.train(parsedData, numIterations)// Evaluate model on training examples and compute training errorval valuesAndPreds = parsedData.map { point =>val prediction = model.predict(point.features)(point.label, prediction)}val MSE = valuesAndPreds.map{ case(v, p) => math.pow((v - p), 2)}.reduce(_ + _)/valuesAndPreds.countprintln("training Mean Squared Error = " + MSE)
2、邏輯回歸:
(1)數(shù)學(xué)公式
邏輯回歸一般是用來(lái)預(yù)測(cè)二元分類(lèi)的,它的線性方法可以用公式(1)進(jìn)行描述,它的損失函數(shù)用公式(2)進(jìn)行描術(shù):
f(w):=λR(w)+1n∑i=1nL(w;xi,yi)? ????????(1)這里,xi∈Rd 代表訓(xùn)練數(shù)據(jù), 1≤i≤n , yi∈R對(duì)應(yīng)的是labels.?
目標(biāo)函數(shù)f有兩部分:正則化和損失函數(shù),前者的作用是為了去躁,后者是用來(lái)評(píng)估訓(xùn)練數(shù)據(jù)模型的誤差。在w中損失函數(shù)L(w;.)是一個(gè)典型的凸函數(shù)。固定的正則化參數(shù)λ≥0(代碼中用regParam 表示),用來(lái)權(quán)衡兩目標(biāo)間的最小損失。?
下面是sparkmllib當(dāng)中的損失函數(shù)和它對(duì)應(yīng)的梯度下降方法數(shù)學(xué)表達(dá)式:?
?
接下來(lái)的正則化函數(shù)公式:?
?
sign(w) 是由 (±1)組成的向量。
對(duì)于二元分類(lèi)問(wèn)題,訓(xùn)練輸出一個(gè)預(yù)測(cè)模型,給定一組向量X,能過(guò)通過(guò)公式(3)進(jìn)行預(yù)測(cè)。
f(z)=1/(1+e?z)???????????? (3)其中 z=wTx,(數(shù)學(xué)公式不好弄,T代表轉(zhuǎn)置),默認(rèn)情況下,f(wTx)>0.5代表正面,其他就是反面。?
在sparkmllib當(dāng)中,我們使用 mini-batch gradient descent 和 L-BFGS 來(lái)解決邏輯回歸,推薦使用L-BFGS算法,因?yàn)樗諗扛臁?/p>
(2)實(shí)戰(zhàn):
val conf = new SparkConf().setAppName("LogisticRegressionDemo").setMaster("local")val sc = new SparkContext(conf)// Load training data in LIBSVM format.val data = MLUtils.loadLibSVMFile(sc, "C://Users//BIGDATA//Desktop//文件//BigData//Spark//7.SparkMLlib_2//resource//resource//sample_libsvm_data.txt")// Split data into training (60%) and test (40%).val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)val training = splits(0).cache()val test = splits(1)// Run training algorithm to build the modelval model = new LogisticRegressionWithLBFGS().setNumClasses(10).run(training)// Compute raw scores on the test set.val predictionAndLabels = test.map { case LabeledPoint(label, features) =>val prediction = model.predict(features)(prediction, label)}// Get evaluation metrics.val metrics = new MulticlassMetrics(predictionAndLabels)val precision = metrics.precisionprintln("Precision = " + precision)// Save and load modelmodel.save(sc, "target/tmp/scalaLogisticRegressionWithLBFGSModel")val sameModel = LogisticRegressionModel.load(sc,"target/tmp/scalaLogisticRegressionWithLBFGSModel")?
3、Svm:
(1)方法簡(jiǎn)介:
? 支持向量機(jī)SVM是一種二分類(lèi)模型。它的基本模型是定義在特征空間上的間隔最大的線性分類(lèi)器。支持向量機(jī)學(xué)習(xí)方法包含3種模型:線性可分支持向量機(jī)、線性支持向量機(jī)及非線性支持向量機(jī)。當(dāng)訓(xùn)練數(shù)據(jù)線性可分時(shí),通過(guò)硬間隔最大化,學(xué)習(xí)一個(gè)線性的分類(lèi)器,即線性可分支持向量機(jī);當(dāng)訓(xùn)練數(shù)據(jù)近似線性可分時(shí),通過(guò)軟間隔最大化,也學(xué)習(xí)一個(gè)線性的分類(lèi)器,即線性支持向量機(jī);當(dāng)訓(xùn)練數(shù)據(jù)線性不可分時(shí),通過(guò)使用核技巧及軟間隔最大化,學(xué)習(xí)非線性支持向量機(jī)。線性支持向量機(jī)支持L1和L2的正則化變型。
(2)基本原理
? 支持向量機(jī),因其英文名為support?vector?machine,故一般簡(jiǎn)稱(chēng)SVM。SVM從線性可分情況下的最優(yōu)分類(lèi)面發(fā)展而來(lái)。最優(yōu)分類(lèi)面就是要求分類(lèi)線不但能將兩類(lèi)正確分開(kāi)(訓(xùn)練錯(cuò)誤率為0),且使分類(lèi)間隔最大。SVM考慮尋找一個(gè)滿足分類(lèi)要求的超平面,并且使訓(xùn)練集中的點(diǎn)距離分類(lèi)面盡可能的遠(yuǎn),也就是尋找一個(gè)分類(lèi)面使它兩側(cè)的空白區(qū)域(margin)最大。這兩類(lèi)樣本中離分類(lèi)面最近,且平行于最優(yōu)分類(lèi)面的超平面上的點(diǎn),就叫做支持向量(下圖中紅色的點(diǎn))。
svm
假設(shè)超平面可描述為:
\(wx+b=0, w\in R^n, b\in R \)
其分類(lèi)間隔等于?\(\frac{2}{||w||}\)?。其學(xué)習(xí)策略是使數(shù)據(jù)間的間隔最大化,最終可轉(zhuǎn)化為一個(gè)凸二次規(guī)劃問(wèn)題的求解。
分類(lèi)器的損失函數(shù)(hinge loss鉸鏈損失)如下所示:
\(L(w;x,y):=max(0,1-yw^Tx)\)
默認(rèn)情況下,線性SVM是用L2 正則化來(lái)訓(xùn)練的,但也支持L1正則化。在這種情況下,這個(gè)問(wèn)題就變成了一個(gè)線性規(guī)劃。
? 線性SVM算法輸出一個(gè)SVM模型。給定一個(gè)新的數(shù)據(jù)點(diǎn),比如說(shuō)?\(x\)?,這個(gè)模型就會(huì)根據(jù)?\(w^Tx\)?的值來(lái)進(jìn)行預(yù)測(cè)。默認(rèn)情況下,如果?\(w^Tx \ge 0\)?,則輸出預(yù)測(cè)結(jié)果為正(因?yàn)槲覀兿胍獡p失函數(shù)最小,如果預(yù)測(cè)為負(fù),則會(huì)導(dǎo)致?lián)p失函數(shù)大于1),反之則預(yù)測(cè)為負(fù)。
(3)實(shí)戰(zhàn):
? 下面的例子具體介紹了如何讀入一個(gè)數(shù)據(jù)集,然后用SVM對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練,然后用訓(xùn)練得到的模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè),并計(jì)算錯(cuò)誤率。以iris數(shù)據(jù)集為例進(jìn)行分析。iris以鳶尾花的特征作為數(shù)據(jù)來(lái)源,數(shù)據(jù)集包含150個(gè)數(shù)據(jù)集,分為3類(lèi),每類(lèi)50個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)包含4個(gè)屬性,是在數(shù)據(jù)挖掘、數(shù)據(jù)分類(lèi)中非常常用的測(cè)試集、訓(xùn)練集。
????
? ? ?
val conf = new SparkConf().setAppName("LogisticRegressionDemo").setMaster("local")val sc = new SparkContext(conf)//讀取數(shù)據(jù)/*首先,讀取文本文件;然后,通過(guò)map將每行的數(shù)據(jù)用“,”隔開(kāi),在我們的數(shù)據(jù)集中,每行被分成了5部分,前4部分是鳶尾花的4個(gè)特征,最后一部分是鳶尾花的分類(lèi)。把這里我們用LabeledPoint來(lái)存儲(chǔ)標(biāo)簽列和特征列。LabeledPoint在監(jiān)督學(xué)習(xí)中常用來(lái)存儲(chǔ)標(biāo)簽和特征,其中要求標(biāo)簽的類(lèi)型是double,特征的類(lèi)型是Vector。所以,我們把鶯尾花的分類(lèi)進(jìn)行了一下改變,"Iris-setosa"對(duì)應(yīng)分類(lèi)0,"Iris-versicolor"對(duì)應(yīng)分類(lèi)1,其余對(duì)應(yīng)分類(lèi)2;然后獲取鶯尾花的4個(gè)特征,存儲(chǔ)在Vector中。*/val data = sc.textFile("C://Users//BIGDATA//Desktop//文件//BigData//Spark//7.SparkMLlib_2//resource//resource//iris.data")val parsedData = data.map { line =>val parts = line.split(',')LabeledPoint(if(parts(4)=="Iris-setosa") 0.toDouble else if (parts(4) =="Iris-versicolor") 1.toDoubleelse 2.toDouble, Vectors.dense(parts(0).toDouble,parts(1).toDouble,parts(2).toDouble,parts(3).toDouble))}//構(gòu)建模型:/*?* 因?yàn)镾VM只支持2分類(lèi),所以我們要進(jìn)行一下數(shù)據(jù)抽取,這里我們通過(guò)filter過(guò)濾掉第2類(lèi)的數(shù)據(jù),只選取第0類(lèi)和第1類(lèi)的數(shù)據(jù)。然后,我們把數(shù)據(jù)集劃分成兩部分,其中訓(xùn)練集占60%,測(cè)試集占40%:* 接下來(lái),通過(guò)訓(xùn)練集構(gòu)建模型SVMWithSGD。這里的SGD即著名的隨機(jī)梯度下降算法(Stochastic Gradient Descent)。* 設(shè)置迭代次數(shù)為1000,除此之外還有stepSize(迭代步伐大小),regParam(regularization正則化控制參數(shù)),miniBatchFraction(每次迭代參與計(jì)算的樣本比例),initialWeights(weight向量初始值)等參數(shù)可以進(jìn)行設(shè)*/val splits = parsedData.filter { point => point.label != 2 }.randomSplit(Array(0.6, 0.4), seed = 11L)val training = splits(0).cache()val test = splits(1)val numIterations = 1000val model = SVMWithSGD.train(training, numIterations)//模型評(píng)估/*我們清除默認(rèn)閾值,這樣會(huì)輸出原始的預(yù)測(cè)評(píng)分,即帶有確信度的結(jié)果。如果設(shè)置了閾值,則會(huì)把大于閾值的結(jié)果當(dāng)成正預(yù)測(cè),小于閾值的結(jié)果當(dāng)成負(fù)預(yù)測(cè)。? 最后,我們構(gòu)建評(píng)估矩陣,把模型預(yù)測(cè)的準(zhǔn)確性打印出來(lái):*/model.clearThreshold()val scoreAndLabels = test.map { point =>val score = model.predict(point.features)(score, point.label)}scoreAndLabels.foreach(println)model.setThreshold(0.0)scoreAndLabels.foreach(println)val metrics = new BinaryClassificationMetrics(scoreAndLabels)val auROC = metrics.areaUnderROC()println("Area under ROC = " + auROC)
4、als:
(1)算法介紹:
??? 協(xié)同過(guò)濾常被用于推薦系統(tǒng)。這類(lèi)技術(shù)目標(biāo)在于填充“用戶(hù)-商品”聯(lián)系矩陣中的缺失項(xiàng)。Spark.ml目前支持基于模型的協(xié)同過(guò)濾,其中用戶(hù)和商品以少量的潛在因子來(lái)描述,用以預(yù)測(cè)缺失項(xiàng)。Spark.ml使用交替最小二乘(ALS)算法來(lái)學(xué)習(xí)這些潛在因子。
(2)顯式與隱式反饋
??? 基于矩陣分解的協(xié)同過(guò)濾的標(biāo)準(zhǔn)方法中,“用戶(hù)-商品”矩陣中的條目是用戶(hù)給予商品的顯式偏好,例如,用戶(hù)給電影評(píng)級(jí)。然而在現(xiàn)實(shí)世界中使用時(shí),我們常常只能訪問(wèn)隱式反饋(如意見(jiàn)、點(diǎn)擊、購(gòu)買(mǎi)、喜歡以及分享等),在spark.ml中我們使用“隱式反饋數(shù)據(jù)集的協(xié)同過(guò)濾“來(lái)處理這類(lèi)數(shù)據(jù)。本質(zhì)上來(lái)說(shuō)它不是直接對(duì)評(píng)分矩陣進(jìn)行建模,而是將數(shù)據(jù)當(dāng)作數(shù)值來(lái)看待,這些數(shù)值代表用戶(hù)行為的觀察值(如點(diǎn)擊次數(shù),用戶(hù)觀看一部電影的持續(xù)時(shí)間)。這些數(shù)值被用來(lái)衡量用戶(hù)偏好觀察值的置信水平,而不是顯式地給商品一個(gè)評(píng)分。然后,模型用來(lái)尋找可以用來(lái)預(yù)測(cè)用戶(hù)對(duì)商品預(yù)期偏好的潛在因子。
(3)正則化參數(shù)
??? 我們調(diào)整正則化參數(shù)regParam來(lái)解決用戶(hù)在更新用戶(hù)因子時(shí)產(chǎn)生新評(píng)分或者商品更新商品因子時(shí)收到的新評(píng)分帶來(lái)的最小二乘問(wèn)題。這個(gè)方法叫做“ALS-WR”它降低regParam對(duì)數(shù)據(jù)集規(guī)模的依賴(lài),所以我們可以將從部分子集中學(xué)習(xí)到的最佳參數(shù)應(yīng)用到整個(gè)數(shù)據(jù)集中時(shí)獲得同樣的性能。
參數(shù):
alpha:
類(lèi)型:雙精度型。
含義:隱式偏好中的alpha參數(shù)(非負(fù))。
checkpointInterval:
類(lèi)型:整數(shù)型。
含義:設(shè)置檢查點(diǎn)間隔(>=1),或不設(shè)置檢查點(diǎn)(-1)。
implicitPrefs:
類(lèi)型:布爾型。
含義:特征列名。
itemCol:
類(lèi)型:字符串型。
含義:商品編號(hào)列名。
maxIter:
類(lèi)型:整數(shù)型。
含義:迭代次數(shù)(>=0)。
nonnegative:
類(lèi)型:布爾型。
含義:是否需要非負(fù)約束。
numItemBlocks:
類(lèi)型:整數(shù)型。
含義:商品數(shù)目(正數(shù))。
numUserBlocks:
類(lèi)型:整數(shù)型。
含義:用戶(hù)數(shù)目(正數(shù))。
predictionCol:
類(lèi)型:字符串型。
含義:預(yù)測(cè)結(jié)果列名。
rank:
類(lèi)型:整數(shù)型。
含義:分解矩陣的排名(正數(shù))。
ratingCol:
類(lèi)型:字符串型。
含義:評(píng)分列名。
regParam:
類(lèi)型:雙精度型。
含義:正則化參數(shù)(>=0)。
seed:
類(lèi)型:長(zhǎng)整型。
含義:隨機(jī)種子。
userCol:
類(lèi)型:字符串型。
含義:用戶(hù)列名。
(4)實(shí)戰(zhàn):
?
val conf = new SparkConf().setAppName("als").setMaster("local[4]")val sc = new SparkContext(conf)//val root = als.getClass.getResource("/")val data = sc.textFile("C://Users//BIGDATA//Desktop//文件//BigData//Spark//7.SparkMLlib_2//resource//resource//als//test.data")val ratings = data.map(_.split(',') match { case Array(user, item, rate) =>Rating(user.toInt, item.toInt, rate.toDouble)})// Build the recommendation model using ALSval rank = 10val numIterations = 10val model = ALS.train(ratings, rank, numIterations, 0.01)// Evaluate the model on rating dataval usersProducts = ratings.map { case Rating(user, product, rate) =>(user, product)}val predictions =model.predict(usersProducts).map { case Rating(user, product, rate) =>((user, product), rate)}val ratesAndPreds = ratings.map { caseRating(user, product, rate) =>((user, product), rate)}.join(predictions)val MSE = ratesAndPreds.map { case ((user, product), (r1, r2)) =>val err = (r1 - r2)err * err}.mean()println("Mean Squared Error = " + MSE)// Save and load modelmodel.save(sc, "C://tmp")val sameModel = MatrixFactorizationModel.load(sc, "C://tmp")
總結(jié)
以上是生活随笔為你收集整理的Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ChatGPT大热 老黄抓住风口 NVI
- 下一篇: 《the way to go》一处关于g