ML における重要なタスクは、モデルの選択、またはデータを使用して特定のタスクに最適なモデルまたはパラメーターを見つけることです。これはチューニングとも呼ばれます。 LogisticRegression などの単一の推定器を調整することも、複数のアルゴリズム、特性評価、その他のステップを含むパイプライン全体を調整することもできます。ユーザーは、パイプライン内の各要素を個別に調整するのではなく、パイプライン全体を一度に調整できます。
ML における重要なタスクは、モデルの選択、またはデータを使用して特定のタスクに最適なモデルまたはパラメーターを見つけることです。これはチューニングとも呼ばれます。単一の Estimator (LogisticRegression など) を調整することも、複数のアルゴリズム、特性評価、その他のステップを含むパイプライン全体を調整することもできます。ユーザーは、パイプライン内の各要素を個別に調整するのではなく、パイプライン全体を一度に調整できます。
MLlib は、CrossValidator や TrainValidationSplit などのツールを使用したモデル選択をサポートしています。これらのツールには次のものが必要です。
これらのモデル選択ツールは次のように機能します:
各 ParamMap について、これらのパラメーターを使用して Estimator を適合させ、適合した Model を取得します。そして、Evaluator を使用してモデルのパフォーマンスを評価します。
パラメータ グリッドの構築を支援するために、ユーザーは ParamGridBuilder を使用できます。デフォルトでは、パラメータ グリッド内のパラメータ セットは順番に評価されます。 CrossValidator または TrainValidationSplit を使用してモデル選択を実行する前に、並列度を 2 以上 (値 1 はシリアル) に設定することで、パラメーターの評価を並列で実行できます。並列処理の値は、クラスター リソースを超えずに並列処理を最大化するように慎重に選択する必要があります。値を大きくしても必ずしもパフォーマンスが向上するとは限りません。一般に、ほとんどのクラスターでは 10 を超える値で十分です。
CrossValidator Cross Validator は、まずデータセットを折りたたまれたデータセットのセットに分割し、個別のトレーニング データセットとテスト データセットとして使用します。たとえば、k=3 回の場合、CrossValidator は 3 組の (トレーニング、テスト) データ セットを生成し、それぞれがトレーニングにデータの 2/3、テストにデータの 1/3 を使用します。特定の ParamMap を評価するために、CrossValidator は、Estimator によって生成された 3 つのモデルを 3 つの異なる (トレーニング、テスト) データセットのペアに当てはめることによって平均評価メトリクスを計算します。
最適な ParamMap を決定した後、CrossValidator は最終的に最適な ParamMap とデータ セット全体を使用して Estimator を再照合します。
from pyspark.ml import Pipeline from pyspark.ml.classification import LogisticRegression from pyspark.ml.evaluation import BinaryClassificationEvaluator from pyspark.ml.feature import HashingTF, Tokenizer from pyspark.ml.tuning import CrossValidator, ParamGridBuilder # 准备训练文件,并做好标签。 training = spark.createDataFrame([ (0, "a b c d e spark", 1.0), (1, "b d", 0.0), (2, "spark f g h", 1.0), (3, "hadoop mapreduce", 0.0), (4, "b spark who", 1.0), (5, "g d a y", 0.0), (6, "spark fly", 1.0), (7, "was mapreduce", 0.0), (8, "e spark program", 1.0), (9, "a e c l", 0.0), (10, "spark compile", 1.0), (11, "hadoop software", 0.0) ], ["id", "text", "label"]) # 配置一个ML管道,它由树stages组成:tokenizer、hashingTF和lr。 tokenizer = Tokenizer(inputCol="text", outputCol="words") hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features") lr = LogisticRegression(maxIter=10) pipeline = Pipeline(stages=[tokenizer, hashingTF, lr]) # 我们现在将Pipeline作为一个Estimator,将其包装在CrossValidator实例中。 # 这将允许我们共同选择所有管道阶段的参数。 # 交叉验证器需要一个Estimator、一组Estimator ParamMaps和一个Evaluator。 # 我们使用ParamGridBuilder来构造一个用于搜索的参数网格。 # hashingTF.numFeatures 的3个值, lr.regParam的2个值, # 这个网格将有3 x 2 = 6的参数设置供CrossValidator选择。 paramGrid = ParamGridBuilder() .addGrid(hashingTF.numFeatures, [10, 100, 1000]) .addGrid(lr.regParam, [0.1, 0.01]) .build() crossval = CrossValidator(estimator=pipeline, estimatorParamMaps=paramGrid, evaluator=BinaryClassificationEvaluator(), numFolds=2)# 使用3+ folds # 运行交叉验证,并选择最佳参数集。 cvModel = crossval.fit(training) # 准备测试未标注的文件 test = spark.createDataFrame([ (4, "spark i j k"), (5, "l m n"), (6, "mapreduce spark"), (7, "apache hadoop") ], ["id", "text"]) # 对测试文档进行预测, cvModel使用发现的最佳模型(lrModel)。 prediction = cvModel.transform(test) selected = prediction.select("id", "text", "probability", "prediction") for row in selected.collect(): print(row)
トレーニング検証分割
CrossValidator に加えて、Spark はハイパーパラメータ調整用の TrainValidationSplit も提供します。 TrainValidationSplit は、各パラメーターの組み合わせを 1 回だけ計算します ( CrossValidator の場合は k 回計算します)。したがって、コストは低くなりますが、トレーニング データ セットが十分に大きくない場合、信頼できる結果は得られません。
CrossValidator とは異なり、TrainValidationSplit は単一の (トレーニング、テスト) データ セット ペアを作成します。 trainRatio パラメーターを使用して、データセットをこれら 2 つの部分に分割します。たとえば、trainRatio=0.75 の場合、TrainValidationSplit は、データの 75% がトレーニングに使用され、25% が検証に使用されるトレーニングとテストのデータセットのペアを生成します。
CrossValidator と同様に、TrainValidationSplit は最終的に、データ セット全体に最適な ParamMap と一致する Estimator を使用します。
rreeee
以上が機械学習のハイパーパラメータ調整の概要 (PySpark ML)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。