Несбалансированные классы
Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 24 из 58.
Когда 95 из 100 пациентов здоровы, модель, которая всегда отвечает «здоров», показывает точность 95% и не выявляет ни одного больного. При несбалансированных классах точность вводит в заблуждение:
Два исправления. stratify=y сохраняет соотношение 95 к 5 в обоих наборах, поэтому в тестовом наборе есть больные пациенты, которых можно выявить. class_weight="balanced" увеличивает вес каждой редкой строки:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=0, stratify=y)
model = LogisticRegression(max_iter=1000, class_weight="balanced")Сбалансированная модель жертвует небольшой точностью ради выявления гораздо большего числа случаев. Для редких случаев оценивай полноту и точность, а не долю правильных ответов.
Задание
СреднеОколо 5% подшипников на заводе выходят из строя раньше срока. В заготовке данные испытательного стенда разбиваются на выборки и оценивается простая модель, но в тестовой выборке всего 2 неисправных подшипника, поэтому показатель 0.993 мало о чём говорит.
- Исправь разбиение, чтобы в обеих выборках сохранялась одинаковая доля неисправных подшипников.
- Обучи вторую модель, которая повышает вес строк с неисправными подшипниками, и выведи её строку, как показано ниже.
Для другого стенда:
Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833Попробуйте сами
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 accuracy_score, recall_score
# Одна строка на каждый подшипник с испытательного стенда: 1 в faulty означает, что вскоре после испытания он вышел из строя
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]
# Исправьте это разбиение
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"Faulty bearings: train {y_train.mean() * 100:.1f}%, test {y_test.mean() * 100:.1f}%")
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
plain = LogisticRegression(max_iter=1000)
plain.fit(X_train, y_train)
pred = plain.predict(X_test)
print(f"Plain: accuracy {accuracy_score(y_test, pred):.3f}, recall {recall_score(y_test, pred):.3f}")
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение с учителем
1Ваша первая модель
Обучение на примерахОбучающая и тестовая выборкиОбучение и предсказаниеОценка моделиПовторение: сортировщик семян4Логистическая регрессия
Предсказания «да» или «нет»Порог принятия решенияВеса как свидетельстваНесколько классовПовторение: спам-фильтр2Метод ближайших соседей
Как работает k-NNВыбор kГраницы принятия решенийМасштабирование признаков для поиска соседейПовторение: соседи для вин5Оценка классификаторов
Матрица ошибокТочность и полнотаF1-мераНесбалансированные классыROC-кривыеПовторение: скрининговый тест8Кросс-валидация
K-блочная проверкаСправедливое сравнение моделейПоиск по сеткеПовторение: ремонт скейтбордов11Проект: виды пингвинов
Знакомство с пингвинамиПодготовка данныхВыбор моделиНастройка лучшей моделиЗапуск моделиПотренируйтесь самостоятельно: Онлайн-компилятор Python