我已经使用PySpark训练了一个模型,并想将其性能与现有启发式算法进行比较。
我只想对系数为0.1、0.5和0.7的LR模型进行硬编码,对测试数据调用.transform
以获取预测并计算精度。
如何对模型进行硬编码?
答案 0 :(得分:0)
不幸的是,无法仅设置pyspark LR模型的系数。 pyspark LR模型实际上是java ml模型的包装器(请参见类JavaEstimator
)。
因此,当LR模型适合时,它将参数从paramMap
传递到适合数据的新Java估计器。所有LogisticRegressionModel
方法/属性都只是使用_call_java
方法对java模型的调用。
由于系数不是参数(您可以在LR实例上使用explainParams
看到完整的列表),因此无法将其传递给创建的Java LR模型,并且没有setter方法
例如,对于逻辑回归模型lrm
,您可以看到唯一的设置方法是在实例化pyspark LR实例时可以设置的参数:lowerBoundsOnCoefficients
和upperBoundsOnCoefficients
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