Pyspark - 获取使用 ParamGridBuilder 创建的模型的所有参数

2023-11-21

我正在使用 PySpark 2.0 参加 Kaggle 竞赛。我想知道模型的行为(RandomForest)取决于不同的参数。ParamGridBuilder()允许为单个参数指定不同的值,然后执行(我猜)整个参数集的笛卡尔积。假设我的DataFrame已经定义:

rdc = RandomForestClassifier()
pipeline = Pipeline(stages=STAGES + [rdc])
paramGrid = ParamGridBuilder().addGrid(rdc.maxDepth, [3, 10, 20])
                              .addGrid(rdc.minInfoGain, [0.01, 0.001])
                              .addGrid(rdc.numTrees, [5, 10, 20, 30])
                              .build()
evaluator = MulticlassClassificationEvaluator()
valid = TrainValidationSplit(estimator=pipeline,
                             estimatorParamMaps=paramGrid,
                             evaluator=evaluator,
                             trainRatio=0.50)
model = valid.fit(df)
result = model.bestModel.transform(df)

好的,现在我可以使用手工函数检索简单的信息:

def evaluate(result):
    predictionAndLabels = result.select("prediction", "label")
    metrics = ["f1","weightedPrecision","weightedRecall","accuracy"]
    for m in metrics:
        evaluator = MulticlassClassificationEvaluator(metricName=m)
        print(str(m) + ": " + str(evaluator.evaluate(predictionAndLabels)))

现在我想要几件事:

  • 最佳模型的参数是什么?这篇文章部分回答了这个问题:如何从 PySpark 中的 Spark.ml 中提取模型超参数?
  • 各个型号的参数是多少?
  • 每个模型的结果(又名召回率、准确性等)是什么?我只发现print(model.validationMetrics)显示(似乎)一个包含每个模型准确性的列表,但我无法知道要引用哪个模型。

如果我可以检索所有这些信息,我应该能够显示图形、条形图,并像使用 Panda 一样工作sklearn.


火花2.4+

SPARK-21088 CrossValidator、TrainValidationSplit 拟合时应收集所有模型- 添加了对收集子模型的支持。

默认情况下,此行为被禁用,但可以使用控制CollectSubModels Param (setCollectSubModels).

valid = TrainValidationSplit(
    estimator=pipeline,
    estimatorParamMaps=paramGrid,
    evaluator=evaluator,            
    collectSubModels=True)

model = valid.fit(df)

model.subModels

火花

长话短说,您根本无法获得所有模型的参数,因为,类似于CrossValidator, TrainValidationSplitModel只保留最好的模型。这些类是为半自动模型选择而不是探索或实验而设计的。

各个型号的参数是多少?

虽然您无法检索实际模型validationMetrics对应输入Params所以你应该能够简单地zip both:

from typing import Dict, Tuple, List, Any
from pyspark.ml.param import Param
from pyspark.ml.tuning import TrainValidationSplitModel

EvalParam = List[Tuple[float, Dict[Param, Any]]]

def get_metrics_and_params(model: TrainValidationSplitModel) -> EvalParam:
    return list(zip(model.validationMetrics, model.getEstimatorParamMaps()))

了解指标和参数之间的关系。

如果您需要更多信息,您应该使用管道Params。它将保留可用于进一步处理的所有模型:

models = pipeline.fit(df, params=paramGrid)

它将生成一个列表PipelineModels对应于params争论:

zip(models, params)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pyspark - 获取使用 ParamGridBuilder 创建的模型的所有参数 的相关文章