Базовые модели: всегда превосходите DummyClassifier
Вы создадите DummyClassifier как минимальную базовую модель и убедитесь, что любая настоящая модель должна превосходить её, прежде чем считаться полезной
«Базовые модели: всегда превосходите DummyClassifier» — бесплатный урок Machine Learning Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Machine Learning Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Machine Learning Academy содержит 4 уроков всего.
Зачем нужна базовая модель
Когда вы сообщаете, что ваша модель достигает точности 92%, это число бессмысленно без контекста. Впечатляет ли результат в 92% или, наоборот, разочаровывает? Это полностью зависит от того, какого результата можно было бы достичь с помощью самой простой возможной стратегии для той же задачи.
Базовая модель — это минимальный ориентир, который каждая настоящая модель должна превзойти, чтобы считаться полезной. Без такого ориентира вы можете радоваться точности 92% на наборе данных, где модель, всегда предсказывающая «не мошенничество», достигла бы точности 95%. Это означает, что ваша сложная модель машинного обучения на самом деле хуже бездействия.
DummyClassifier: инструмент базовой оценки в scikit-learn
Scikit-learn предоставляет DummyClassifier — минимальный классификатор, который строит предсказания по простым правилам, полностью игнорируя входные признаки. Это формальный инструмент для установления базового уровня перед началом разработки настоящей модели.
DummyClassifier — не шутка и не временная замена, а строгая проверка здравого смысла. Если ваша настоящая модель не может превзойти DummyClassifier, значит, есть фундаментальная проблема: ваши признаки могут не обладать предсказательной силой, в вашем конвейере может быть ошибка или задача сложнее, чем ожидалось.
from sklearn.dummy import DummyClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Most frequent baseline: always predicts the majority class
dummy = DummyClassifier(strategy='most_frequent')
dummy.fit(X_train, y_train)
baseline_acc = dummy.score(X_test, y_test)
print(f'Baseline accuracy (always predict majority class): {baseline_acc:.3f}')Стратегии DummyClassifier
DummyClassifier поддерживает несколько стратегий базовой оценки:
most_frequent: всегда предсказывает класс, который чаще всего встречается в обучающих данных. Лучше всего подходит для несбалансированных наборов данных.stratified: случайным образом предсказывает каждый класс с вероятностью, равной его доле в обучающих данных. Сохраняет распределение классов.uniform: случайным образом предсказывает каждый класс с одинаковой вероятностью. Полезна, когда все классы представлены в равных пропорциях.constant: всегда предсказывает указанный постоянный класс. Используйте её, чтобы проверить, что произойдёт, если всегда предсказывать положительный класс.
from sklearn.dummy import DummyClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
for strategy in ['most_frequent', 'stratified', 'uniform', 'prior']:
dummy = DummyClassifier(strategy=strategy, random_state=42)
dummy.fit(X_train, y_train)
acc = dummy.score(X_test, y_test)
print(f'strategy={strategy}: accuracy={acc:.3f}')Парадокс точности на практике
Парадокс точности наиболее ярко проявляется на несбалансированных наборах данных. Рассмотрим мошенничество с банковскими картами, где 99% операций являются законными. DummyClassifier со стратегией most_frequent предсказывает «не мошенничество» для каждой операции и достигает точности 99%. Настоящая модель машинного обучения с точностью 97% по этому показателю будет выглядеть хуже базовой модели, даже если она правильно выявляет большинство фактических случаев мошенничества.
Именно поэтому базовую модель DummyClassifier необходимо оценивать по тому же показателю, который вы будете использовать для оценки настоящей модели. Для несбалансированных задач используйте F1, точность или полноту, а не accuracy.
from sklearn.dummy import DummyClassifier
from sklearn.metrics import f1_score, accuracy_score
import numpy as np
# Simulate 99% negative class (not fraud)
np.random.seed(42)
n = 10000
y_true = np.array([0]*9900 + [1]*100)
X_fake = np.random.randn(n, 5) # random features (not predictive)
# Baseline always predicts not-fraud
dummy = DummyClassifier(strategy='most_frequent')
dummy.fit(X_fake, y_true)
y_pred_dummy = dummy.predict(X_fake)
print(f'Dummy Accuracy: {accuracy_score(y_true, y_pred_dummy):.3f}') # 0.990
print(f'Dummy F1-score: {f1_score(y_true, y_pred_dummy):.3f}') # 0.000
print('Dummy catches 0 fraud cases despite 99% accuracy!')DummyRegressor: базовая модель для регрессии
Для задач регрессии scikit-learn предоставляет DummyRegressor со следующими стратегиями:
mean: всегда предсказывает среднее значение обучающей выборки. Это стандартная базовая модель: R² показывает, насколько ваша модель лучше простого предсказания среднего значения.median: всегда предсказывает медиану обучающей выборки. Более устойчива к выбросам.quantile: всегда предсказывает определённый квантиль целевой переменной в обучающих данных.constant: всегда предсказывает указанное постоянное значение.
Регрессионная модель с R² ниже 0 на самом деле хуже, чем постоянное предсказание среднего значения. Это явный признак того, что при обучении что-то пошло не так.
from sklearn.dummy import DummyRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
dummy_reg = DummyRegressor(strategy='mean')
dummy_reg.fit(X_train, y_train)
y_pred_d = dummy_reg.predict(X_test)
print(f'DummyRegressor MAE: {mean_absolute_error(y_test, y_pred_d):.3f}')
print(f'DummyRegressor R2: {r2_score(y_test, y_pred_d):.3f}') # exactly 0.0Ваша модель и базовая модель
Теперь сравните настоящую модель с базовой, используя один и тот же показатель. Улучшение по сравнению с базовой моделью показывает, какую дополнительную ценность приносит ваша модель машинного обучения. Это сравнение должно быть первым результатом, который вы приводите в любом проекте машинного обучения.
Если улучшение небольшое (например, настоящая модель достигает F1=0.65 против F1=0.60 у базовой), подумайте, оправданы ли сложность и стоимость модели машинного обучения улучшением на 5%. Иногда система на основе простых правил оказывается дешевле и достаточно точной.
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.metrics import f1_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Baseline
dummy = DummyClassifier(strategy='most_frequent')
dummy.fit(X_train, y_train)
baseline_f1 = f1_score(y_test, dummy.predict(X_test))
# Real model
pipeline = Pipeline([('scaler', StandardScaler()), ('clf', LogisticRegression(max_iter=1000))])
pipeline.fit(X_train, y_train)
real_f1 = f1_score(y_test, pipeline.predict(X_test))
print(f'Baseline F1: {baseline_f1:.3f}')
print(f'Real model F1: {real_f1:.3f}')
print(f'Improvement over baseline: {real_f1 - baseline_f1:.3f}')Производительность человека как второй базовый ориентир
Для многих задач реального мира эталонный показатель производительности человека более информативен, чем базовая модель. Например, это может быть частота ошибок рентгенолога при обнаружении опухолей, точность специалиста по выявлению спама или ошибка эксперта при оценке стоимости дома.
Результат человека задаёт верхнюю границу: если ваша модель достигает или превосходит результат человека, задача решена. Если модель значительно уступает человеку, есть возможности для улучшения. Если модель почти достигла человеческого уровня, дальнейшее улучшение может потребовать огромных усилий при всё меньшей отдаче.
Предыдущая система как базовый ориентир
В промышленности наиболее релевантным базовым уровнем обычно является существующая система, которую заменяет Ваша модель. Если текущая промышленная система использует созданные вручную правила, именно её необходимо превзойти. Если ранее была внедрена модель машинного обучения, её производственные метрики являются Вашим базовым уровнем.
Представляя результаты заинтересованным сторонам, всегда сравнивайте их с текущей системой, а не только с DummyClassifier. Ценность для бизнеса создаётся за счёт улучшения текущего положения. Улучшение на 2% по сравнению с текущей системой может принести миллионы долларов благодаря сокращению потерь от мошенничества, даже если в абсолютном выражении оно кажется небольшим.
Базовый уровень для многоклассовой классификации
Для многоклассовых задач базовый уровень DummyClassifier зависит от соотношения классов. При наличии K сбалансированных классов стратегия most_frequent обеспечивает точность 1/K. При несбалансированных классах она обеспечивает долю наиболее распространённого класса.
Для таких метрик, как макроусреднённая F1 (при которой все классы имеют одинаковый вес), случайный классификатор покажет гораздо более низкий результат на редких классах. Всегда сравнивайте метрики по каждому классу для Вашей реальной модели и базового уровня, чтобы понять, откуда берётся улучшение.
from sklearn.dummy import DummyClassifier
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
dummy = DummyClassifier(strategy='most_frequent')
dummy.fit(X_train, y_train)
y_pred = dummy.predict(X_test)
print('DummyClassifier (most_frequent) on Iris:')
print(classification_report(y_test, y_pred,
target_names=['setosa', 'versicolor', 'virginica']))
print('Notice: only the majority class has non-zero precision/recall')Классификатор нулевого правила: самый простой базовый уровень
Ещё проще, чем DummyClassifier, является классификатор нулевого правила (ZeroR) — распространённый базовый уровень в конкурсах по анализу данных. В задачах классификации ZeroR всегда предсказывает наиболее распространённый класс. В задачах регрессии он всегда предсказывает среднее значение. ZeroR представляет абсолютный минимум, который должна превзойти любая модель, чтобы быть полезной.
Если Вам не удаётся превзойти ZeroR, Ваши признаки не содержат информации о целевой переменной. Эта диагностическая проверка выполняется быстро и не требует затрат, поэтому она всегда должна быть первым шагом в новом проекте машинного обучения — до того, как Вы начнёте тратить время на сложные модели.
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# ZeroR: manually compute
majority_class = np.bincount(y_train).argmax()
y_pred_zeror = np.full(len(y_test), majority_class)
print(f'Majority class in training: {majority_class}')
print(f'ZeroR Accuracy: {accuracy_score(y_test, y_pred_zeror):.3f}')
print(f'ZeroR F1 (pos): {f1_score(y_test, y_pred_zeror):.3f}')Базовые уровни на основе бэггинга в Ваших проектах машинного обучения
Полный рабочий процесс оценки базового уровня для любого проекта машинного обучения:
- Вычислите базовый уровень DummyClassifier (
most_frequent) или DummyRegressor (mean). - Если это возможно, вычислите базовый уровень текущей системы, используя её предсказания на Вашем тестовом наборе.
- Изучите показатели на уровне человека по результатам эталонных тестов или научных публикаций.
- Обучите первую простую модель машинного обучения (логистическую регрессию или неглубокое дерево решений) и сравните все три результата.
- Переходите к сложным моделям только в том случае, если простая модель значительно превосходит базовый уровень — усложнение должно быть обосновано измеримым улучшением.
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_breast_cancer
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
models = {
'DummyClassifier': DummyClassifier(strategy='most_frequent'),
'LogisticRegression': Pipeline([('sc', StandardScaler()), ('clf', LogisticRegression(max_iter=1000))]),
'DecisionTree(d=5)': DecisionTreeClassifier(max_depth=5),
'RandomForest': RandomForestClassifier(random_state=42),
}
for name, model in models.items():
score = cross_val_score(model, X, y, cv=5, scoring='f1').mean()
print(f'{name}: F1={score:.3f}')Быстрая проверка
Проверьте своё понимание концепций машинного обучения с Python из этого урока.
Итоги урока
В этом уроке Вы узнали, что DummyClassifier задаёт нижнюю границу качества, которую должна превысить каждая реальная модель, чтобы приносить пользу, базовые уровни на основе точности вводят в заблуждение при несбалансированных наборах данных — всегда используйте одну и ту же метрику для сравнения базового уровня и реальной модели, а полный базовый уровень включает тривиальный классификатор, текущую промышленную систему и показатели на уровне человека, если они доступны. Далее мы начнём курс «Конвейер предварительной обработки данных» со систематических способов обработки пропущенных значений с помощью методов заполнения.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Базовые модели: всегда превосходите DummyClassifier» бесплатный?
Да — полный текст урока «Базовые модели: всегда превосходите DummyClassifier» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Machine Learning Academy, подпишись на CoddyKit PRO. Курс Machine Learning Academy содержит 4 уроков всего.
Чему я научусь в уроке «Базовые модели: всегда превосходите DummyClassifier»?
Вы создадите DummyClassifier как минимальную базовую модель и убедитесь, что любая настоящая модель должна превосходить её, прежде чем считаться полезной Ты практикуешь Machine Learning Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Machine Learning Academy?
Предыдущий опыт не требуется. Machine Learning Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Базовые модели: всегда превосходите DummyClassifier»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Machine Learning Academy?
Да. Каждый урок Machine Learning Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему нельзя оценивать модель на обучающих данных
- train_test_split: соотношения, начальные значения и стратификация
- Компромисс смещения и дисперсии: недообучение и переобучение
- Базовые модели: всегда превосходите DummyClassifier