SparkMLlib分類算法之邏輯回歸算法
(一),邏輯回歸算法的概念(參考網址:http://blog.csdn.net/sinat_33761963/article/details/51693836)
邏輯回歸與線性回歸類似,但它不屬於回歸分析家族(主要為二分類),而屬於分類家族,差異主要在於變量不同,因此其解法與生成曲線也不盡相同。邏輯回歸是無監督學習的一個重要算法,對某些數據與事物的歸屬(分到哪個類別)及可能性(分到某一類別的概率)進行評估。

(二),SparkMLlib邏輯回歸應用
1,數據集的選擇:http://www.kaggle.com/c/stumbleupon/data 中的(train.txt和test.txt)
2,數據集描述:關於涉及網頁中推薦的頁面是短暫(短暫存在,很快就不流行了)還是長久(長時間流行)的分類
3,數據預處理及獲取訓練集和測試集
val orig_file=sc.textFile("train_nohead.tsv")
//println(orig_file.first())
val data_file=orig_file.map(_.split("\t")).map{
r =>
val trimmed =r.map(_.replace("\"",""))
val lable=trimmed(r.length-1).toDouble
val feature=trimmed.slice(4,r.length-1).map(d => if(d=="?")0.0
else d.toDouble)
LabeledPoint(lable,Vectors.dense(feature))
}.randomSplit(Array(0.7,0.3),11L)
val data_train=data_file(0)//訓練集
val data_test=data_file(1)//測試集
4,邏輯回歸模型訓練及模型評價
val model_log=new LogisticRegressionWithLBFGS().setNumClasses(2).run(data_train) /* 有兩種最優化算法可以求解邏輯回歸問題並求出最優參數:mini-batch gradient descent(梯度下降法),L-BFGS法。我們更推薦使用L-BFGS,因為它能更快聚合,而且現在spark2.1.0已經放棄LogisticRegressionWithLSGD()模式了*/ /*性能評估:使用精確度,PR曲線,AOC曲線*/ val predictionAndLabels=data_test.map(point => (model_log.predict(point.features),point.label) ) val metricsLG=new MulticlassMetrics(predictionAndLabels)//0.6079335793357934 val metrics=Seq(model_log).map{ model => val socreAndLabels=data_test.map { point => (model.predict(point.features), point.label) } val metrics=new BinaryClassificationMetrics(socreAndLabels) (model.getClass.getSimpleName,metrics.areaUnderPR(),metrics.areaUnderROC()) } val allMetrics = metrics allMetrics.foreach{ case (m, pr, roc) => println(f"$m, Area under PR: ${pr * 100.0}%2.4f%%, Area under ROC: ${roc * 100.0}%2.4f%%") } /*LogisticRegressionModel, Area under PR: 73.1104%, Area under ROC: 60.4200%*/
5,模型優化
特征標准化處理

val orig_file=sc.textFile("train_nohead.tsv")
//println(orig_file.first())
val data_file=orig_file.map(_.split("\t")).map{
r =>
val trimmed =r.map(_.replace("\"",""))
val lable=trimmed(r.length-1).toDouble
val feature=trimmed.slice(4,r.length-1).map(d => if(d=="?")0.0
else d.toDouble)
LabeledPoint(lable,Vectors.dense(feature))
}
/*特征標准化優化*/
val vectors=data_file.map(x =>x.features)
val rows=new RowMatrix(vectors)
println(rows.computeColumnSummaryStatistics().variance)//每列的方差
val scaler=new StandardScaler(withMean=true,withStd=true).fit(vectors)//標准化
val scaled_data=data_file.map(point => LabeledPoint(point.label,scaler.transform(point.features)))
.randomSplit(Array(0.7,0.3),11L)
val data_train=scaled_data(0)
val data_test=scaled_data(1)
/*訓練邏輯回歸模型*/
val model_log=new LogisticRegressionWithLBFGS().setNumClasses(2).run(data_train)
/*在使用模型做預測時,如何知道預測到底好不好呢?換句話說,應該知道怎么評估模型性能。
通常在二分類中使用的評估方法包括:預測正確率和錯誤率、准確率和召回率、准確率 召回率
曲線下方的面積、 ROC 曲線、 ROC 曲線下的面積和 F-Measure*/
val predictionAndLabels=data_test.map(point =>
(model_log.predict(point.features),point.label)
)
val metricsLG=new MulticlassMetrics(predictionAndLabels)//精確度:0.6236162361623616
val metrics=Seq(model_log).map{
model =>
val socreAndLabels=data_test.map {
point => (model.predict(point.features), point.label)
}
val metrics=new BinaryClassificationMetrics(socreAndLabels)
(model.getClass.getSimpleName,metrics.areaUnderPR(),metrics.areaUnderROC())
}
val allMetrics = metrics
allMetrics.foreach{ case (m, pr, roc) =>
println(f"$m, Area under PR: ${pr * 100.0}%2.4f%%, Area under ROC: ${roc * 100.0}%2.4f%%")
}
/*LogisticRegressionModel, Area under PR: 74.1103%, Area under ROC: 62.0064%*/
6,總結
1,如何能提高更明顯的精度。。。。。
2,對邏輯回歸的認識還不夠。。。。
