首页 > 解决方案 > PySpark 中的分层交叉验证

问题描述

我在 python 中使用 Apache Spark API,PySpark(--version 3.0.0),并且由于我的数据高度不平衡,理想情况下希望以分层方式对我的标记数据执行交叉验证!我目前正在使用以下模块。

from pyspark.ml.tuning import CrossValidator

在 scikit-learn 中,这可以通过定义 aStratifiedKFold并将其放在cv任何网格搜索函数的参数中来实现。这确保了对给定估计器进行训练的每 K 折,以具有比例代表性的方式包含标记数据。

PySpark 中是否有类似的功能?

< rant> 我很想向 Spark 团队提出这个问题或作为改进建议,但他们的GitHub 页面不允许错误报告或改进建议,他们的官方页面需要随附的源代码建议,这略高于我的技能!</ 咆哮>

标签: pysparkapache-spark-ml

解决方案


我相信 Spark ML 目前不支持分层交叉验证。

不过,你可以看看spark-stratifier. 这是一个 Spark ML 分层交叉验证器组件,几年前由 HackerRank 开源 [1]。你可以看看那个。

它可以通过运行安装pip install spark-stratifier

一些示例代码可以帮助您:

from pyspark.ml import Pipeline
from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.ml.tuning import ParamGridBuilder
from pyspark.sql import SparkSession

from spark_stratifier import StratifiedCrossValidator

spark = SparkSession.builder.master("local").getOrCreate()

data = spark.createDataFrame([
    (1.0, Vectors.dense([0.0, 1.1, 0.1])),
    (0.0, Vectors.dense([2.0, 1.0, -1.0])),
    (0.0, Vectors.dense([2.0, 1.3, 1.0])),
    (1.0, Vectors.dense([0.0, 1.2, -0.5]))], ["label", "features"])

lr = LogisticRegression(maxIter=10)

pipeline = Pipeline(stages=[lr])

paramGrid = ParamGridBuilder() \
    .addGrid(lr.regParam, [0.1, 0.01]) \
    .build()

scv = StratifiedCrossValidator(
        estimator=pipeline,
        estimatorParamMaps=paramGrid,
        evaluator=BinaryClassificationEvaluator(),
        numFolds=2
      )

model = scv.fit(data)

[1]:https ://github.com/interviewstreet/spark-stratifier


推荐阅读