Предсказание LinearRegression искры мл является константой для всех наблюдений - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь построить простую модель линейной регрессии в искре, используя scala.Чтобы проверить метод, я пытаюсь выполнить одну регрессивную регрессию, используя набор тестовых данных.мой набор данных выглядит следующим образом.

x - целые числа от 1 до 100
y - случайные значения, сгенерированные из Excel по формуле =RANDBETWEEN(-10,10)*RAND() + x_i

Я выполнил регрессию для этогонабор данных, используя библиотеку python sklearn, и это дает мне линию наилучшего соответствия (с r 2 = 0,98) для данных, как и ожидалось.

Однако, если я запускаю регрессию с использованием spark, мой прогнозимеет постоянное значение для всех значений x в наборе данных со значением r 2 2e-16.Почему этот код не дает мне наиболее подходящую линию в качестве прогноза?Что мне не хватает?

Вот код, который я использую

Код Python, который работает

x = np.array(df['x'])
y = np.array(df['x'])
x = x.reshape(-1,1)
y = y.reshape(-1,1)

clf = LinearRegression(normilize=True)
clf.fit(x,y)
y_predictions = clf.predict(x)
print(r2_score(y, y_predictions))

Вот график из регрессии Python.

Scala-код, который дает постоянный прогноз

val labelCol = "y"
val assembler = new VectorAssembler()
    .setInputCols(Array("x"))
    .setOutputCol("features")

val df2 = assembler.transform(df)

val labelIndexer = new StringIndexer().setInputCol(labelCol).setOutputCol("label")
val df3 = labelIndexer.fit(df2).transform(df2)

val regressor = new LinearRegression()
    .setMaxIter(10)
    .setRegParam(1.0)
    .setElasticNetParam(1.0)

val model = regressor.fit(df3)
val predictions = model.transform(df3)

val modelSummary = model.summary
println(s"r2 = ${modelSummary.r2}")

1 Ответ

0 голосов
/ 27 декабря 2018

Проблема заключалась в использовании stringIndexer, который не должен использоваться в числовых столбцах.В моем случае вместо использования stringIndxer я должен был просто переименовать столбец y в метку.Это решает проблему.

...