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)
非常感谢!
到目前为止,我发现正如参数所示,standardization=Truepyspark 确实标准化了模型内的数据,而 scikit 则没有。在应用 scikit 模型之前实现,preprocessing.scale这两个模型的结果非常接近
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 文档。
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |