【问题标题】:Replicate logistic regression model from pyspark in scikit-learn在 scikit-learn 中从 pyspark 复制逻辑回归模型
【发布时间】:2017-11-20 15:01:00
【问题描述】:

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

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

在我看来,两个模型实现(在 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`

参数 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")

非常感谢!

【问题讨论】:

  • 你能指出两个类之间不匹配的参数吗?虽然参数名称不同,但似乎是匹配的。
  • 例如,scikit 模型有一个名为“penalty”的参数,默认为“l2”。但是,我在 pyspark 模型实现中找不到相同的参数。另一个例子是 pyspark 模型中的参数“aggregationDepth”——它在 scikit 的实现中缺失
  • @frankyjuang 请查看我更新的问题,其中包含每个模型的参数列表
  • 对于 scikit 中的 penalty,在 pyspark 中设置 elasticNetParam 以匹配设置。而aggregationDepth 通常不会对结果产生影响。

标签: python machine-learning scikit-learn pyspark


【解决方案1】:

pyspark的LR使用ElasticNet正则化,是L1和L2项的加权和;重量是elasticNetParam。所以elasticNetParam=0得到L2正则化,regParam是L2正则化系数; elasticNetParam=1 得到 L1 正则化,regParam 是 L1 正则化系数。 sklearn LogisticRegression 中的CregParam 的倒数,即regParam = 1/C

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

如果您需要 ElasticNet 正则化(即 0 SGDClassifier 中实现它 - 设置 loss='elasticnet'alpha 将类似于 regParam(并且您不必逆向它和 C) 一样,l1_ratio 将是 elasticNetParam

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

免责声明:我的 spark 经验为零,答案基于 sklearn 和 spark docs。

【讨论】:

  • 非常感谢,这很有帮助!你也知道如何照顾参数“aggregationDepth”吗?
  • AFAIK aggregationDepth 是 Spark 中使用的并行化方法的参数;它应该不会对质量产生太大影响(如果有的话?),但可能会对训练速度产生影响。
  • SGDClassifier(loss='log', pinch='elasticnet') 并调整alpha l1_ratio 并确保n_iter 在sklearn 0.18.2或更早版本中足够大。
【解决方案2】:

到目前为止,我发现如参数 standardization=True 所示,pyspark 确实标准化了模型中的数据,而 scikit 没有。在应用 scikit 模型之前实现preprocessing.scale给了我两个模型的匹配结果

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2017-03-31
    • 2018-12-01
    • 2019-04-11
    • 2016-02-21
    • 2015-04-27
    • 2016-07-31
    • 2018-03-01
    相关资源
    最近更新 更多