对Spark Logistic回归模型进行硬编码

时间:2018-06-25 02:46:41

标签: apache-spark pyspark logistic-regression

我已经使用PySpark训练了一个模型,并想将其性能与现有启发式算法进行比较。

我只想对系数为0.1、0.5和0.7的LR模型进行硬编码,对测试数据调用.transform以获取预测并计算精度。

如何对模型进行硬编码?

2 个答案:

答案 0 :(得分:0)

不幸的是,无法仅设置pyspark LR模型的系数。 pyspark LR模型实际上是java ml模型的包装器(请参见类JavaEstimator)。

因此,当LR模型适合时,它将参数从paramMap传递到适合数据的新Java估计器。所有LogisticRegressionModel方法/属性都只是使用_call_java方法对java模型的调用。

由于系数不是参数(您可以在LR实例上使用explainParams看到完整的列表),因此无法将其传递给创建的Java LR模型,并且没有setter方法

例如,对于逻辑回归模型lrm,您可以看到唯一的设置方法是在实例化pyspark LR实例时可以设置的参数:lowerBoundsOnCoefficientsupperBoundsOnCoefficients

print([c for c in lmr._java_obj.__dir__() if "coefficient" in c.lower()])
# >>> ['coefficientMatrix', 'lowerBoundsOnCoefficients',
# 'org$apache$spark$ml$classification$LogisticRegressionParams$_setter_$lowerBoundsOnCoefficients_$eq',
# 'getLowerBoundsOnCoefficients',
# 'org$apache$spark$ml$classification$LogisticRegressionParams$_setter_$upperBoundsOnCoefficients_$eq',
# 'getUpperBoundsOnCoefficients', 'upperBoundsOnCoefficients', 'coefficients',
# 'org$apache$spark$ml$classification$LogisticRegressionModel$$_coefficients']

尝试设置“系数”属性会产生以下结果:

print(lmr.coefficients)
# >>> DenseVector([18.9303, -18.9303])
lmr.coefficients = [10, -10]
# >>> AttributeError: can't set attribute

因此,如果您希望能够提供系数,则必须滚动自己的pyspark变压器。只需按照@pault的注释使用标准logistic函数计算结果,可能会更容易。

答案 1 :(得分:0)

您可以设置LR模型系数的上下限。 在您完全知道自己想要什么的情况下,您可以将下限和上限系数设置为相同的数字,这就是您将获得相同的精确系数的原因。 您可以像这样将系数设置为密集矩阵-

    from pyspark.ml.linalg import Vectors,Matrices
    a=Matrices.dense(1, 3,[ 0.1,0.5,0.7])
    b=Matrices.dense(1, 3,[ 0.1,0.5,0.7])

并将它们作为超参数插入到模型中

    lr = LogisticRegression(featuresCol='features', labelCol='label', maxIter=10, 
     lowerBoundsOnCoefficients=a,\
     upperBoundsOnCoefficients=b, \
     threshold = 0.5)

瞧!你有你的模型。

然后您可以在模型上调用拟合和变换-

    best_mod=lr.fit(train)

   predict_train=best_mod.transform(train) # train data
   predict_test=best_mod.transform(test) # test data