將Mahout on Spark 中的機器學習演算法和MLlib中支持的演算法統計如下: 主要針對MLlib進行總結 分類與回歸 分類和回歸是監督式學習; 監督式學習是指使用有標簽的數據(LabeledPoint)進行訓練,得到模型後,使用測試數據預測結果。其中標簽數據是指已知結果的特征數據。 分類和回 ...
將Mahout on Spark 中的機器學習演算法和MLlib中支持的演算法統計如下:
主要針對MLlib進行總結
分類與回歸
分類和回歸是監督式學習;
監督式學習是指使用有標簽的數據(LabeledPoint)進行訓練,得到模型後,使用測試數據預測結果。其中標簽數據是指已知結果的特征數據。
分類和回歸的區別:預測結果的變數類型
分類預測出來的變數是離散的(比如對郵件的分類,垃圾郵件和非垃圾郵件),對於二元分類的標簽是0和1,對於多元分類標簽範圍是0~C-1,C表示類別數目;
回歸預測出來的變數是連續的(比如根據年齡和體重預測身高)
線性回歸
線性回歸是回歸中最常用的方法之一,是指用特征的線性組合來預測輸出值。
線性回歸演算法可以使用的類有:
LinearRegressionWithSGD
RidgeRegressionWithSGD
LassoWithSGD
參數:
stepSize:梯度下降的步數
numIterations:迭代次數
設置intercept:是否給數據加上一個干擾特征或者偏差特征,一個始終值為1的特征,預設不增加false
{stepSize: 1.0, numIterations: 100, miniBatchFraction: 1.0}
模型的使用:
1、對數據進行預測,使用model.predict()
2、獲取數據特征的權重model.weights()
模型的評估:
均方誤差
例子:
import org.apache.spark.{SparkContext, SparkConf} import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.regression.LinearRegressionModel import org.apache.spark.mllib.regression.LinearRegressionWithSGD import org.apache.spark.mllib.linalg.Vectors /** * Created by Edward on 2016/9/21. */ object LinearRegression { def main(args: Array[String]) { val conf: SparkConf = new SparkConf().setAppName("LinearRegression").setMaster("local") val sc = new SparkContext(conf) // Load and parse the data val data = sc.textFile("data/mllib/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 model val numIterations = 100 val model = LinearRegressionWithSGD.train(parsedData, numIterations) // var lr = new LinearRegressionWithSGD().setIntercept(true) // val model = lr.run(parsedData) //獲取特征權重,及干擾特征 println("weights:%s, intercept:%s".format(model.weights,model.intercept)) // Evaluate model on training examples and compute training error val 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)}.mean() println("training Mean Squared Error = " + MSE) // Save and load model model.save(sc, "myModelPath") val sameModel = LinearRegressionModel.load(sc, "myModelPath") } }
數據:
-0.4307829,-1.63735562648104 -2.00621178480549 -1.86242597251066 -1.02470580167082 -0.522940888712441 -0.863171185425945 -1.04215728919298 -0.864466507337306 -0.1625189,-1.98898046126935 -0.722008756122123 -0.787896192088153 -1.02470580167082 -0.522940888712441 -0.863171185425945 -1.04215728919298 -0.864466507337306 -0.1625189,-1.57881887548545 -2.1887840293994 1.36116336875686 -1.02470580167082 -0.522940888712441 -0.863171185425945 0.342627053981254 -0.155348103855541 -0.1625189,-2.16691708463163 -0.807993896938655 -0.787896192088153 -1.02470580167082 -0.522940888712441 -0.863171185425945 -1.04215728919298 -0.864466507337306 0.3715636,-0.507874475300631 -0.458834049396776 -0.250631301876899 -1.02470580167082 -0.522940888712441 -0.863171185425945 -1.04215728919298 -0.864466507337306 0.7654678,-2.03612849966376 -0.933954647105133 -1.86242597251066 -1.02470580167082 -0.522940888712441 -0.863171185425945 -1.04215728919298 -0.864466507337306
...
數據第一列表示標簽數據,也就是結果數據,其他列表示特征數據;
預測就是再給一組特征數據,預測結果;
結果:
weights:[0.5808575763272221,0.18930001482946976,0.2803086929991066,0.1110834181777876,0.4010473965597895,-0.5603061626684255,-0.5804740464000981,0.8742741176970946], intercept:0.0
training Mean Squared Error = 6.207597210613579
持續更新中...