我正在研究一个数据集,我正在使用线性回归来拟合模型。在注销之前,我想尝试使用超参数调整来获得最佳模型。
我一直在通过管道运行数据,首先将字符串转换为数字,然后对其进行编码,然后对所有列进行矢量化,然后在应用线性回归之前对其进行缩放。我很想知道如何设置网格来启动超参数球(可以这么说)。
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] )
如何为此管道设置网格?
由于
答案 0 :(得分:1)
您可以使用param网格构建器和放大器设置网格。使用交叉验证进行测试,来自pyspark ml.tuning class。
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)
答案 1 :(得分:0)
我知道这个问题是两年前发布的,但是让每个人都发布有关最新发现和问题的替代解决方案仍然没有什么坏处。正如弗兰克·凯恩(Frank Kane)详细解释的here,CrossValidator
相当昂贵,因为它需要评估指定超参数值的每种可能组合。结果,建议您使用TrainValidationSplit
,它仅评估每个组合的单个随机训练/测试数据拆分。在处理非常大的数据集时,这可能非常有用。 spark文档中的示例代码(查找更多详细信息here):
# We use a ParamGridBuilder to construct a grid of parameters to search over.
# TrainValidationSplit will try all combinations of values and determine best model using
# the evaluator.
paramGrid = ParamGridBuilder()\
.addGrid(lr.regParam, [0.1, 0.01]) \
.addGrid(lr.fitIntercept, [False, True])\
.addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0])\
.build()
# In this case the estimator is simply the linear regression.
# A TrainValidationSplit requires an Estimator, a set of Estimator ParamMaps, and an Evaluator.
tvs = TrainValidationSplit(estimator=lr,
estimatorParamMaps=paramGrid,
evaluator=RegressionEvaluator(),
# 80% of the data will be used for training, 20% for validation.
trainRatio=0.8)
# Run TrainValidationSplit, and choose the best set of parameters.
model = tvs.fit(train)