LinearRegression性能测试
大家好,我是一拳就能打爆A柱的猛男
MLlib中的批式机器学习算法LinearRegression也是典型的回归算法,常用于解决回归问题,接上篇
《SparkMLlib-LogisticRegression性能测试》
的内容我们已经了解的回归算法的正则化、评价指标等问题,接下来做线性回归的性能测试就比较干脆了,接下来我直接带一个案例给大家:
1、 LinearRegression案例
还是因为没有数据的原因,还是选择使用官方提供的数据集。
数据集:
sample_linear_regression_data.txt
同样的,我分别对L1、L2、ElasticNet三种正则化方式和RMSE和R2进行组合测试:
import org.apache.spark.ml.regression.{LinearRegression, LinearRegressionModel, LinearRegressionTrainingSummary}
import org.apache.spark.sql.{DataFrame, SparkSession}
object LinearRegressionDemo {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession
.builder
.appName("LinearRegressionWithElasticNetDemo")
.getOrCreate()
val training: DataFrame = spark.read.format("libsvm").load("path\\sample_linear_regression_data.txt")
val L1: LinearRegression = new LinearRegression()
.setMaxIter(10)
.setRegParam(0.3)
.setElasticNetParam(1.0)
val L2: LinearRegression = new LinearRegression()
.setMaxIter(10)
.setRegParam(0.3)
.setElasticNetParam(0.0)
val ElasticNet: LinearRegression = new LinearRegression()
.setMaxIter(10)
.setRegParam(0.3)
.setElasticNetParam(0.8)
val L1Model: LinearRegressionModel = L1.fit(training)
val L2Model: LinearRegressionModel = L2.fit(training)
val ElasticNetModel: LinearRegressionModel = ElasticNet.fit(training)
val summaryL1: LinearRegressionTrainingSummary = L1Model.summary
val summaryL2: LinearRegressionTrainingSummary = L2Model.summary
val summaryElasticNet: LinearRegressionTrainingSummary = ElasticNetModel.summary
println(s"L1-RMSE :${summaryL1.rootMeanSquaredError}")
println(s"L1-r2 :${summaryL1.r2}")
println(s"L2-RMSE :${summaryL2.rootMeanSquaredError}")
println(s"L2-r2 :${summaryL2.r2}")
println(s"ElasticNet-RMSE :${summaryElasticNet.rootMeanSquaredError}")
println(s"ElasticNet-r2 :${summaryElasticNet.r2}")
spark.stop()
}
}
控制台输出:
L1-RMSE :10.201321239874094
L1-r2 :0.020511628316274955
L2-RMSE :10.163223095528005
L2-r2 :0.027814017194997764
ElasticNet-RMSE :10.189077167598475
ElasticNet-r2 :0.022861466913958184
整理成表格如下:
RMSE | R2 | |
---|---|---|
L1 | 10.201321239874094 | 0.020511628316274955 |
L2 | 10.163223095528005 | 0.027814017194997764 |
ElasticNet | 10.189077167598475 | 0.022861466913958184 |
经过几次反复的测试结果三种回归在这两个指标下都十分不理想,我认为应该是数据有问题。
注:
在批式的回归算法中还提供了一个Evaluator库,里面有RegressionEvaluator也是可以对数据进行计算的,下面代码手打没有进IDE各位辩证的看:
model.fit(trainingData)
val predictData = model.transform(trainingData)
val rmseEvaluator = new RegressionEvaluator.setMetricName("rmse")
val rmse = rmseEvaluator.evaluate(predictData)
差不多这样的,但是提供的指标都差不多,在这里我甚至觉得Spark的继承树有点乱了,因为在流式计算中某些算法是提供测试方法,而有一些是没有提供的。而且有的批式算法提供了指标,而且又提供了单独的估计器。
总结
若看过逻辑回归那一篇的同学可以发现都差不多,在这里我建议各位去翻一翻源码,看看继承树、每个类的实现什么的。
版权声明:本文为Alian_W原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。