Точность и полнота
Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 22 из 58.
Тест на грипп оценивают по двум вопросам. Сколько из его тревожных сигналов о гриппе были верными? Сколько реальных случаев гриппа он выявил?
Точность отвечает на первый вопрос: 42 из 45 сигналов тревоги. Полнота отвечает на второй: 42 из 47 случаев.
from sklearn.metrics import precision_score, recall_score
print(f"{precision_score(y_test, pred):.3f}")
print(f"{recall_score(y_test, pred):.3f}"):.3f всегда показывает 3 знака после запятой, поэтому 0.9 будет выведено как 0.900. Будет выведено:
0.933
0.894Выбирай, исходя из того, какая ошибка обходится дороже. Пропущенный случай гриппа способствует распространению инфекции, поэтому этому тесту нужна полнота. Спам-фильтру, который отправляет настоящие письма в спам, нужна точность.
Задание
СреднеФильтр магазина скрывает отзывы, которые кажутся поддельными. Стартовый код создаёт две версии на основе одной модели: strict_pred и eager_pred, и считывает, какая ошибка наносит больший вред: missed (поддельный отзыв остаётся видимым) или hidden (настоящий отзыв скрывается).
- Выведи точность и полноту каждого фильтра с точностью до 3 знаков после запятой.
- Выведи фильтр, который допускает меньше таких ошибок, как показано ниже (для
missed:Fewer fakes missed: ...).
Для другого магазина и hidden:
Strict: precision 0.900, recall 0.450
Eager: precision 0.640, recall 0.800
Fewer real reviews hidden: strictПопробуйте сами
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score
# Какая ошибка хуже: пропустить поддельный отзыв (он останется видимым) или скрыть настоящий?
worse = input()
# Каждому отзыву соответствует одна строка: 1 в fake означает, что отзыв написан на заказ
reviews = pd.read_csv("reviews.csv")
features = ["words", "exclamations", "account_days", "user_reviews", "stars", "photo"]
X_train, X_test, y_train, y_test = train_test_split(reviews[features], reviews["fake"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)[:, 1]
# Два фильтра на основе одной модели: strict скрывает отзыв при вероятности подделки от 0.7, eager — от 0.3
strict_pred = proba >= 0.7
eager_pred = proba >= 0.3
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение с учителем
1Ваша первая модель
Обучение на примерахОбучающая и тестовая выборкиОбучение и предсказаниеОценка моделиПовторение: сортировщик семян4Логистическая регрессия
Предсказания «да» или «нет»Порог принятия решенияВеса как свидетельстваНесколько классовПовторение: спам-фильтр2Метод ближайших соседей
Как работает k-NNВыбор kГраницы принятия решенийМасштабирование признаков для поиска соседейПовторение: соседи для вин5Оценка классификаторов
Матрица ошибокТочность и полнотаF1-мераНесбалансированные классыROC-кривыеПовторение: скрининговый тест8Кросс-валидация
K-блочная проверкаСправедливое сравнение моделейПоиск по сеткеПовторение: ремонт скейтбордов11Проект: виды пингвинов
Знакомство с пингвинамиПодготовка данныхВыбор моделиНастройка лучшей моделиЗапуск моделиПотренируйтесь самостоятельно: Онлайн-компилятор Python