оценка f1 всех классов от scikits cross_val_score

Я использую cross_val_score из scikit-learn (пакет sklearn.cross_validation) для оценки моих классификаторов.
Если я использую f1 для параметра scoring, функция вернет оценку f1 для одного класса. Чтобы получить среднее значение, я могу использовать f1_weighted, но я не могу понять, как получить оценку f1 другого класса. (точность и отзыв аналогичны)

Функции в sklearn.metrics имеют параметр labels, который делает это, но я не могу найти ничего подобного в документации.

Есть ли способ получить оценку f1 для всех классов сразу или хотя бы указать класс, который следует учитывать при cross_val_score?


person toydarian    schedule 24.05.2016    source источник


Ответы (3)


Когда вы создаете счетчик с функцией make_scorer, вы можете передать любые дополнительные аргументы, которые вам нужны, например:

cross_val_score(
    svm.SVC(kernel='rbf', gamma=0.7, C = 1.0),
    X, y,
    scoring=make_scorer(f1_score, average='weighted', labels=[2]),
    cv=10)

Но cross_val_score позволяет вернуть только один балл. Вы не можете получить очки за все классы сразу без дополнительных ухищрений. Если вам это нужно, обратитесь к другому вопросу о переполнении стека, который охватывает именно это: Оценить несколько баллов на sklearn cross_val_score

person Alexey Guseynov    schedule 09.08.2017

Для индивидуальных оценок каждого класса используйте это:

f1 = f1_score(y_test, y_pred, Average= None) print("f1 перечисляет не намерение: ", f1)

person Ajay Rathode    schedule 13.12.2018

Чтобы вычислить счет F1, мы можем использовать sklearn.metrics.f1_score.

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html

Образец кода

from sklearn import svm
from sklearn import metrics
from sklearn.cross_validation import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import f1_score, accuracy_score

# prepare dataset
iris = load_iris()
X = iris.data[:, :2]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# svm classification
clf = svm.SVC(kernel='rbf', gamma=0.7, C = 1.0).fit(X_train, y_train)
y_predicted = clf.predict(X_test)

# performance
print "Classification report for %s" % clf
print metrics.classification_report(y_test, y_predicted)

print("F1 micro: %1.4f\n" % f1_score(y_test, y_predicted, average='micro'))
print("F1 macro: %1.4f\n" % f1_score(y_test, y_predicted, average='macro'))
print("F1 weighted: %1.4f\n" % f1_score(y_test, y_predicted, average='weighted'))
print("Accuracy: %1.4f" % (accuracy_score(y_test, y_predicted)))

Пример вывода

Classification report for SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=None, degree=3, gamma=0.7, kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
             precision    recall  f1-score   support

          0       1.00      0.90      0.95        10
          1       0.50      0.88      0.64         8
          2       0.86      0.50      0.63        12

avg / total       0.81      0.73      0.74        30

F1 micro: 0.7333

F1 macro: 0.7384

F1 weighted: 0.7381

Accuracy: 0.7333
person Just life    schedule 24.05.2016
comment
Спасибо, но это не то, о чем я просил. cross_val_score выполняет перекрестную проверку и подсчитывает баллы. С вашим методом мне все равно пришлось бы реализовывать перекрестную проверку и агрегирование оценок, плюс я все еще не получаю оценку f1 для каждого класса. У меня есть рабочая реализация, но я хотел бы использовать как можно больше стандартных функций для упрощения кода. - person toydarian; 25.05.2016