def calculate_metric_value(knn_model, knn_df): result = knn_model.transform(knn_df) # map predicted result string types to numeric type indexer = StringIndexer() indexer.setInputCol('predict') indexer.setOutputCol('predictIndexer') index_model = indexer.fit(result) index_result = index_model.transform(result) # generate label column dataset = index_result.withColumn('label', expr("predictIndexer")) evaluator = MulticlassClassificationEvaluator( predictionCol="predictIndexer") # calculate metric metric_dict["f1"] = (evaluator.evaluate(dataset, {evaluator.metricName: "f1"})) metric_dict["accuracy"] = (evaluator.evaluate( dataset, {evaluator.metricName: "accuracy"})) metric_dict["precision"] = (evaluator.evaluate( dataset, {evaluator.metricName: "weightedPrecision"})) metric_dict["recall"] = (evaluator.evaluate( dataset, {evaluator.metricName: "weightedRecall"}))