微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PySpark中的分层交叉验证

如何解决PySpark中的分层交叉验证

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

from pyspark.ml.tuning import CrossValidator

在scikit-learn中,可以通过定义StratifiedKFold并将其放在任何网格搜索功能cv自变量中来实现。这样可以确保对给定估计量进行K折训练,并以成比例的代表性方式包含标记数据。

PySpark是否有与此等效的东西?

我很想向Spark团队问这个问题或作为改进建议,但他们的GitHub page不允许提供错误报告或改进建议,而他们的official page则需要随附源代码建议,这略高于我的技能!

解决方法

我相信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])),1.3,1.0])),(1.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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。