pyspark如何使用log作为链接函数来拟合GLM,权重之和为零

时间:2018-03-30 03:18:13

标签: apache-spark pyspark glm

我试图为我的回归模型试验不同的GLM链接函数。当我尝试使用log或inverse的链接功能时,我收到以下错误:

有没有办法使用伽马或高斯来指定权重和为零的glm的拟合?

An error occurred while calling o1677.fit.
: java.lang.AssertionError: assertion failed: Sum of weights cannot be zero.
    at scala.Predef$.assert(Predef.scala:170)
    at org.apache.spark.ml.optim.WeightedLeastSquares$Aggregator.validate(WeightedLeastSquares.scala:418)
    at org.apache.spark.ml.optim.WeightedLeastSquares.fit(WeightedLeastSquares.scala:101)
    at org.apache.spark.ml.optim.IterativelyReweightedLeastSquares.fit(IterativelyReweightedLeastSquares.scala:86)

这是我的代码

def fit_GLM_Log(training,testing):
    from pyspark.ml.regression import GeneralizedLinearRegression
    training.cache()
    glr = GeneralizedLinearRegression(featuresCol = 'features',labelCol = 'STOP_START_TIME',\
                                      family="gaussian", link="log"\
                                      ,maxIter=10, regParam=0.3)

    glr_model = glr.fit(training)
    testing.cache()

    # Print the coefficients and intercept for generalized linear regression model
    print("Coefficients: " + str(glr_model.coefficients))
    print("Intercept: " + str(glr_model.intercept))

    # Summarize the model over the training set and print out some metrics
    summary = glr_model.summary
    print("Coefficient Standard Errors: " + str(summary.coefficientStandardErrors))
    print("T Values: " + str(summary.tValues))
    print("P Values: " + str(summary.pValues))
    print("Dispersion: " + str(summary.dispersion))
    print("Null Deviance: " + str(summary.nullDeviance))
    print("Residual Degree Of Freedom Null: " + str(summary.residualDegreeOfFreedomNull))
    print("Deviance: " + str(summary.deviance))
    print("Residual Degree Of Freedom: " + str(summary.residualDegreeOfFreedom))
    print("AIC: " + str(summary.aic))
    print("Deviance Residuals: ")
    summary.residuals().show()

    prediction_result = glr_model.transform(testing)

    return prediction_result

我现在正在使用PySpark并运行Spark 2.2。 我搜索了apache网站,我没有看到任何关于如何解决这个问题的建议

3 个答案:

答案 0 :(得分:0)

我有同样的错误,这就是我解决它的方式。我的数据中的一些观察结果在因变量,自变量或权重中都缺少值。我删除了这些观察结果并且有效。 SAS似乎在拟合期间放弃了这些观察结果,但是GeneralizedLinearRegression似乎在使用它之前没有检查数据。原来,它与重量无关。希望有所帮助。

答案 1 :(得分:0)

我的数据中没有任何空值,我有完全相同的错误。我必须缩放我的因变量(在我的情况下除以1000)。显然,如果权重矩阵变得太小,求解器会崩溃,因为算法的一部分要乘以权重矩阵的倒数,这相当于除以零。

答案 2 :(得分:0)

当我对数据使用明显且不合适的GLM(family = Gamma和link = log)时,这也发生在我身上。数据的尾巴可能太长,因为剪掉尾巴(将这些值作为异常值进行处理)很有帮助。另外,将GLM更改为family = gaussian和link = log也很有帮助。因此,请尝试调查数据并尝试使用不同类型的GLM。