0

我試圖弄清楚爲什麼LinearRegressionWithSGD不適用於Spark的ParamGridBuilder。從火花文檔:PySpark中的ParamGridBuilder無法與LinearRegressionSGD配合使用

lr = LinearRegression(maxIter=10) 
paramGrid = ParamGridBuilder()\ 
.addGrid(lr.regParam, [0.1, 0.01]) \ 
.addGrid(lr.fitIntercept, [False, True])\ 
.addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0])\ 
.build() 

然而,改變LinearRegressionLinearRegressionWithSGD根本不起作用。隨後SGD參數也無法傳入(例如迭代或minibatchfraction)。

謝謝!

+0

對此答案有幫助嗎?如果是的話,請接受它 - 謝謝 – desertnaut

回答

1

那是因爲你正試圖從兩個不同的庫混合功能:LinearRegressionWithSGD來自pyspark.mllib(即舊的,RDD-based API),同時兼具LinearRegression & ParamGridBuilder來自pyspark.ml(新,dataframe-based API)。

事實上,在你引用(順便說一句,在未來這將是很好提供一個鏈接,太),你會發現行documentation的代碼片段之前的幾行:

from pyspark.ml.regression import LinearRegression 

LinearRegressionWithSGD您使用something like

from pyspark.mllib.regression import LabeledPoint, LinearRegressionWithSGD, LinearRegressionModel 

這兩個庫是不兼容pyspark.mllib將RDD的LabeledPoint作爲輸入,這與pyspark.ml中使用的數據幀不兼容;並且由於ParamGridBuilder是後者的一部分,因此它只能與數據幀一起使用,而不能與pyspark.mllib中包含的算法一起使用(請檢查上面提供的文檔鏈接)。

而且,記住,LinearRegressionWithSGD是Spark 2 deprecated

注意:在2.0.0棄用。使用ml.classification.LogisticRegression或LogisticRegressionWithLBFGS。

UPDATE:感謝以下@ rvisio的評論,我們現在知道,雖然undocumented,一個可實際使用pyspark.mlsolver='sgd'LinearRegression;這裏是一個簡短的例子adapted from the docs

spark.version 
# u'2.2.0' 

from pyspark.ml.linalg import Vectors 
from pyspark.ml.regression import LinearRegression 

df = spark.createDataFrame([ 
    (1.0, 2.0, Vectors.dense(1.0)), 
    (0.0, 2.0, Vectors.sparse(1, [], []))], ["label", "weight", "features"]) 
lr = LinearRegression(maxIter=5, regParam=0.0, solver="sgd", weightCol="weight") # solver='sgd' 
model = lr.fit(df) # works OK 
lr.getSolver() 
# 'sgd' 
+0

錯誤鏈接的棄用警告[棄用](http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=linearregressionwithsgd#pyspark.mllib。迴歸線性迴歸與SDG) 但它看起來像使用'LinearRegression'你可以設置'solver = sgd'並繼續從那裏工作,就好像你正在使用'LinearRegressionWithSGD'? – rvisio

+0

@rvisio 1)看不到你的觀點 - 我們的鏈接指針是相同的2)根據[源代碼](https://github.com/apache/spark/blob/master/mllib/src/main /階/組織/阿帕奇/火花/毫升/迴歸/線性迴歸。scala#L62)(文檔*無望無用*),'solver'唯一可接受的參數是''l-bfgs'',''normal''和'「auto'';你真的嘗試過'solver =「sgd」',它工作嗎? – desertnaut

+1

您的鏈接將我帶至LogisticRegression vs. LinearRegression(棄用註釋也引用Logistic)。只提到自原來的問題是與LinearRegression 我能夠做'newLR = LinearRegression(maxIter = 10,solver =「sgd」)'沒有錯誤,然後使用newLR構建一個ParamGrid,但尚未測試使用'CrossValidator'運行# – rvisio

相關問題