Почему взвешенные значения отзыва и точности одинаковы вообще? - PullRequest
0 голосов
/ 09 декабря 2018

Я реализовал некоторые алгоритмы машинного обучения с использованием библиотеки 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));

Я что-то не так делаю?С уважением,

...