Tugas penting dalam ML ialah pemilihan model, atau menggunakan data untuk mencari model atau parameter terbaik untuk tugasan tertentu. Ini juga dipanggil penalaan. Anda boleh menala satu penganggar, seperti LogisticRegression, atau keseluruhan saluran paip yang merangkumi berbilang algoritma, pencirian dan langkah lain. Pengguna boleh menala keseluruhan Saluran Paip sekaligus, dan bukannya menala setiap elemen dalam Talian Paip secara individu.
Tugas penting dalam ML ialah pemilihan model, atau menggunakan data untuk mencari model atau parameter terbaik untuk tugasan tertentu. Ini juga dipanggil penalaan. Anda boleh menala satu Penganggar (seperti LogisticRegression) atau keseluruhan saluran paip yang merangkumi berbilang algoritma, pencirian dan langkah lain. Pengguna boleh menala keseluruhan Saluran Paip sekaligus dan bukannya menala setiap elemen dalam Talian Paip secara individu.
MLlib menyokong pemilihan model menggunakan alatan seperti CrossValidator dan TrainValidationSplit. Alat ini memerlukan yang berikut:
Alat pemilihan model ini berfungsi seperti berikut:
Untuk setiap ParamMap, gunakan parameter ini agar sesuai dengan Penganggar untuk mendapatkan Model yang dipasang , dan gunakan Penilai untuk menilai prestasi Model.
Untuk membantu membina grid parametrik, pengguna boleh menggunakan ParamGridBuilder. Secara lalai, set parameter dalam grid parameter dinilai secara bersiri. Penilaian parameter boleh dilakukan secara selari dengan menetapkan darjah selari kepada 2 atau lebih (nilai 1 akan menjadi bersiri) sebelum menjalankan pemilihan model menggunakan CrossValidator atau TrainValidationSplit. Nilai untuk keselarian harus dipilih dengan teliti untuk memaksimumkan keselarian tanpa melebihi sumber kluster tidak semestinya meningkatkan prestasi. Secara umumnya, nilai melebihi 10 sepatutnya mencukupi untuk kebanyakan kluster.
Pengesah Silang Silang membahagikan set data kepada set set data terlipat, yang digunakan sebagai set data latihan dan ujian yang berasingan. Contohnya, apabila k=3 kali, CrossValidator akan menjana 3 pasang set data (latihan, ujian), setiap pasangan set data menggunakan 2/3 daripada data untuk latihan dan 1/3 daripada data untuk ujian. Untuk menilai ParamMap tertentu, CrossValidator mengira metrik penilaian purata dengan memasangkan 3 model yang dihasilkan oleh Penganggar pada 3 pasangan set data (kereta api, ujian) yang berbeza.
Selepas menentukan ParamMap terbaik, CrossValidator akhirnya memadankan semula Penganggar menggunakan ParamMap terbaik dan keseluruhan set data.
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)
Pembahagian Pengesahan Latihan
Selain CrossValidator, Spark juga menyediakan TrainValidationSplit untuk penalaan hiperparameter. TrainValidationSplit hanya mengira setiap kombinasi parameter sekali, berbanding dengan k kali dalam kes CrossValidator . Oleh itu, ia lebih murah, tetapi ia tidak menghasilkan hasil yang boleh dipercayai apabila set data latihan tidak cukup besar.
Tidak seperti CrossValidator, TrainValidationSplit mencipta pasangan set data tunggal (kereta api, ujian). Ia menggunakan parameter trainRatio untuk memisahkan set data kepada dua bahagian ini. Contohnya, apabila trainRatio=0.75, TrainValidationSplit akan menjana pasangan set data kereta api dan ujian dengan 75% daripada data yang digunakan untuk latihan dan 25% digunakan untuk pengesahan.
Seperti CrossValidator, TrainValidationSplit akhirnya menggunakan ParamMap terbaik dan Penganggar yang sepadan untuk keseluruhan set data.
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()
Atas ialah kandungan terperinci Ringkasan penalaan hiperparameter pembelajaran mesin (PySpark ML). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!