Heim > Artikel > Technologie-Peripheriegeräte > Zusammenfassung der Hyperparameteroptimierung für maschinelles Lernen (PySpark ML)
Eine wichtige Aufgabe im ML ist die Modellauswahl oder die Verwendung von Daten, um das beste Modell oder die besten Parameter für eine bestimmte Aufgabe zu finden. Man nennt das auch Tuning. Sie können einen einzelnen Schätzer wie LogisticRegression oder eine gesamte Pipeline optimieren, die mehrere Algorithmen, Charakterisierungen und andere Schritte umfasst. Benutzer können die gesamte Pipeline auf einmal optimieren, anstatt jedes Element in der Pipeline einzeln zu optimieren.
Eine wichtige Aufgabe im ML ist die Modellauswahl oder die Verwendung von Daten, um das beste Modell oder die besten Parameter für eine bestimmte Aufgabe zu finden. Man nennt das auch Tuning. Sie können einen einzelnen Schätzer (z. B. LogisticRegression) oder eine gesamte Pipeline optimieren, die mehrere Algorithmen, Charakterisierungen und andere Schritte umfasst. Benutzer können die gesamte Pipeline auf einmal optimieren, anstatt jedes Element in der Pipeline einzeln zu optimieren.
MLlib unterstützt die Modellauswahl mithilfe von Tools wie CrossValidator und TrainValidationSplit. Diese Tools erfordern Folgendes:
So funktionieren diese Modellauswahltools:
Verwenden Sie für jede ParamMap diese Parameter, um den Schätzer anzupassen, das angepasste Modell zu erhalten und den Evaluator zu verwenden, um die Leistung von zu bewerten das Modell.
Um beim Aufbau des parametrischen Gitters zu helfen, können Benutzer ParamGridBuilder verwenden. Standardmäßig werden Parametersätze im Parameterraster seriell berechnet. Die Parameterauswertung kann parallel erfolgen, indem der Grad der Parallelität auf 2 oder mehr eingestellt wird (ein Wert von 1 ist seriell), bevor die Modellauswahl mit CrossValidator oder TrainValidationSplit ausgeführt wird. Der Wert für Parallelität sollte sorgfältig ausgewählt werden, um die Parallelität zu maximieren, ohne die Clusterressourcen zu überschreiten. Größere Werte verbessern nicht unbedingt die Leistung. Im Allgemeinen sollte ein Wert über 10 für die meisten Cluster ausreichend sein.
CrossValidator Cross Validator teilt den Datensatz zunächst in einen Satz gefalteter Datensätze auf, die als separate Trainings- und Testdatensätze verwendet werden. Wenn beispielsweise k=3-mal ist, generiert CrossValidator drei Paare von (Trainings-, Test-)Datensätzen, wobei jedes Datensatzpaar 2/3 der Daten für das Training und 1/3 der Daten für den Test verwendet. Um eine bestimmte ParamMap auszuwerten, berechnet CrossValidator die durchschnittliche Bewertungsmetrik, indem es drei von Estimator erstellte Modelle an drei verschiedene Datensatzpaare (Training, Test) anpasst.
Nachdem CrossValidator die beste ParamMap ermittelt hat, gleicht CrossValidator den Estimator schließlich erneut mit der besten ParamMap und dem gesamten Datensatz ab.
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)
Train Validation Split
Zusätzlich zu CrossValidator bietet Spark auch TrainValidationSplit für die Optimierung von Hyperparametern. TrainValidationSplit berechnet jede Parameterkombination nur einmal, im Gegensatz zu k-mal im Fall von CrossValidator . Daher ist es kostengünstiger, liefert jedoch keine zuverlässigen Ergebnisse, wenn der Trainingsdatensatz nicht groß genug ist.
Im Gegensatz zu CrossValidator erstellt TrainValidationSplit ein einzelnes Datensatzpaar (Training, Test). Es verwendet den trainRatio-Parameter, um den Datensatz in diese beiden Teile aufzuteilen. Wenn beispielsweise trainRatio = 0,75, generiert TrainValidationSplit ein Trainings- und Testdatensatzpaar, wobei 75 % der Daten für das Training und 25 % für die Validierung verwendet werden.
Wie CrossValidator verwendet TrainValidationSplit letztendlich die beste ParamMap und den passenden Schätzer für den gesamten Datensatz.
from pyspark.ml.evaluation import RegressionEvaluator from pyspark.ml.regression import LinearRegression from pyspark.ml.tuning import ParamGridBuilder, TrainValidationSplit # Prepare training and test data. data = spark.read.format("libsvm") .load("data/mllib/sample_linear_regression_data.txt") train, test = data.randomSplit([0.9, 0.1], seed=12345) lr = LinearRegression(maxIter=10) # 我们使用ParamGridBuilder来构造一个用于搜索的参数网格。 # TrainValidationSplit将尝试所有值的组合,并使用评估器确定最佳模型。 paramGrid = ParamGridBuilder() .addGrid(lr.regParam, [0.1, 0.01]) .addGrid(lr.fitIntercept, [False, True]) .addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0]) .build() # 在这种情况下,估计器是简单的线性回归。 # TrainValidationSplit需要一个Estimator、一组Estimator ParamMaps 和一个 Evaluator。 tvs = TrainValidationSplit(estimator=lr, estimatorParamMaps=paramGrid, evaluator=RegressionEvaluator(), # 80%的数据将用于培训,20%用于验证。 trainRatio=0.8) # 运行TrainValidationSplit,并选择最佳参数集。 model = tvs.fit(train) # 对测试数据进行预测。模型是参数组合后性能最好的模型。 model.transform(test) .select("features", "label", "prediction") .show()
Das obige ist der detaillierte Inhalt vonZusammenfassung der Hyperparameteroptimierung für maschinelles Lernen (PySpark ML). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!