Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 利用Pyspark进行超参数调谐_Apache Spark_Pyspark_Apache Spark Mllib - Fatal编程技术网

Apache spark 利用Pyspark进行超参数调谐

Apache spark 利用Pyspark进行超参数调谐,apache-spark,pyspark,apache-spark-mllib,Apache Spark,Pyspark,Apache Spark Mllib,我正在处理一个数据集,我正在使用线性回归来拟合模型。在结束之前,我想尝试使用超参数调优来获得可用的最佳模型 我一直在通过管道运行数据,首先将字符串转换为数字,然后对其进行编码,然后对所有列进行矢量化,然后在应用线性回归之前对其进行缩放。我很想知道如何设置网格来开始超参数滚动 import pyspark.ml.feature as ft WD_indexer = ft.StringIndexer(inputCol="Wind_Direction", outputCol="WD-num") WD_

我正在处理一个数据集,我正在使用线性回归来拟合模型。在结束之前,我想尝试使用超参数调优来获得可用的最佳模型

我一直在通过管道运行数据,首先将字符串转换为数字,然后对其进行编码,然后对所有列进行矢量化,然后在应用线性回归之前对其进行缩放。我很想知道如何设置网格来开始超参数滚动

import pyspark.ml.feature as ft
WD_indexer = ft.StringIndexer(inputCol="Wind_Direction", outputCol="WD-num")
WD_encoder = ft.OneHotEncoder(inputCol="WD-num", outputCol='WD-vec')
featuresCreator = ft.VectorAssembler(inputCols=["Dew_Point", "Temperature",
                                            "Pressure", "WD-vec", "Wind_Speed","Hours_Snow","Hours_Rain"], outputCol='features')

from pyspark.ml.feature import StandardScaler
feature_scaler = StandardScaler(inputCol="features",outputCol="sfeatures")

from pyspark.ml.regression import LinearRegression
lr = LinearRegression(featuresCol="sfeatures",labelCol="PM_Reading")
所以管道看起来像这样:

from pyspark.ml import Pipeline
pipeline = Pipeline( stages = [WD_indexer, WD_encoder, featuresCreator, feature_scaler, lr] )
如何设置此管道的网格


谢谢

您可以从pyspark ml.tuning类使用param grid builder设置网格,并使用交叉验证进行测试

from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
然后可以决定要运行的不同参数及其值: 您需要为每个参数添加一个网格&每个参数的值数组 例如,对于线性回归,可以传递lr.regParam、lr.maxIter、lr.elasticNetParam的值

paramGrid = ParamGridBuilder().addGrid(lr.maxIter, [10, 100, 1000]).addGrid(lr.regParam, [0.1, 0.01]).build()
您还可以使用featuresCreator.inputCols等从管道更改向量汇编程序、字符串索引器和一个热编码的参数

crossval = CrossValidator(estimator=pipeline,
                      estimatorParamMaps=paramGrid,
                      evaluator=RegressionEvaluator(),
                      numFolds=2)  # use 3+ folds in practice
您可以通过交叉验证程序运行培训数据,以获得最佳模型

cvModel = crossval.fit(training)

您可以从pyspark ml.tuning类使用param grid builder设置网格,并使用交叉验证进行测试

from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
然后可以决定要运行的不同参数及其值: 您需要为每个参数添加一个网格&每个参数的值数组 例如,对于线性回归,可以传递lr.regParam、lr.maxIter、lr.elasticNetParam的值

paramGrid = ParamGridBuilder().addGrid(lr.maxIter, [10, 100, 1000]).addGrid(lr.regParam, [0.1, 0.01]).build()
您还可以使用featuresCreator.inputCols等从管道更改向量汇编程序、字符串索引器和一个热编码的参数

crossval = CrossValidator(estimator=pipeline,
                      estimatorParamMaps=paramGrid,
                      evaluator=RegressionEvaluator(),
                      numFolds=2)  # use 3+ folds in practice
您可以通过交叉验证程序运行培训数据,以获得最佳模型

cvModel = crossval.fit(training)

我知道这个问题是两年前发布的,但让每个人都知道最新的发现和你问题的替代解决方案并没有坏处。正如FrankKane详细解释的,CrossValidator非常昂贵,因为它需要评估指定超参数值的每个可能组合。因此,建议您使用TrainValidationSplit,它只评估每个组合中的单个随机列车/测试数据分割。这在处理非常大的数据集时非常有用。spark文档中的示例代码可查找更多详细信息:


我知道这个问题是两年前发布的,但让每个人都知道最新的发现和你问题的替代解决方案并没有坏处。正如FrankKane详细解释的,CrossValidator非常昂贵,因为它需要评估指定超参数值的每个可能组合。因此,建议您使用TrainValidationSplit,它只评估每个组合中的单个随机列车/测试数据分割。这在处理非常大的数据集时非常有用。spark文档中的示例代码可查找更多详细信息:


非常感谢。我试试看。如果我使用神经网络,如何设置网格层的参数?非常感谢。我试试看。如果我使用神经网络,如何设置网格层的参数?