在 scikit-learn 中从 pyspark 复制逻辑回归模型

Aar*_*nDT 4 python machine-learning scikit-learn pyspark

问题: pyspark 和 scikit-learn 中逻辑回归模型的默认实现(未设置自定义参数)在给定默认参数值的情况下似乎会产生不同的结果。

我正在尝试复制使用 pypark 执行的逻辑回归(未设置自定义参数)的结果(请参阅:https ://spark.apache.org/docs/latest/api/python/pyspark.ml.html#pyspark.ml 。 classification.LogisticRegression)从逻辑回归模型scikit学习(见:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)。

在我看来,两个模型实现(在 pyspark 和 scikit 中)不具有相同的参数,所以我不能简单地匹配 scikit 中的参数以适应 pyspark 中的参数。有没有关于如何在默认配置上匹配两个模型的解决方案?

参数 Scikit 模型(默认参数):

`LogisticRegression(
C=1.0, 
class_weight=None, 
dual=False, 
fit_intercept=True,
intercept_scaling=1, 
max_iter=100, 
multi_class='ovr', 
n_jobs=1,
penalty='l2', 
random_state=None, 
solver='liblinear', 
tol=0.0001,
verbose=0, 
warm_start=False`
Run Code Online (Sandbox Code Playgroud)

参数 Pyspark 模型(默认参数):

LogisticRegression(self, 
featuresCol="features", 
labelCol="label", 
predictionCol="prediction", 
maxIter=100,
regParam=0.0, 
elasticNetParam=0.0, 
tol=1e-6, 
fitIntercept=True, 
threshold=0.5, 
thresholds=None, 
probabilityCol="probability", 
rawPredictionCol="rawPrediction", 
standardization=True, 
weightCol=None, 
aggregationDepth=2, 
family="auto")
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Aar*_*nDT 5

到目前为止,我发现正如参数所示,standardization=Truepyspark 确实标准化了模型内的数据,而 scikit 则没有。在应用 scikit 模型之前实现,preprocessing.scale这两个模型的结果非常接近


Mik*_*bov 5

pyspark 的 LR 使用 ElasticNet 正则化,即 L1 和 L2 项的加权和;重量是elasticNetParam. 所以有了elasticNetParam=0你得到L2正则化,regParam就是L2正则化系数;随着elasticNetParam=1你得到 L1 正则化,并且regParam是 L1 正则化系数。C在 sklearn LogisticRegression 中是 的倒数regParam,即regParam = 1/C

另外,默认的训练方法不同;您可能需要在 sklearn LogisticRegression 中设置 solver='lbfgs' 以使训练方法更加相似。不过它只适用于 L2。

如果您需要 ElasticNet 正则化(即 0 < elasticNetParam < 1),那么 sklearn 在SGDClassifier - set 中实现它loss='elasticnet'alpha将类似于regParam(并且您不必像 C 一样反转它),并且l1_ratio将是elasticNetParam.

sklearn 不直接提供阈值,但您可以使用 predict_proba 代替 predict,然后自己应用阈值。

免责声明:我的火花体验为零,答案基于 sklearn 和 spark 文档。