离线轻量级大数据平台Spark之MLib机器学习库线性回归实例
生活随笔
收集整理的這篇文章主要介紹了
离线轻量级大数据平台Spark之MLib机器学习库线性回归实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、線性回歸
線性回歸是利用稱為線性回歸方程的函數對一個或多個自變量和因變量之間關系進行建模的一種回歸分析方法,只有一個自變量的情況稱為簡單回歸,大于一個自變量情況的叫做多元回歸,在實際情況中大多數都是多元回歸。
線性回歸(Linear Regression)問題屬于監督學習(Supervised Learning)范疇,又稱分類(Classification)或歸納學習(Inductive Learning)。這類分析中訓練數據集中給出的數據類型是確定的。機器學習的目標是,對于給定的一個訓練數據集,通過不斷的分析和學習產生一個聯系屬性集合和類標集合的分類函數(Classification Function)或預測函數)Prediction Function),這個函數稱為分類模型(Classification Model——或預測模型(Prediction Model)。通過學習得到的模型可以是一個決策樹、規格集、貝葉斯模型或一個超平面。通過這個模型可以對輸入對象的特征向量預測或對對象的類標進行分類。回歸問題中通常使用最小二乘(Least Squares)法來迭代最優的特征中每個屬性的比重,通過損失函數(Loss Function)或錯誤函數(Error Function)定義來設置收斂狀態,即作為梯度下降算法的逼近參數因子。
實例中給出了如何導入訓練集數據,將其解析為帶標簽點的RDD,然后使用了LinearRegressionWithSGD 算法來建立一個簡單的線性模型來預測標簽的值,最后計算了均方差來評估預測值與實際值的吻合度。
線性回歸分析的整個過程可以簡單描述為如下三個步驟:
? 尋找合適的預測函數,即上文中的 h(x) ,用來預測輸入數據的判斷結果。這個過程是非常關鍵的,需要對數據有一定的了解或分析,知道或者猜測預測函數的“大概”形式,比如是線性函數還是非線性函數,若是非線性的則無法用線性回歸來得出高質量的結果。
? 構造一個Loss函數(損失函數),該函數表示預測的輸出(h)與訓練數據標簽之間的偏差,可以是二者之間的差(h-y)或者是其他的形式(如平方差開方)。綜合考慮所有訓練數據的“損失”,將Loss求和或者求平均,記為 J(θ) 函數,表示所有訓練數據預測值與實際類別的偏差。
? 顯然, J(θ) 函數的值越小表示預測函數越準確(即h函數越準確),所以這一步需要做的是找到 J(θ) 函數的最小值。找函數的最小值有不同的方法,Spark中采用的是梯度下降法(stochastic gradient descent,SGD)。
2、Java開發
Java開發上,引入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包并提交執行。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");//關閉日志輸出,方便查看輸出結果// 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結果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());//打印預測結果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) {//打印偏差結果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();} } /*執行結果:* training Mean Squared Error = 7.451032827699878*/ 3、測試數據,在/spark-2.0.1-bin-hadoop2.7/data/mllib/ridge-data/lpsa.data總結
以上是生活随笔為你收集整理的离线轻量级大数据平台Spark之MLib机器学习库线性回归实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离线轻量级大数据平台Spark之MLib
- 下一篇: 离线轻量级大数据平台Spark之MLib