机器学习超参数调优总结(PySpark ML)

王林
发布: 2023-04-08 19:21:01
转载
1946人浏览过

ML中的一个重要任务是模型选择,或者使用数据为给定任务找到最佳的模型或参数。这也称为调优。可以对单个的估计器(如LogisticRegression​)进行调优,也可以对包括多种算法、特性化和其他步骤的整个pipeline​进行调优。用户可以一次调优整个Pipeline​,而不是分别调优 Pipeline 中的每个元素。

ML中的一个重要任务是模型选择,或者使用数据为给定任务找到最佳的模型或参数。这也称为调优。可以对单个的Estimator​(如LogisticRegression​)进行调优,也可以对包括多种算法、特性化和其他步骤的整个pipeline​进行调优。用户可以一次调优整个Pipeline​,而不是分别调优Pipeline中的每个元素。

MLlib支持使用CrossValidator和TrainValidationSplit等工具进行模型选择。这些工具需要具备以下条件:

  • 估计器:要调优的算法或管道pipeline
  • 一组参数:可选择的参数,有时称为搜索的“参数网格”
  • 评估者:度量拟合模型在测试数据上的表现

这些模型选择工具的工作方式如下:

  • 他们将输入数据拆分为单独的训练和测试数据集。
  • 对于每个(训练、测试)对,它们遍历ParamMap 集合:

对于每个ParamMap​,使用这些参数拟合Estimator​,得到拟合的Model​,并使用Evaluator​ 评估Model的性能。

  • 他们选择Model由表现最好的一组参数产生。

为了帮助构造参数网格,用户可以使用ParamGridBuilder。默认情况下,参数网格中的参数集以串行方式计算。在使用CrossValidator或TrainValidationSplit运行模型选择之前,可以通过将并行度设置为2或更多(1的值将是串行的)来并行地进行参数评估。并行度的值应该谨慎选择,以便在不超过集群资源的情况下最大化并行度,较大的值不一定会提高性能。一般来说,10以上的值对大多数集群来说应该足够了。

交叉验证

CrossValidator交叉验证器首先将数据集分割为一组折叠数据集,这些折叠数据集用作单独的训练数据集和测试数据集。例如,当k=3次时,CrossValidator将生成3对(训练,测试)数据集,每对数据集使用2/3的数据进行训练,1/3的数据进行测试。为了评估一个特定的ParamMap, CrossValidator通过在3个不同的(训练,测试)数据集对上拟合Estimator产生的3个模型计算平均评估度量。

在确定最佳ParamMap之后,CrossValidator最终使用最佳ParamMap和整个数据集重新匹配Estimator。

Google Antigravity
Google Antigravity

谷歌推出的AI原生IDE,AI智能体协作开发

Google Antigravity 277
查看详情 Google Antigravity

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 只计算每个参数组合一次,而在 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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:51CTO.COM网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号