脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 机器学习超参数调优总结(PySpark ML)

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

2022-10-31 17:36数据STUDIO云朵君 Python

本文主要为大家介绍下PySpark ML机器学习超参数调优总结,有需要的朋友可以参考下

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。

 

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

原文地址:https://mp.weixin.qq.com/s/WCwM5aTOY2C8WXPuM0v5NA

延伸 · 阅读

精彩推荐
  • Python使用python操作lmdb对数据读取的实例

    使用python操作lmdb对数据读取的实例

    这篇文章主要介绍了使用python操作lmdb对数据读取的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    泥石流中的一股清流8502021-08-12
  • Python如何利用python之wxpy模块玩转微信

    如何利用python之wxpy模块玩转微信

    这篇文章主要介绍了利用python之wxpy模块玩转微信,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可...

    白胡子是这个世界上最猛4102020-08-17
  • Python深入了解python装饰器

    深入了解python装饰器

    这篇文章主要介绍了解python装饰器,装饰器定义一个为其他函数添加功能的函数,装饰器就是在不修改装饰对象源代码以及调用方式的前提下,为装饰对象...

    xiaotanggao6242022-10-19
  • PythonPython基于socket模块实现UDP通信功能示例

    Python基于socket模块实现UDP通信功能示例

    这篇文章主要介绍了Python基于socket模块实现UDP通信功能,结合实例形式分析了Python使用socket模块实现IPV4协议下的UDP通信客户端与服务器端相关操作技巧,需要...

    chengqiuming4162021-01-29
  • Python详解python算法之冒泡排序

    详解python算法之冒泡排序

    这篇文章主要介绍了详解python算法之冒泡排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    failymao10802021-06-04
  • Python用pytorch的nn.Module构造简单全链接层实例

    用pytorch的nn.Module构造简单全链接层实例

    今天小编就为大家分享一篇用pytorch的nn.Module构造简单全链接层实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    AItitanic4392020-04-22
  • PythonPython Pandas工具绘制数据图使用教程

    Python Pandas工具绘制数据图使用教程

    Pandas是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas还可以绘制多重数据图表,本文将为大家介绍如何通过Pandas绘制图表,感兴趣的...

    小旺不正经7872022-03-10
  • PythonPython持续监听文件变化代码实例

    Python持续监听文件变化代码实例

    这篇文章主要介绍了Python持续监听文件变化代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    Mars.wang6102020-07-22