Линейная регрессия в Apache Spark

У нас есть ситуация, когда нам нужно запустить линейную регрессию для миллионов небольших наборов данных и сохранить веса и перехват для каждого из этих наборов данных. Для этого я написал приведенный ниже код scala, в котором я передал каждый из этих наборов данных в виде строки в RDD, а затем попытался запустить регрессию для каждого (данные - это RDD, в котором хранятся (метки, функции) в каждом row, в этом случае у нас есть одна функция на метку):

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, а вложенные RDD не поддерживаются в Spark. Я выбрал этот подход, поскольку все эти наборы данных можно запускать независимо друг от друга, и, следовательно, я хотел их распространять (следовательно, исключая зацикливание). Не могли бы вы предложить, могу ли я использовать другие типы (массивы, списки и т. д.) для ввода в качестве набора данных в LinearRegressionWithSGD или даже лучший подход, который по-прежнему будет распределять такие вычисления в Spark?


person Srinivasa Mathkur    schedule 11.11.2014    source источник
comment
Вы имеете в виду, что каждый небольшой набор данных может обрабатываться на одной машине? Если это так, вы можете использовать некоторую библиотеку линейной регрессии, чтобы выполнить работу поезда в функции карты. LinearRegressionWithSGD используется для обучения большого набора данных.   -  person zsxwing    schedule 12.11.2014
comment
Спасибо. это то, о чем я думал. И чтобы ответить на ваш вопрос, каждый набор данных действительно очень мал (может быть, пара сотен КБ). Здесь я буду использовать независимую библиотеку для выполнения регрессии.   -  person Srinivasa Mathkur    schedule 13.11.2014


Ответы (1)


val modelList = for {item <- dataSet} yield {
    val data = MLUtils.loadLibSVMFile(context, item).cache()
    val model = LinearRegressionWithSGD.train(data)
    model
}

Возможно, вы можете разделить свои входные данные на несколько файлов и сохранить их в HDFS. Используйте каталог этих файлов в качестве входных данных, вы можете получить список моделей.

person Wilson Liao    schedule 25.01.2015