har*_*bcn 7 python scala apache-spark apache-spark-mllib
我是Spark和PySpark Data Frames和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))
Run Code Online (Sandbox Code Playgroud)
我希望像这样调用一个Cross-Validation类
cv = MyCrossValidator()\
.setEstimator(pipelineModel)\
.setEvaluator(evaluator)\
.setEstimatorParamMaps(lrparamGrid).setNumFolds(5)\
# Option 1
.setSplitIndexes(indexOfStratifiedSplits)
# Option 2
.setSplitType("Stratified",ColumnName)
Run Code Online (Sandbox Code Playgroud)
我不知道最好的选择是创建一个扩展CrossValidation.fit或将函数传递给Spark的类.这两个选项对我来说都是一个挑战,因为新手,我尝试复制GitHub代码,但我遇到了大量错误,特别是我不会说Scala,但这个管道在Scala API中更快.
虽然我有自己的功能以我想要的方式分割数据(基于sklearn),但我想一起使用Pipelines,grid search和cv,这样所有的排列都是分布式的,而不是在master中执行.具有"我自己的交叉验证"的循环仅使用部分群集节点,因为循环发生在主/驱动程序中.
任何Python或Scala API都可以,但更好的是Scala.
谢谢
在Python中,Sklearn为您提供了该sklearn.cross_validation.StratifiedKFold功能。您可以使用Sparkit-learn ,它旨在在 PySpark 上提供 scikit-learn 功能和 API。
| 归档时间: |
|
| 查看次数: |
1634 次 |
| 最近记录: |