F1-мера
Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 23 из 58.
Модель может довести точность или полноту до максимума, пожертвовав другим показателем. F1-мера объединяет эти два показателя и остаётся низкой, если оба не высоки:
Обозначив точность через P, а полноту через R, получаем F1 = 2 * P * R / (P + R). Для модели погоды:
from sklearn.metrics import f1_score, classification_report
y_test = ["sun", "sun", "rain", "rain", "snow", "sun", "rain", "snow"]
pred = ["sun", "rain", "rain", "rain", "snow", "sun", "sun", "rain"]
print(f1_score(y_test, pred, average=None)) # по одному для каждого класса, в отсортированном порядке
print(classification_report(y_test, pred))Это выводит:
[0.57142857 0.66666667 0.66666667]
precision recall f1-score support
rain 0.50 0.67 0.57 3
snow 1.00 0.50 0.67 2
sun 0.67 0.67 0.67 3
accuracy 0.62 8
macro avg 0.72 0.61 0.63 8
weighted avg 0.69 0.62 0.63 8Отчёт report оценивает каждый класс; support показывает количество тестовых строк для него. Самая слабая строка подскажет, что нужно исправить в первую очередь.
Задание
СреднеКамера завода по переработке отходов сортирует предметы по контейнерам для стекла, металла, бумаги и пластика. Программа считывает k, а начальный код обучает камеру с помощью k-NN, заполняет pred и выводит список bins.
- Выведи отчет о классификации.
- Найди контейнер с наименьшим F1 и выведи его, а затем его более слабую сторону — точность или полноту — как показано ниже (3 десятичных знака).
После отчета — для другого завода:
Weakest bin: metal, F1 0.667
Its weaker side: recall 0.571Попробуйте сами
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, f1_score, precision_score, recall_score
k = int(input())
# Одна строка на каждый предмет на конвейере с указанием контейнера, в который он попадает
items = pd.read_csv("recycling.csv")
features = ["weight_g", "shine", "see_through", "bend"]
X_train, X_test, y_train, y_test = train_test_split(items[features], items["material"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Модель камеры
model = KNeighborsClassifier(n_neighbors=k)
model.fit(X_train, y_train)
pred = model.predict(X_test)
# Контейнеры в порядке соответствующих им оценок по классам
bins = model.classes_
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение с учителем
1Ваша первая модель
Обучение на примерахОбучающая и тестовая выборкиОбучение и предсказаниеОценка моделиПовторение: сортировщик семян4Логистическая регрессия
Предсказания «да» или «нет»Порог принятия решенияВеса как свидетельстваНесколько классовПовторение: спам-фильтр2Метод ближайших соседей
Как работает k-NNВыбор kГраницы принятия решенийМасштабирование признаков для поиска соседейПовторение: соседи для вин5Оценка классификаторов
Матрица ошибокТочность и полнотаF1-мераНесбалансированные классыROC-кривыеПовторение: скрининговый тест8Кросс-валидация
K-блочная проверкаСправедливое сравнение моделейПоиск по сеткеПовторение: ремонт скейтбордов11Проект: виды пингвинов
Знакомство с пингвинамиПодготовка данныхВыбор моделиНастройка лучшей моделиЗапуск моделиПотренируйтесь самостоятельно: Онлайн-компилятор Python