Spark" Small Data"

时间:2015-10-07 16:48:15

标签: java apache-spark apache-spark-sql

我希望熟悉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。

0 个答案:

没有答案