【问题标题】:Linear Regression on Apache SparkApache Spark 上的线性回归
【发布时间】:2015-01-08 09:29:03
【问题描述】:

我们有一种情况,我们必须对数百万个小型数据集运行线性回归,并存储每个数据集的权重和截距。我编写了下面的 scala 代码来执行此操作,其中我将这些数据集中的每一个作为 RDD 中的一行提供,然后我尝试对每个数据集运行回归(数据是 RDD,其中存储了(标签,特征)在每个行,在这种情况下,每个标签都有一个特征):

val x = data.flatMap { line => line.split(' ')}.map { line =>
  val parts = line.split(',')
  val parsedData1 = LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))
  val model = LinearRegressionWithSGD.train(sc.parallelize(List(parsedData1)),100)//using parallelize to convert data to type RDD
  (model.intercept,model.weights)
}

这里的问题是,LinearRegressionWithSGD 需要一个 RDD 作为输入,而 Spark 不支持嵌套的 RDD。我选择了这种方法,因为所有这些数据集都可以彼此独立运行,因此我想分发它们(因此,排除了循环)。 您能否建议我是否可以使用其他类型(数组、列表等)作为数据集输入到 LinearRegressionWithSGD,或者甚至是一种仍然可以在 Spark 中分配此类计算的更好方法?

【问题讨论】:

  • 你的意思是每个小数据集都可以在一台机器上处理吗?如果是这样,您可以使用一些线性回归库在地图函数中进行训练。 LinearRegressionWithSGD 用于训练一个大数据集。
  • 谢谢。那正是我所想。为了回答您的问题,每个数据集确实非常小(可能只有几百 kb)。这里我会使用一个独立的库来进行回归。

标签: apache-spark linear-regression apache-spark-mllib


【解决方案1】:
val modelList = for {item <- dataSet} yield {
    val data = MLUtils.loadLibSVMFile(context, item).cache()
    val model = LinearRegressionWithSGD.train(data)
    model
}

也许您可以将输入数据分成几个文件并存储在 HDFS 中。 使用这些文件的目录作为输入,您可以获得模型列表。

【讨论】:

    猜你喜欢
    • 2014-07-19
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多