【发布时间】: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