如何解决如何为 Spark 的 ML 算法提供外部超参数
我有一个 Hadoop 集群,我使用 Spark 和 ALS 算法来计算一些预测。我正在考虑调整超参数以获得更好的预测,但我意识到我不知道如何将这些超参数传递给其他文件 - 带有 ALS 和最终数据集。
lines = spark.read.text("./als_test_dataset.txt").rdd
parts = lines.map(lambda row: row.value.split("::"))
ratingsRDD = parts.map(lambda p: Row(userId=int(p[0]),movieId=int(p[1]),rating=float(p[2]),timestamp=int(p[3])))
ratings = spark.createDataFrame(ratingsRDD)
(training,test) = ratings.randomSplit([0.8,0.2])
als = ALS(maxIter=5,regParam=0.01,userCol="userId",itemCol="movieId",ratingCol="rating",coldStartStrategy="drop")
param_grid = ParamGridBuilder() \
.addGrid(als.rank,[10,20,50]) \
.addGrid(als.regParam,[.01,.1,0.15,0.20]) \
.addGrid(als.maxIter,[5,10,50]) \
.build()
evaluator = RegressionEvaluator(metricName="rmse",labelCol="rating",predictionCol="prediction")
cv = CrossValidator(estimator=als,estimatorParamMaps=param_grid,evaluator=evaluator,numFolds=10)
model = cv.fit(training)
best_model = model.bestModel
从 best_model
我得到最好的 rank
、regParam
、maxIter
和 `RSME,我想将这些信息存储在某个地方。我想到了数据库,以便每天监控性能和 RSME。但是,我还想使用这些参数对生产数据集进行预测。所以,假设我有以下脚本:
lines = spark.read.text("./als_production_dataset.txt").rdd
parts = lines.map(lambda row: row.value.split("::"))
ratingsRDD = parts.map(lambda p: Row(userId=int(p[0]),timestamp=int(p[3])))
ratings = spark.createDataFrame(ratingsRDD)
als = ALS(maxIter=BEST_MAX_ITER,regParam=BEST_REG_PARAM,rank=BEST_RANK,coldStartStrategy="drop")
model = als.fit(ratings)
model.write().overwrite().save("./model")
问题是:
我应该如何将 rank
,regParam
,maxIter
从上一个脚本传递给这个脚本?
如果我将它写入数据库并在第二个脚本中读取它。它将被加载到 DataFrame 中,其中...将只包含一行,并且很难将多列中的值分配给多个变量。
如果我决定将它写在 HDFS 上,情况也差不多。而且由于我在集群模式下运行脚本,我不能只在服务器上的文件中写入结果,因为我不知道它将位于哪个节点上。
所以,我想知道传递来自其他地方/来源的超参数(或一般的附加参数)的行业标准是什么。或者书上应该怎么做?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。