SparkMLlib-LinearRegression性能测试

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。