2016-05-24 2 views
2

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

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

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

ответ

-2

Для вычисления 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 
+2

Спасибо, но это не то, что я просил. 'cross_val_score' выполняет перекрестную проверку и вычисляет баллы. С помощью вашего метода мне все равно придется выполнять кросс-валидацию и агрегацию баллов, плюс я до сих пор не получаю оценку f1 * за класс *. У меня есть рабочая реализация, но я бы хотел использовать как можно больше стандартных функций для упрощения кода. – toydarian

0

При создании бомбардира с 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 только позволяет вернуть один балл. Вы не можете получить баллы для всех классов сразу без дополнительных трюков. Если вам это нужно, обратитесь к другому вопросу переполнения стека, который охватывает именно это: Evaluate multiple scores on sklearn cross_val_score

Смежные вопросы