PySpark中的分层交叉验证



我在python、PySpark(--3.0.0版(中使用Apache Spark API,理想情况下,我希望以分层的方式对标记的数据进行交叉验证,因为我的数据非常不平衡!我目前正在使用以下模块。

from pyspark.ml.tuning import CrossValidator

在scikit中,通过定义StratifiedKFold并将其放置在任何网格搜索函数的cv自变量中,可以实现这一点。这确保了给定估计器训练的每个K倍都以比例代表的方式包含标记的数据。

PySpark中有类似的东西吗?

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

我认为Spark ML目前不支持分层交叉验证。

但是,您可以查看spark-stratifier。这是一个Spark ML分层交叉验证器组件,几年前由HackerBank开源[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

最新更新