1

我使用PySpark 2.0進行Kaggle比賽。我想知道模型(RandomForest)的行爲取決於不同的參數。 ParamGridBuilder()允許爲單個參數指定不同的值,然後執行(我猜)整個參數集的笛卡爾乘積。假設我DataFrame已定義:Pyspark - 獲取使用ParamGridBuilder創建的模型的所有參數

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所做的一樣。

回答

2

長話短說,你根本無法獲取所有型號的參數,因爲similarly to CrossValidator,TrainValidationSplitModel只保留最好的型號。這些類被設計用於半自動模型選擇而不是勘探或實驗。

所有型號的參數是什麼?

雖然你無法檢索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())) 

得到一些有關指標和參數之間的關係。

如果您需要更多信息,您應該使用Pipeline Params。它會保留其可用於進一步加工的所有模式:

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

它將生成PipelineModels的對應params參數列表:

zip(models, params) 
+0

謝謝你,我現在可以得到的評價指標,每個模型。不幸的是,''zip(model.validationMetrics,model.getEstimatorParamMaps()) ''不適用於模型。當我打印model.params時,它什麼都沒顯示(我相信我的paramGrid工作) – GwydionFR

+0

是的,這個建議只是關於'TrainValidationSplitModel'。我添加了鍵入提示以避免混淆。 – zero323

0

我想我已經找到了一種方法來做這個。我寫了專門翻出超參數對於具有兩個參數迴歸函數,用CrossValidator創建:

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 
相關問題