1

내가 조정에 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에서

답변

2

다른 문제를 제외하고는 의미있는 교차 유효성 검사 및 평가를 수행하기에 충분한 데이터를 사용하지 않습니다. Spark ALS predictAll returns empty에서 설명하고 설명한 것처럼 ALS는 사용자 또는 항목이 교육 세트에서 누락 된 경우 예측을 제공 할 수 없습니다.

교차 유효성 검사 중에 각 분할은 정의되지 않은 예측을 가지며 전체 평가는 정의되지 않음을 의미합니다. 그 때문에 CrossValidator는 당신이 훈련하는 모든 모델이 그 관점에서 똑같이 나빠기 때문에 가능한 첫 번째 모델을 반환 할 것입니다.

+0

감사합니다. 사용자 ID가 아직 훈련되지 않았을 때 (모든 사용자 ID 데이터가 유효성 검사 그룹에 사용되고 어느 누구도 훈련에 사용되지 않았을 때) 예상된다면 예측을 추가하고 싶습니다. 그래서 RegressionEvaluator는 Nan을 반환합니다. 이 문제를 해결하려면 MiValidacion에 의해 RegressionEvaluator를 변경해야합니다. 예 : [CostumizedValidator] (https://gist.github.com/pvalienteverde/e9e610665fe7592d6dbbb2988e83b394) –

1

, 당신은 주름의 수는 그러나 1로 수정, 매개 변수 numFolds must be >=2. 1 배로 만 사용하면 열차와 테스트 세트로 분리된다는 생각으로 패배합니다.

+0

감사합니다. 질문을 업데이트합니다. –