在Spark ML中创建自定义交叉验证

7
我是Spark和PySpark数据框架和ML的新手。如何为ML库创建自定义交叉验证?例如,我想改变训练折叠形成的方式,例如分层拆分。这是我的当前代码。
numFolds = 10
predictions = []

lr = LogisticRegression()\
     .setFeaturesCol("features")\
     .setLabelCol('label')

# Grid search on LR model
lrparamGrid = ParamGridBuilder()\
     .addGrid(lr.regParam, [0.01, 0.1, 0.5, 1.0, 2.0])\
     .addGrid(lr.elasticNetParam, [0.0, 0.1, 0.5, 0.8, 1.0])\
     .addGrid(lr.maxIter, [5, 10, 20])\
     .build()

pipelineModel = Pipeline(stages=[lr])
evaluator = BinaryClassificationEvaluator()

cv = CrossValidator()\
     .setEstimator(pipelineModel)\
     .setEvaluator(evaluator)\
     .setEstimatorParamMaps(lrparamGrid).setNumFolds(5)

# My own Cross-Validation with stratified splits
for i in range(numFolds):
     # Use Stratified indexOfStratifiedSplits
     trainingData = df[df.ID.isin(indexOfStratifiedSplits[i][0])]
     testingData = df[df.ID.isin(indexOfStratifiedSplits[i][1])]

# Training and Grid Search
cvModel = cv.fit(trainingData)
predictions.append(cvModel.transform(testingData))

我希望有一个交叉验证类,可以这样调用。
cv = MyCrossValidator()\
     .setEstimator(pipelineModel)\
     .setEvaluator(evaluator)\
     .setEstimatorParamMaps(lrparamGrid).setNumFolds(5)\
     # Option 1
     .setSplitIndexes(indexOfStratifiedSplits)
     # Option 2
     .setSplitType("Stratified",ColumnName)

我不知道最好的选择是创建一个扩展CrossValidation.fitPassing Functions to Spark的类。对于我这个新手来说,两种选择都很具有挑战性。我尝试复制GitHub代码,但我遇到了大量错误,特别是我不会说Scala,但是在Scala API中,这个管道更快。

虽然我有自己的函数来按照我想要的方式拆分数据(基于sklearn),但我想使用Pipelines、网格搜索和cv,以便所有排列组合都是分布式而不是在主节点上执行。那个带有“我的交叉验证”的循环只使用了一部分集群节点,因为循环发生在主/驱动程序中。

任何Python或Scala API都可以,但首选Scala。

谢谢

2个回答

2
在Python中,Sklearn为您提供了sklearn.cross_validation.StratifiedKFold函数。您可以使用Sparkit-learn,它旨在在PySpark上提供scikit-learn功能和API。

1
如果您想在PySpark中使用分层交叉验证器,可以使用spark-stratifier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接