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文档中的示例代码可查找更多详细信息:
非常感谢。我试试看。如果我使用神经网络,如何设置网格层的参数?非常感谢。我试试看。如果我使用神经网络,如何设置网格层的参数?