Оценка F1 для перекрестной проверки мультиклассовой маркировки - PullRequest
0 голосов
/ 06 мая 2020

Я хочу получить оценку F1 для каждого из классов (у меня 4 класса) и для каждой из складок перекрестной проверки. clf - моя обученная модель, X_test - это функции, а y_test - метки тестового набора. Поскольку я выполняю пятикратную перекрестную проверку, я должен получить 4 балла F1 для каждого класса в первом случае, 4 - во втором ... всего 20. Могу ли я сделать это в python простым способом ?

Следующая строка даст мне среднее значение F1 для всех классов, всего 5 значений для каждой складки. Я проверил параметры переменной scoring в cross_val_score (https://scikit-learn.org/stable/modules/model_evaluation.html), и мне кажется, что я не могу получить оценку F1 для каждого класса в каждой складке (или, может быть, я где-то потерялся).

scores = cross_val_score(clf, X_test, y_test, cv=5, scoring='f1_macro')

1 Ответ

0 голосов
/ 07 мая 2020

Хорошо, я нашел решение. X - это мой фрейм данных функций, а y - метки. f1_score(y_test, y_pred, average=None) дает оценку F1 для каждого класса без агрегирования. Таким образом, мы обучаем модель каждой из складок и пробуем ее на тестовом наборе.

from sklearn.model_selection import KFold
cv = KFold(n_splits=5, shuffle=False) 
for train_index, test_index in cv.split(X):
        X_train, X_test = X.iloc[train_index], X.iloc[test_index]
        y_train, y_test = y.iloc[train_index], y.iloc[test_index]
        clf = clf.fit(X_train, y_train)
        y_pred = clf.predict(X_test)
        print(f1_score(y_test, y_pred, average=None))

Тогда результат будет:

[0.99320793 0.79749478 0.34782609 0.44243792]
[0.99352309 0.82583622 0.34615385 0.48873874]
[0.99294785 0.78794403 0.28571429 0.42403628]
[0.99324611 0.79236813 0.31654676 0.43778802]
[0.99327615 0.79136691 0.32704403 0.42410197]

, где каждая строка имеет F1 оценки для каждой складки, и каждое значение представляет собой оценку F1 каждого класса.

Если есть более короткое и простое решение, пожалуйста, не стесняйтесь опубликовать его.

...