>기술 주변기기 >일체 포함 >기계 학습 하이퍼파라미터 튜닝 요약(PySpark ML)

기계 학습 하이퍼파라미터 튜닝 요약(PySpark ML)

王林
王林앞으로
2023-04-08 19:21:011701검색

ML의 중요한 작업은 모델 선택, 즉 데이터를 사용하여 주어진 작업에 가장 적합한 모델이나 매개변수를 찾는 것입니다. 이것을 튜닝이라고도 합니다. LogisticRegression과 같은 단일 추정기 또는 여러 알고리즘, 특성화 및 기타 단계를 포함하는 전체 파이프라인을 조정할 수 있습니다. 사용자는 파이프라인의 각 요소를 개별적으로 튜닝하는 대신 전체 파이프라인을 한 번에 튜닝할 수 있습니다.

ML에서 중요한 작업은 모델 선택, 즉 데이터를 사용하여 주어진 작업에 가장 적합한 모델이나 매개변수를 찾는 것입니다. 이것을 튜닝이라고도 합니다. 단일 Estimator(예: LogisticRegression)를 조정하거나 여러 알고리즘, 특성화 및 기타 단계를 포함하는 전체 파이프라인을 조정할 수 있습니다. 사용자는 파이프라인의 각 요소를 개별적으로 튜닝하는 대신 전체 파이프라인을 한 번에 튜닝할 수 있습니다.

MLlib는 CrossValidator 및 TrainValidationSplit과 같은 도구를 사용하여 모델 선택을 지원합니다. 이러한 도구에는 다음이 필요합니다.

  • Estimator: 조정할 알고리즘 또는 파이프라인
  • 매개변수 세트: 검색의 "매개변수 그리드"라고도 하는 선택 가능한 매개변수 세트
  • Evaluator: 메트릭 적합 모델 성능 테스트 데이터

이러한 모델 선택 도구의 작동 방식은 다음과 같습니다.

  • 입력 데이터를 별도의 훈련 및 테스트 데이터 세트로 분할합니다.
  • 각 (훈련, 테스트) 쌍에 대해 ParamMap 컬렉션을 순회합니다.

각 ParamMap​에 대해 이러한 매개변수를 사용하여 Estimator​에 적합하고, 적합한 모델​을 얻은 다음, Evaluator​를 사용하여 성능을 평가합니다. 모델.

  • 최고 성능의 매개변수 세트로 생성할 모델을 선택합니다.

파라메트릭 그리드 구성을 돕기 위해 사용자는 ParamGridBuilder를 사용할 수 있습니다. 기본적으로 매개변수 그리드의 매개변수 세트는 순차적으로 계산됩니다. CrossValidator 또는 TrainValidationSplit을 사용하여 모델 선택을 실행하기 전에 병렬도를 2 이상(1의 값은 직렬임)으로 설정하여 매개변수 평가를 병렬로 수행할 수 있습니다. 클러스터 리소스를 초과하지 않고 병렬성을 최대화하려면 병렬성 값을 신중하게 선택해야 합니다. 값이 커진다고 해서 반드시 성능이 향상되는 것은 아닙니다. 일반적으로 대부분의 클러스터에는 10보다 큰 값이면 충분합니다.

Cross Validation

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)

Train Validation Split

Spark는 CrossValidator 외에도 하이퍼파라미터 튜닝을 위한 TrainValidationSplit도 제공합니다. TrainValidationSplit은 CrossValidator의 경우 k번 계산하는 것과 달리 각 매개변수 조합을 한 번만 계산합니다. 따라서 비용은 저렴하지만 훈련 데이터 세트가 충분히 크지 않으면 신뢰할 수 있는 결과를 생성하지 않습니다.

CrossValidator와 달리 TrainValidationSplit은 단일(열차, 테스트) 데이터 세트 쌍을 생성합니다. trainRatio 매개변수를 사용하여 데이터세트를 이 두 부분으로 분할합니다. 예를 들어 trainRatio=0.75인 경우 TrainValidationSplit은 훈련에 사용되는 데이터의 75%와 검증에 사용되는 데이터의 25%로 훈련 및 테스트 데이터세트 쌍을 생성합니다.

CrossValidator와 마찬가지로 TrainValidationSplit은 궁극적으로 전체 데이터 세트에 대해 최고의 ParamMap 및 일치 Estimator를 사용합니다.

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

위 내용은 기계 학습 하이퍼파라미터 튜닝 요약(PySpark ML)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제