내가 조정에 ALS의 매개 변수를 시도하지만, 항상 최선의 선택으로 첫 번째 매개 변수를 선택할 수있어 작동하지pyspark : CrossValidator이
from pyspark.sql import SQLContext
from pyspark import SparkConf, SparkContext
from pyspark.ml.recommendation import ALS
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.evaluation import RegressionEvaluator
from math import sqrt
from operator import add
conf = (SparkConf()
.setMaster("local[4]")
.setAppName("Myapp")
.set("spark.executor.memory", "2g"))
sc = SparkContext(conf = conf)
sqlContext = SQLContext(sc)
def computeRmse(data):
return (sqrt(data.map(lambda x: (x[2] - x[3]) ** 2).reduce(add)/float(data.count())))
dfRatings = sqlContext.createDataFrame([(0, 0, 4.0), (0, 1, 2.0), (1, 1, 3.0), (1, 2, 4.0), (2, 1, 1.0), (2, 2, 5.0)],
["user", "item", "rating"])
lr1 = ALS()
grid1 = ParamGridBuilder().addGrid(lr1.regParam, [1.0,0.005,2.0]).build()
evaluator1 = RegressionEvaluator(predictionCol=lr1.getPredictionCol(),labelCol=lr1.getRatingCol(), metricName='rmse')
cv1 = CrossValidator(estimator=lr1, estimatorParamMaps=grid1, evaluator=evaluator1, numFolds=2)
cvModel1 = cv1.fit(dfRatings)
a=cvModel1.transform(dfRatings)
print ('rmse with cross validation: {}'.format(computeRmse(a)))
for reg_param in (1.0,0.005,2.0):
lr = ALS(regParam=reg_param)
model = lr.fit(dfRatings)
print ('reg_param: {}, rmse: {}'.format(reg_param,computeRmse(model.transform(dfRatings))))
출력 : 1.1820489116858794
reg_param : 교차 유효성 검사
RMSE : 1.0 RMSE : 1.1820489116858794
reg_param 0.005, RMSE : 0.001573816765686575
reg_param : 2.0 RMSE : 2.1056964491942787
어떤 도움이 필요합니까?
사전에 감사합니다, 당신의 CrossValidator에서
감사합니다. 사용자 ID가 아직 훈련되지 않았을 때 (모든 사용자 ID 데이터가 유효성 검사 그룹에 사용되고 어느 누구도 훈련에 사용되지 않았을 때) 예상된다면 예측을 추가하고 싶습니다. 그래서 RegressionEvaluator는 Nan을 반환합니다. 이 문제를 해결하려면 MiValidacion에 의해 RegressionEvaluator를 변경해야합니다. 예 : [CostumizedValidator] (https://gist.github.com/pvalienteverde/e9e610665fe7592d6dbbb2988e83b394) –