Я реализовал некоторые алгоритмы машинного обучения с использованием библиотеки Apache Spark MLLib.Я получаю результаты с использованием объекта MulticlassClassificationEvaluator.Результаты, которые я хотел получить, это точность, отзыв и точность.
Проблема в том, что значения точности и отзыва одинаковы для всех алгоритмов, которые я использовал.Например, значения точности и возврата равны 98% для случайного леса и 95% для наивного байесовского алгоритма.Ситуация такая же для других алгоритмов, которые я использовал.Это нормально?Это связано с тем, как я получаю результаты?
Вот некоторые из реализаций, которые я использовал.Случайный лес:
Dataset<Row> dataFrame = sparkBase
.getSpark()
.read()
.format("libsvm")
.load(svFilePath);
StringIndexerModel labelIndexer = new StringIndexer()
.setInputCol("label")
.setOutputCol("indexedLabel")
.fit(dataFrame);
VectorIndexerModel featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexedFeatures")
.setMaxCategories(categoryCount)
.fit(dataFrame);
Dataset<Row>[] splits = dataFrame.randomSplit(new double[]
{mainController.getTrainingDataRate(), mainController.getTestDataRate()}, 1234L);
Dataset<Row> train = splits[0];
Dataset<Row> test = splits[1];
RandomForestClassifier rf = new RandomForestClassifier()
.setLabelCol("indexedLabel")
.setFeaturesCol("indexedFeatures");
IndexToString labelConverter = new IndexToString()
.setInputCol("prediction")
.setOutputCol("predictedLabel")
.setLabels(labelIndexer.labels());
Pipeline pipeline = new Pipeline()
.setStages(new PipelineStage[] {labelIndexer, featureIndexer, rf, labelConverter});
PipelineModel model = pipeline.fit(train);
Dataset<Row> predictions = model.transform(test);
MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("indexedLabel")
.setPredictionCol("prediction")
.setMetricName("accuracy");
accuracy = evaluator.evaluate(predictions);
evaluator.setMetricName("weightedRecall");
recall = (evaluator.evaluate(predictions));
evaluator.setMetricName("weightedPrecision");
precision = (evaluator.evaluate(predictions));
Наивный алгоритм Байеса:
Dataset<Row> dataFrame = sparkBase.getSpark().read().format("libsvm").load(svFilePath);
Dataset<Row>[] splits = dataFrame.randomSplit(new double[]
{mainController.getTrainingDataRate(), mainController.getTestDataRate()}, 1234L);
Dataset<Row> train = splits[0];
Dataset<Row> test = splits[1];
NaiveBayes nb = new NaiveBayes();
NaiveBayesModel model = nb.fit(train);
Dataset<Row> predictions = model.transform(test);
MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("label")
.setPredictionCol("prediction")
.setMetricName("weightedPrecision");
precision = (evaluator.evaluate(predictions));
evaluator.setMetricName("weightedRecall");
recall = (evaluator.evaluate(predictions));
evaluator.setMetricName("accuracy");
accuracy = (evaluator.evaluate(predictions));
Я что-то не так делаю?С уважением,