Получите одно и то же значение для точности, отзыва и оценки F в алгоритме Apache Spark Logistic.
Я реализовал логистическую регрессию для задачи классификации. Я получаю одинаковое значение для точности, отзыва и оценки Ф1. Можно ли иметь такое же значение? Я также получил эту проблему в реализации деревьев решений и случайных лесов. Там также я получил то же значение для точности, отзыва и F1 балла.
// Run training algorithm to build the model.
final LogisticRegressionModel model = new LogisticRegressionWithLBFGS()
.setNumClasses(13).
run(data.rdd());
//Compute raw scores on the test set.
JavaRDD<Tuple2<Object, Object>> predictionAndLabels = testData.map(
new Function<LabeledPoint, Tuple2<Object, Object>>() {
public Tuple2<Object, Object> call(LabeledPoint p) {
Double prediction = model.predict(p.features());
return new Tuple2<Object, Object>(prediction, p.label());
}
}
);
// Get evaluation metrics.
MulticlassMetrics metrics = new MulticlassMetrics(predictionAndLabels.rdd());
double precision = metrics.precision();
System.out.println("Precision = " + precision);
double recall = metrics.recall();
System.out.println("Recall = " + recall);
double FScore = metrics.fMeasure();
System.out.println("F Measure = " + FScore);
1 ответ
Я тоже сталкиваюсь с той же проблемой. Я пробовал дерево решений, случайный лес и GBT. Каждый раз я получаю одинаковую точность, вспоминаю и балл F1. Точность также одинакова (рассчитывается с помощью матрицы путаницы).
Поэтому я использую свои собственные формулы и письменный код, чтобы получить показатели точности, точности, отзыва и оценки F1.
from pyspark.ml.classification import RandomForestClassifier
from pyspark.mllib.evaluation import MulticlassMetrics
#generate model on splited dataset
rf = RandomForestClassifier(labelCol='label', featuresCol='features')
fit = rf.fit(trainingData)
transformed = fit.transform(testData)
results = transformed.select(['prediction', 'label'])
predictionAndLabels=results.rdd
metrics = MulticlassMetrics(predictionAndLabels)
cm=metrics.confusionMatrix().toArray()
accuracy=(cm[0][0]+cm[1][1])/cm.sum()
precision=(cm[0][0])/(cm[0][0]+cm[1][0])
recall=(cm[0][0])/(cm[0][0]+cm[0][1])`
print("RandomForestClassifier: accuracy,precision,recall",accuracy,precision,recall)
Вы можете дать метку =1 в качестве аргумента в точности и вызвать методы для двоичной классификации. Это сработало для меня. Для множественной классификации вы можете попробовать индекс метки класса, для которого вы рассчитываете точность и вызываете значения.
`double precision = metrics.precision(label=1);
System.out.println("Precision = " + precision);
double recall = metrics.recall(label=1);
System.out.println("Recall = " + recall);
double FScore = metrics.fMeasure();
System.out.println("F Measure = " + FScore);`