对火花逻辑回归模型进行硬编码



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

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

如何对模型进行硬编码?

不幸的是,不可能只设置 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的评论,使用标准逻辑函数计算结果可能会更容易。

您可以设置 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)

瞧!你有你的模型。

然后,您可以在模型上调用 fit & Transform-

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

最新更新