Apache-Spark 的 GBT 和 sklearn 的 AUC 差异

Posted

技术标签:

【中文标题】Apache-Spark 的 GBT 和 sklearn 的 AUC 差异【英文标题】:Difference in AUCs b/w Apache-Spark's GBT and sklearn 【发布时间】:2015-12-10 09:13:42 【问题描述】:

我在 Python 的 sklearn 以及 Spark 的本地独立 MLlib 实现中尝试了 GBDT,并使用了二进制分类问题的默认设置。 在这两种情况下,我都保持 numIterations 和损失函数相同。这些特征都是真正有价值的并且是连续的。 但是,与 sklearn 相比,MLLib 实现中的 AUC 相差甚远。 这些是 sklearn 分类器的参数:

GradientBoostingClassifier(
    init=None, learning_rate=0.001, loss='deviance',max_depth=8,
    max_features=None, max_leaf_nodes=None, min_samples_leaf=1, 
    min_samples_split=2, min_weight_fraction_leaf=0.0, 
    n_estimators=100, random_state=None, subsample=1.0, 
    verbose=0, warm_start=False) 

我想检查是否有办法在 MLlib 中计算和设置这些参数,或者 MLlib 是否也采用相同的设置(非常标准)。

任何指出差异的指针都会有所帮助。

【问题讨论】:

【参考方案1】:

scikit-learn 和 Spark MLlib 之间的可自定义参数集和默认值都不同。特别是 Spark 中的默认学习读取为 0.1,最大深度为 3。

更重要的是实现合理缩放所需的算法变化。可能最重要的是对连续变量进行分箱。因此,即使输入参数乍一看或多或少相同,您也不太可能获得相同的结果。

另请参阅:Scalable Distributed Decision Trees in Spark MLLib。

【讨论】:

感谢@zero323。我在两者中都设置了相同的 maxDepth。但是分箱是我不知道火花正在做的事情。我的印象是 GBDT 使用回归树,除非指定,否则不会使用分箱。有没有办法在 Spark 中设置/更改这些参数,比如关闭分箱。 分箱是可定制的,但不能真正关闭。您可以将其设置为大于样本数的数字,但这是一个相当糟糕的主意。 我同意。但是,我想知道 MLLib 团队如何进行基准测试并与一些现有库进行比较?虽然,它可能是特定于数据的,但我看到使用 MLLib 的 RoC AUC 从 scikit-learn 的 0.67 下降到 0.53,其中每个特征都是实值。

以上是关于Apache-Spark 的 GBT 和 sklearn 的 AUC 差异的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache-Spark 到 Redshift 的 MongoDB 数据管道

通过 Apache-Spark 从 AWS S3 加载数据

如何获取有关当前执行程序 Apache-Spark 的元数据?

GBT22239-2019等保2.0三级要求

如何在 Apache-Spark 2.x 中使用 java 进行增量序列

pyspark GBT