GLM与Apache Spark 2.2.0 - Tweedie系列默认链接值

时间:2017-10-25 08:39:57

标签: apache-spark pyspark tweedie

我正在使用带有python的spark 2.2.0。我试图弄清楚在Tweedie家族的情况下,GeneralizedLineraModel中Spark接受的链接函数的默认参数是什么。

当我查看文档https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.ml.regression.GeneralizedLinearRegression

class pyspark.ml.regression.GeneralizedLinearRegression(self, labelCol="label", featuresCol="features", predictionCol="prediction", family="gaussian", link=None, fitIntercept=True, maxIter=25, tol=1e-6, regParam=0.0, weightCol=None, solver="irls", linkPredictionCol=None

似乎家庭=' tweedie'应该是None但是当我尝试这个时(通过使用类似的测试作为单元测试:https://github.com/apache/spark/pull/17146/files/fe1d3ae36314e385990f024bca94ab1e416476f2):

from pyspark.ml.linalg import Vectors
df = spark.createDataFrame([(1.0, Vectors.dense(0.0, 0.0)),\
     (1.0, Vectors.dense(1.0, 2.0)),\
     (2.0, Vectors.dense(0.0, 0.0)),\
     (2.0, Vectors.dense(1.0, 1.0)),], ["label", "features"])
glr = GeneralizedLinearRegression(family="tweedie",variancePower=1.42,link=None)
model = glr.fit(df)
transformed = model.transform(df)

它提出了Null pointer Java exception ...

  

Py4JJavaError:调用o6739.w时发生错误。 :   java.lang.NullPointerException ...

当我在模型的初始化中删除explicite link = None时,它运行良好。

from pyspark.ml.linalg import Vectors
df = spark.createDataFrame([(1.0, Vectors.dense(0.0, 0.0)),\
     (1.0, Vectors.dense(1.0, 2.0)),\
     (2.0, Vectors.dense(0.0, 0.0)),\
     (2.0, Vectors.dense(1.0, 1.0)),], ["label", "features"])
glr = GeneralizedLinearRegression(family="tweedie",variancePower=1.42)
model = glr.fit(df)
transformed = model.transform(df)

我希望能够通过一套标准的参数,如

params={"family":"Onefamily","link":"OnelinkAccordingToFamily",..}

然后将GLM初始化为:

 glr = GeneralizedLinearRegression(family=params["family"],link=params['link]' ....)

因此它可能更标准,适用于家庭和链接的任何情况。 只是看起来在family = Tweedie的情况下不会忽略链接值,我知道应该使用什么默认值?我试过了link =''或链接='无'但它引发了无效的链接功能'。

1 个答案:

答案 0 :(得分:0)

要处理GLR tweedie系列,您需要定义通过" linkPower"指定的电源链接功能。参数,您不应该将link设置为None,这会导致您获得该异常。

以下是如何使用它的示例:

df = spark.createDataFrame(
        [(1.0, Vectors.dense(0.0, 0.0)),
         (1.0, Vectors.dense(1.0, 2.0)),
         (2.0, Vectors.dense(0.0, 0.0)),
         (2.0, Vectors.dense(1.0, 1.0)), ], ["label", "features"])

# in this case the default link power applies
glr = GeneralizedLinearRegression(family="tweedie", variancePower=1.6)

model = glr.fit(df) # in this case the default link power applies

model2 = glr.setLinkPower(-1.0).fit(df)

PS: tweedie系列中的默认链接功能为1 - variancePower