![](/img/trans.png)
[英]Date use in linear regression and conversion of date to numbers using 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.