Я использую проверку перекрестного искрообразования для настройки параметров явной модели ALS. Для вычисления AUC используется BinaryClassificationEvaluator с metricName = 'areaUnderROC'. Но это пошло ошибка. Мой код выглядит следующим образом:
alsExplicit = ALS(
implicitPrefs=is_implicit,
numItemBlocks=100,
numUserBlocks=100,
userCol='device_id',
itemCol='item_id',
ratingCol='rating',
)
paramMapExplicit = ParamGridBuilder() \
.addGrid(alsExplicit.rank, [30, 40]) \
.addGrid(alsExplicit.maxIter, [10, 15]) \
.addGrid(alsExplicit.regParam, [0.01, 0.1]) \
.build()
evaluator_AUC = BinaryClassificationEvaluator(
labelCol='rating',
rawPredictionCol='prediction',
metricName='areaUnderROC'
)
cvExplicit = CrossValidator(estimator=alsExplicit, estimatorParamMaps=paramMapExplicit, evaluator=evaluator_AUC, numFolds=5)
cvModelExplicit = cvExplicit.fit(train_data) # This lines goes Error
Ошибка:
pyspark.sql.utils.IllegalArgumentException: u'requirement failed: Column prediction must be of type equal to one of the following types: [DoubleType, org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7] but was actually of type FloatType.'
Когда я меняю оценщик на RegressionEvaluator, он работает хорошо, как показано ниже:
evaluator_RMSE = RegressionEvaluator(
metricName='rmse',
labelCol='rating',
predictionCol='prediction'
)
И, если я обучаю одну модель с фиксированными параметрами, преобразую тестовые данные с моделью, а затем вычисляю AUC с помощью BinaryClassificationEvaluator, то тоже самое пошло не так.
model = als.fit(train_data)
pred = model.transform(test_data)
auc = evaluator_AUC.evaluate(pred)
Затем я попытался изменить тип вручную:
pred = pred.withColumn('prediction', pred['prediction'].cast(DoubleType()))
auc = evaluator_AUC.evaluate(pred)
Этот способ работает.
Однако при использовании перекрестной проверки я не могу изменить тип данных. Что мне делать?