pyspark:为什么回归模型在单节点设置和多节点集群上给出不同的精度结果?

nzrxty8p  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(409)

下面的代码显示了我是如何创建模型管道的,在这里只有回归器发生了变化。我正在尝试使用随机林、线性回归和gbt模型,但是当在一台机器上执行时,它们都显示出不同的结果。在这两种设置中,所有默认设置都使用完全相同的emr群集配置。

def _create_training_pipeline(self, regressor_name, tuned_model=None):
    if tuned_model is None:
        tuned_model = {}
    stages = []
    for col in self._string_cols:
        indexer = StringIndexer() \
            .setInputCol(col) \
            .setHandleInvalid("skip") \
            .setOutputCol(col + "Index")
        stages += [indexer]

    for col in self._string_cols:
        encoder = OneHotEncoder() \
            .setInputCol(col + "Index") \
            .setOutputCol(col + "Vec")
        stages += [encoder]

    assembler = VectorAssembler() \
        .setInputCols([x + "Vec" for x in self._string_cols] + self._numerical_cols) \
        .setHandleInvalid("skip") \
        .setOutputCol("features")

    feature_indexer = VectorIndexer() \
        .setInputCol(assembler.getOutputCol()) \
        .setOutputCol("indexedFeatures") \
        .setHandleInvalid("skip") \
        .setMaxCategories(2)

    regressor = self._get_regressor(regressor_name, feature_indexer, tuned_model)

    stages += [assembler, feature_indexer, regressor]
    pipeline = Pipeline(stages=stages)
    return pipeline

def _get_regressor(self, regressor_name, feature_indexer, params_dict):
    if regressor_name == "RFR":
        return RandomForestRegressor() \
            .setSeed(100) \
            .setLabelCol(self._label_column) \
            .setFeaturesCol(feature_indexer.getOutputCol()) \
            .setMaxDepth(params_dict.get("maxDepth", 5)) \
            .setNumTrees(params_dict.get("numTrees", 10)) \
            .setMinInstancesPerNode(params_dict.get("minInstancesPerNode", 2))
    elif regressor_name == "LR":
        return LinearRegression() \
            .setLabelCol(self._label_column) \
            .setFeaturesCol(feature_indexer.getOutputCol()) \
            .setMaxIter(params_dict.get("maxIter", 10)) \
            .setEpsilon(params_dict.get("epsilon", 2)) \
            .setRegParam(params_dict.get("regParam", 0.5))
    else:
        return GBTRegressor() \
            .setSeed(100) \
            .setLabelCol(self._label_column) \
            .setFeaturesCol(feature_indexer.getOutputCol()) \
            .setMaxIter(params_dict.get("maxIter", 50)) \
            .setMaxDepth(params_dict.get("maxDepth", 10))

一个可能的问题可能是分布式训练与单节点训练(找不到源来备份)
为了确定这个观察结果,我已经做了20次这个测试。在我的本地计算机中,结果与单节点emr设置的结果相匹配。

azpvetkf

azpvetkf1#

firas abuzaid等人在“离散化误差分析”标题下讨论了分布式机器学习的权衡:
为了提高效率,通常将连续特征离散化为b离散单元。。。离散化启发式算法的结果是由离散的代表来逼近连续值,并且会对生成的决策树的统计性能产生不利影响。。。
yggdrasil:一个优化的大规模深层决策树训练系统。firas abuzaid、joseph bradley、feynman liang、andrew feng、lee yang、matei zaharia、ameet talwalkar
在单个节点/本地机器部署上不需要mllib用于分布式训练的这种描述/分块近似。因此,对于在单个节点上训练的模型,我希望得到的模型的统计性能比分布式情况更好。

相关问题