我在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