7

Kaggle コンペティションに PySpark 2.0 を使用しています。RandomForestさまざまなパラメータに応じたモデル ( ) の動作を知りたいです。ParamGridBuilder()単一のパラメーターに異なる値を指定してから、パラメーターのセット全体のデカルト積を実行することができます (私は推測します)。DataFramemyが既に定義されていると仮定します。

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)))

今、私はいくつかのことが欲しいです:

  • 最良のモデルのパラメータは? この投稿は、次の質問に対する部分的な回答です: How to extract model hyper-parameters from spark.ml in PySpark?
  • すべてのモデルのパラメータは?
  • 各モデルの結果 (再現率、精度など) は? 各モデルの精度を含むリストが表示される(ように見える)ことだけがわかりましprint(model.validationMetrics)たが、どのモデルを参照すればよいかわかりません。

これらの情報をすべて取得できれば、グラフや棒グラフを表示したり、Panda やsklearn.

4

2 に答える 2

6

スパーク 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

スパーク < 2.4

簡単に言えば、すべてのモデルのパラメーターを取得することはできません。これは、と同様にCrossValidatorTrainValidationSplitModel最適なモデルのみが保持されるためです。これらのクラスは、調査や実験ではなく、半自動のモデル選択用に設計されています。

すべてのモデルのパラメータは?

validationMetrics入力に対応する実際のモデルを取得することはできませんParamsが、単純にzip両方を実行できるはずです。

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()))

メトリクスとパラメータの間の関係についてのいくつかを取得します。

さらに情報が必要な場合は、PipelineParamsを使用してください。さらなる処理に使用できるすべてのモデルが保持されます。

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

引数にPipelineModels対応するのリストを生成します。params

zip(models, params)
于 2016-09-16T12:06:26.727 に答える
0

これを行う方法を見つけたと思います。CrossValidator で作成された 2 つのパラメーターを持つロジスティック回帰のハイパーパラメーターを具体的に引き出す関数を作成しました。

def hyperparameter_getter(model_obj,cv_fold = 5.0):

    enet_list = []
    reg_list  = []

    ## Get metrics

    metrics = model_obj.avgMetrics
    assert type(metrics) is list
    assert len(metrics) > 0

    ## Get the paramMap element

    for x in range(len(model_obj._paramMap.keys())):
    if model_obj._paramMap.keys()[x].name=='estimatorParamMaps':
        param_map_key = model_obj._paramMap.keys()[x]

    params = model_obj._paramMap[param_map_key]

    for i in range(len(params)):
    for k in params[i].keys():
        if k.name =='elasticNetParam':
        enet_list.append(params[i][k])
        if k.name =='regParam':
        reg_list.append(params[i][k])

    results_df =  pd.DataFrame({'metrics':metrics, 
             'elasticNetParam': enet_list, 
             'regParam':reg_list})

    # Because of [SPARK-16831][PYTHON] 
    # It only sums across folds, doesn't average
    spark_version = [int(x) for x in sc.version.split('.')]

    if spark_version[0] <= 2:
    if spark_version[1] < 1:
        results_df.metrics = 1.0*results_df['metrics'] / cv_fold

    return results_df
于 2017-01-05T15:31:41.467 に答える