我希望熟悉Spark的人可以给我一个"肠道检查"关于我是否可能滥用SparkML框架,或者考虑到上下文(#rows,#feature),我所看到的表现是否可以理解。
简单地说,我有一个相当宽的小数据集(~150行)(~180个特征)。我已经在Spark和Scikit-learn中编写了类似的Lasso训练代码,这导致相同的模型(相同的模型系数和LOOCVE)。但是,Spark代码大约需要100倍(sklearn需要大约5秒,接近600秒。
据我所知,Spark针对大型分布式数据集进行了优化,并且这种差异可以合理地归因于数据并行性会隐藏的开销延迟,但这仍然感觉非常迟缓。
火花代码基本上是:
//... code to add a number of PipelineStages to a List<PipelineStage> (~90 UnaryTransformer stages), ending in a StandardScaler
// Add Lasso model
LinearRegression lasso = new LinearRegression()
.setLabelCol(response)
.setFeaturesCol("normed_features")
.setMaxIter(100000)
.setPredictionCol(response+"_prediction")
.setElasticNetParam(1.0)
.setFitIntercept(true)
.setRegParam(0.2);
// stages is the List<PipelineStage> loaded with 90 or so UnaryTransformer steps
stages.add(lasso);
Pipeline pipeline = new Pipeline(stages);
DataFrame df = getTrainingData(trainingData, response);
RegressionEvaluator evaluator = new RegressionEvaluator()
.setLabelCol(response)
.setMetricName("mae")
.setPredictionCol(response+"_prediction")
);
df.cache();
ParamMap[] paramGrid = new ParamGridBuilder().build();
CrossValidator cv = new CrossValidator()
.setEstimator(pipeline)
.setEvaluator(evaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(20);
double cve = cv.fit(df).avgMetrics()[0];
Python代码使用与#folds(20)相同的Lasso和GridSearchCV。
不幸的是,我无法提供MWE,因为我们使用的是我必须粘贴的自定义变压器,但我想知道是否有人会愿意权衡sklearn和spark之间的运行时差异是否意味着用户错误。我有意应用的唯一好方法是在安装CrossValidator之前缓存训练DataFrame。