У нас есть ситуация, когда мы должны запускать линейную регрессию на миллионах небольших наборов данных и хранить вес и перехват для каждого из этих наборов данных. Я написал ниже код scala для этого, в котором я подавал каждый из этих наборов данных в виде строки в RDD, а затем я пытаюсь запустить регрессию на каждом (данные - это RDD, который имеет (метки, функции), хранящиеся в нем в каждом строка, в данном случае мы имеем одну особенность каждой этикетке):Линейная регрессия на Apache Spark
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 для ввода, и вложенные РДУ не поддерживаются в Спарк. Я выбрал этот подход, поскольку все эти наборы данных могут запускаться независимо друг от друга, и поэтому я хотел их распространять (следовательно, исключался цикл). Можете ли вы предложить, если я могу использовать другие типы (массивы, списки и т. Д.) Для ввода в качестве набора данных в LinearRegressionWithSGD или даже лучший подход, который по-прежнему будет распространять такие вычисления в Spark?
Вы имеете в виду, что каждый небольшой набор данных можно обрабатывать на одной машине? Если это так, вы можете использовать некоторую библиотеку линейной регрессии для выполнения работы поезда в функции карты. 'LinearRegressionWithSGD' используется для обучения большому набору данных. – zsxwing
Спасибо. это то, о чем я думал. И чтобы ответить на ваш вопрос, каждый набор данных действительно очень маленький (может быть, пара сотен килограммов). Я буду использовать независимую библиотеку для выполнения регрессии здесь. –