离线轻量级大数据平台Spark之MLib机器学习库线性回归实例
生活随笔
收集整理的這篇文章主要介紹了
离线轻量级大数据平台Spark之MLib机器学习库线性回归实例
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、線(xiàn)性回歸
線(xiàn)性回歸是利用稱(chēng)為線(xiàn)性回歸方程的函數(shù)對(duì)一個(gè)或多個(gè)自變量和因變量之間關(guān)系進(jìn)行建模的一種回歸分析方法,只有一個(gè)自變量的情況稱(chēng)為簡(jiǎn)單回歸,大于一個(gè)自變量情況的叫做多元回歸,在實(shí)際情況中大多數(shù)都是多元回歸。
線(xiàn)性回歸(Linear Regression)問(wèn)題屬于監(jiān)督學(xué)習(xí)(Supervised Learning)范疇,又稱(chēng)分類(lèi)(Classification)或歸納學(xué)習(xí)(Inductive Learning)。這類(lèi)分析中訓(xùn)練數(shù)據(jù)集中給出的數(shù)據(jù)類(lèi)型是確定的。機(jī)器學(xué)習(xí)的目標(biāo)是,對(duì)于給定的一個(gè)訓(xùn)練數(shù)據(jù)集,通過(guò)不斷的分析和學(xué)習(xí)產(chǎn)生一個(gè)聯(lián)系屬性集合和類(lèi)標(biāo)集合的分類(lèi)函數(shù)(Classification Function)或預(yù)測(cè)函數(shù))Prediction Function),這個(gè)函數(shù)稱(chēng)為分類(lèi)模型(Classification Model——或預(yù)測(cè)模型(Prediction Model)。通過(guò)學(xué)習(xí)得到的模型可以是一個(gè)決策樹(shù)、規(guī)格集、貝葉斯模型或一個(gè)超平面。通過(guò)這個(gè)模型可以對(duì)輸入對(duì)象的特征向量預(yù)測(cè)或?qū)?duì)象的類(lèi)標(biāo)進(jìn)行分類(lèi)。回歸問(wèn)題中通常使用最小二乘(Least Squares)法來(lái)迭代最優(yōu)的特征中每個(gè)屬性的比重,通過(guò)損失函數(shù)(Loss Function)或錯(cuò)誤函數(shù)(Error Function)定義來(lái)設(shè)置收斂狀態(tài),即作為梯度下降算法的逼近參數(shù)因子。
實(shí)例中給出了如何導(dǎo)入訓(xùn)練集數(shù)據(jù),將其解析為帶標(biāo)簽點(diǎn)的RDD,然后使用了LinearRegressionWithSGD 算法來(lái)建立一個(gè)簡(jiǎn)單的線(xiàn)性模型來(lái)預(yù)測(cè)標(biāo)簽的值,最后計(jì)算了均方差來(lái)評(píng)估預(yù)測(cè)值與實(shí)際值的吻合度。
線(xiàn)性回歸分析的整個(gè)過(guò)程可以簡(jiǎn)單描述為如下三個(gè)步驟:
? 尋找合適的預(yù)測(cè)函數(shù),即上文中的 h(x) ,用來(lái)預(yù)測(cè)輸入數(shù)據(jù)的判斷結(jié)果。這個(gè)過(guò)程是非常關(guān)鍵的,需要對(duì)數(shù)據(jù)有一定的了解或分析,知道或者猜測(cè)預(yù)測(cè)函數(shù)的“大概”形式,比如是線(xiàn)性函數(shù)還是非線(xiàn)性函數(shù),若是非線(xiàn)性的則無(wú)法用線(xiàn)性回歸來(lái)得出高質(zhì)量的結(jié)果。
? 構(gòu)造一個(gè)Loss函數(shù)(損失函數(shù)),該函數(shù)表示預(yù)測(cè)的輸出(h)與訓(xùn)練數(shù)據(jù)標(biāo)簽之間的偏差,可以是二者之間的差(h-y)或者是其他的形式(如平方差開(kāi)方)。綜合考慮所有訓(xùn)練數(shù)據(jù)的“損失”,將Loss求和或者求平均,記為 J(θ) 函數(shù),表示所有訓(xùn)練數(shù)據(jù)預(yù)測(cè)值與實(shí)際類(lèi)別的偏差。
? 顯然, J(θ) 函數(shù)的值越小表示預(yù)測(cè)函數(shù)越準(zhǔn)確(即h函數(shù)越準(zhǔn)確),所以這一步需要做的是找到 J(θ) 函數(shù)的最小值。找函數(shù)的最小值有不同的方法,Spark中采用的是梯度下降法(stochastic gradient descent,SGD)。
2、Java開(kāi)發(fā)
Java開(kāi)發(fā)上,引入spark-mllib_2.11-2.0.1.jar、spark-mllib-local_2.11-2.0.1.jar、spark-catalyst_2.11-2.0.1.jar。
參考spark的example案例的代碼,輸出sklr.jar包并提交執(zhí)行。bin/spark-submit --class sk.mlib.LinearRegressionWithSGDDemo --master local /tmp/sklr.jar
代碼如下:
package sk.mlib;import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; import scala.Tuple2; import org.apache.spark.api.java.JavaDoubleRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.Function; import org.apache.spark.mllib.linalg.Vectors; import org.apache.spark.mllib.regression.LabeledPoint; import org.apache.spark.mllib.regression.LinearRegressionModel; import org.apache.spark.mllib.regression.LinearRegressionWithSGD;public class LinearRegressionWithSGDDemo {public static void main(String[] args) {SparkConf conf = new SparkConf().setAppName("LinearRegressionWithSGDDemo");JavaSparkContext sc = new JavaSparkContext(conf);sc.setLogLevel("OFF");//關(guān)閉日志輸出,方便查看輸出結(jié)果// Load and parse the dataString path = "/tmp/lpsa.data";JavaRDD<String> data = sc.textFile(path);JavaRDD<LabeledPoint> parsedData = data.map(new Function<String, LabeledPoint>() {public LabeledPoint call(String line) {String[] parts = line.split(",");String[] features = parts[1].split(" ");double[] v = new double[features.length];for (int i = 0; i < features.length - 1; i++) {v[i] = Double.parseDouble(features[i]);}//打印map結(jié)果System.out.println(Double.parseDouble(parts[0])+"|"+Vectors.dense(v));return new LabeledPoint(Double.parseDouble(parts[0]), Vectors.dense(v));}});parsedData.cache();// Building the modelint numIterations = 100;double stepSize = 0.00000001;final LinearRegressionModel model =LinearRegressionWithSGD.train(JavaRDD.toRDD(parsedData), numIterations, stepSize);// Evaluate model on training examples and compute training errorJavaRDD<Tuple2<Double, Double>> valuesAndPreds = parsedData.map(new Function<LabeledPoint, Tuple2<Double, Double>>() {public Tuple2<Double, Double> call(LabeledPoint point) {double prediction = model.predict(point.features());//打印預(yù)測(cè)結(jié)果System.out.println(prediction+"|"+point.label());return new Tuple2<>(prediction, point.label());}});double MSE = new JavaDoubleRDD(valuesAndPreds.map(new Function<Tuple2<Double, Double>, Object>() {public Object call(Tuple2<Double, Double> pair) {//打印偏差結(jié)果System.out.println(pair._1()+":"+pair._2()+"|"+Math.pow(pair._1() - pair._2(), 2.0));return Math.pow(pair._1() - pair._2(), 2.0);}}).rdd()).mean();System.out.println("training Mean Squared Error = " + MSE);// Save and load modelmodel.save(sc.sc(), "/tmp/LinearRegressionWithSGDModel");LinearRegressionModel sameModel = LinearRegressionModel.load(sc.sc(), "/tmp/LinearRegressionWithSGDModel");sc.stop();} } /*執(zhí)行結(jié)果:* training Mean Squared Error = 7.451032827699878*/ 3、測(cè)試數(shù)據(jù),在/spark-2.0.1-bin-hadoop2.7/data/mllib/ridge-data/lpsa.data總結(jié)
以上是生活随笔為你收集整理的离线轻量级大数据平台Spark之MLib机器学习库线性回归实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 离线轻量级大数据平台Spark之MLib
- 下一篇: 离线轻量级大数据平台Spark之MLib