簡體   English   中英

Spark MLlib的線性回歸僅返回單調預測

[英]Linear regression with Spark MLlib only returns monotonic predictions

檢查問題底部的更新

摘要:我的數據集的行為不是線性的。 我正在嘗試使用Spark的MLlib(v1.5.2)來擬合一個表現為多項式函數的模型,但結果始終是線性模型。 我不知道是否不可能使用線性回歸來獲得非線性模型。

[TL; DR]我正在嘗試擬合一個表示以下數據的模型:

在此處輸入圖片說明

我的代碼非常簡單(幾乎像每個教程中一樣)

object LinearRegressionTest {

   def main(args: Array[String]): Unit = {
      val sc = new SparkContext("local[2]", "Linear Regression")
      val data = sc.textFile("data2.csv")
      val parsedData = data.map { line =>
         val parts = line.split(',')
         LabeledPoint(parts(1).toDouble, Vectors.dense(parts(2).toDouble))
       }.cache()

      val numIterations = 1000
      val stepSize = 0.001

      val model = LinearRegressionWithSGD.train(parsedData, numIterations, stepSize)
      sc.stop
   }
}

獲得的結果在正確的范圍內,但是它們始終在單調遞增的直線上。 我試圖繞過它,但是我無法弄清楚為什么沒有擬合出更好的曲線。

有小費嗎?

感謝大家

更新問題是由我們使用的spark和spark-ml庫的版本引起的。 出於某種原因,即使我提供了更多功能(輸入數據的平方或三次版本),版本1.5.2也無法擬合出更好的曲線。 升級到2.0.0版並從不贊成使用的LinearRegressionWithSGD切換到主要API(不是RDD API)的LinearRegression ,該算法將按預期運行。 使用這種新方法,模型可以擬合正確的曲線。

這里沒有什么意外的。 您使用表格的線性模型

Y = βx + ε

因此,擬合結果將始終形成一條穿過原點的線(與R不同,例如,默認情況下,Spark不適合截距),並且只要模型至少在一定程度上是合理的,它就應該增加以近似數據分布。

盡管詳細信息可能不在StackOverflow的主題上,但您應該從添加更多功能開始。 很明顯,這里的體面近似必須是二次方,因此讓我們逐步說明一下。 我們將從您的數據的大致估算開始:

y <- c(0.6, 0.6, 0.6, 0.6, 0.575, 0.55, 0.525, 0.475, 0.45, 0.40, 0.35, 0.30)
df <- data.frame(y=c(y, rev(y)), x=0:23)
plot(df$x, df$y)

在此處輸入圖片說明

在Spark中創建的模型或多或少等同於:

lm1 <- lm(y ~ x + 0, df)
lines(df$x, predict(lm1, df), col='red')

在此處輸入圖片說明

既然很明顯,通過谷底的模型是不好的,讓我們嘗試添加一個攔截器:

lm2 <- lm(y ~ x, df)
lines(df$x, predict(lm2, df), col='blue')

在此處輸入圖片說明

最后,我們知道我們需要一些非線性:

df$x2 <- df$x ** 2
lm3 <- lm(y ~ x + x2, df)
lines(df$x, predict(lm3, df), col='green')

在此處輸入圖片說明

帶走的消息是:

  • 在創建模型LinearRegressionModel時使用setIntercept(true)
  • 向模型添加一些非線性特征。

     val x = arts(2).toDouble LabeledPoint(parts(1).toDouble, Vectors.dense(x, x*x)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM