pyspark - 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 页面不允许错误报告或改进建议,他们的官方页面需要随附的源代码建议,这略高于我的技能!</ 咆哮>
解决方案
我相信 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)
推荐阅读
- go - 无法通过 SSH 安装 go 模块(私有嵌套存储库)
- hybris - Hybris 生产支持活动
- reporting-services - 对 ssrs 中包含数字和字符串的 nvarchar 列进行排序
- ios - Vision Kit - 提取字典中的图像数据 - iOS
- apache-kafka - Kafka 内部主题:内部主题在哪里创建 - 源代理还是目标代理?
- html - 重新定位图像,然后在屏幕变小时缩小它,没有媒体查询
- laravel - Laravel url方法发布不指向项目文件夹?
- c# - 在 VSTO C# 中获取名字和姓氏
- cmake - 如何识别开源项目二进制文件中实现的代码位置?
- openapi - FastAPI 中不同的 OpenAPI 模式取决于环境