问题描述
我正在python的PySpark(--version 3.0.0)中使用Apache Spark API,并且理想情况下,我希望以分层的方式对我的标签数据进行交叉验证,因为我的数据高度不平衡!我目前正在使用以下模块。
from pyspark.ml.tuning import CrossValidator
在scikit-learn中,可以通过定义StratifiedKFold
并将其放在任何网格搜索功能的cv
自变量中来实现。这样可以确保对给定估计量进行K折训练,并以成比例的代表性方式包含标记数据。
PySpark是否有与此等效的东西?
解决方法
我相信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)