- Вопрос или проблема
- Ответ или решение
- 1. Почему Random Forest всегда предсказывает большинство классов?
- 1.1. Проблема с балансом классов
- 1.2. Сложность задачи
- 1.3. Гиперпараметры
- 2. Как исправить ситуацию?
- 2.1. Балансировка классов
- 2.2. Увеличение сложности модели
- 2.3. Аугментация метрик
- 2.4. Настройка процедуры перекрестной проверки
- 2.5. Другие алгоритмы
- Заключение
Вопрос или проблема
Я предсказываю исход болезни, используя биологические данные (метаболиты плюс ковариаты: возраст, пол и ИМТ). Исход является бинарной переменной и умеренно несбалансирован (~12% положительных случаев). У меня относительно большое число признаков (~600) по сравнению с числом наблюдений (n=2000).
Модели, которые я использую для предсказания исхода, это гребневая регрессия, SVM и случайный лес (RF), все в scikit-learn. Качество предсказания во всех случаях невпечатляющее (AUC-ROC ~0.6). Тем не менее, RF почти исключительно предсказывает класс большинства, в то время как гребневая регрессия и SVM немного более сбалансированы в своих предсказаниях. Хотя я не ожидаю значительного улучшения, мне было бы неудобно делать сравнения между моделями сейчас, так как кажется, что RF не был обучен.
Основные вопросы, которые меня интересуют: почему это происходит с RF, но не с другими моделями, которые я использовал, и как я могу это исправить?
Что я пробовал
class_weight
с различными весами (включая сбалансированный и сбалансированный_подвыбор). Хотя иногда есть небольшое улучшение, в целом полнота постоянно ниже 0.05 (хотя часто 0).- Оптимизация гиперпараметров по следующей сетке не привела к изменению тенденции просто предсказывать класс большинства (
scoring='roc_auc'
):
param_grid = {'n_estimators': [50, 100, 200, 800, 1400],
'max_features': [50, 100, 200, 325],
'max_depth': [10, 20, 30, 40],
'min_samples_split': [2, 5, 10, 15],
'min_samples_leaf': [1, 2, 4, 8]}
-
Поскольку другие модели были оптимизированы с
scoring='roc_auc'
, я хотел бы сохранить это для RF для сопоставимости. Тем не менее, я экспериментировал сscoring='recall'
вRandomizedSearchCV
, хотя это ничего не изменило. -
Я пробовал недовыбор, чтобы сделать распределение классов более равномерным (~60:40), и это приводит к большему предсказанию класса меньшинства (полнота ~ 0.3), как и ожидалось. Тем не менее, я предпочел бы иметь тот же эффект, не выбрасывая много своих данных. Я не думаю, что переобучение имеет смысл для моих данных и предпочёл бы не использовать его.
Другие замечания:
- Я использую
StratifiedGroupKFold
в своей вложенной кросс-валидации (как внутренней, так и внешней). - Код, который я использую, был таким же для других моделей, для которых у меня не было этой проблемы, что предполагает, что ошибки в коде вряд ли могут быть причиной.
- В любых переменных нет крайних или странных результатов.
- Я экспериментировал с техниками уменьшения размерности по отдельности, но смог значительно сократить число переменных.
- Возраст и ИМТ были стандартализированы с использованием
StandardScaler
; в противном случае все переменные находятся на схожем масштабе.
Ответ или решение
Ответ на вопрос: Почему Random Forest всегда предсказывает большинство классов и как это исправить?
При работе с небалансированными датасетами, особенно когда один из классов составляет лишь 12% от общего числа случаев, может возникнуть ситуация, когда алгоритм, такой как Random Forest (RF), не обучается должным образом и в итоге предсказывает только большинство классов. Вам необходимо рассмотреть несколько аспектов, чтобы понять причины этой проблемы и найти возможные решения.
1. Почему Random Forest всегда предсказывает большинство классов?
1.1. Проблема с балансом классов
Небалансированные данные представляют собой основную причину, по которой Random Forest может не учитывать малый класс. В случаях, когда модель сталкивается с высоким дисбалансом, деревья решений, составляющие лес, могут иметь тенденцию «запоминать» ассоциации, ведущие к большинству, а не к меньшинству. Сравнительно низкий вес редко встречающихся классов может привести модель к игнорированию их при принятии решений.
1.2. Сложность задачи
С учетом большого количества признаков (600) относительно небольшого количества наблюдений (2000), Random Forest может испытывать проблемы с переобучением. Модель может сосредоточить внимание на высокочастотных признаках (характерных для большинства классов), забывая о редких, что может объяснять ее предвзятость в сторону большинства.
1.3. Гиперпараметры
Неоптимальные значения гиперпараметров могут также влиять на предсказания модели. Параметры, такие как max_depth
, min_samples_split
и min_samples_leaf
, могут приводить к построению слишком простых деревьев, которые не способны уловить закономерности не только в большинстве, но и в меньшинстве.
2. Как исправить ситуацию?
2.1. Балансировка классов
Продолжайте использовать class_weight
, но также рассмотрите дополнительные техники балансировки данных, такие как SMOTE (Synthetic Minority Over-sampling Technique). Хотя вы упомянули, что не хотите использовать добавление данных, SMOTE может улучшить вес класса меньшинства, не отбрасывая данные большинства.
2.2. Увеличение сложности модели
Измените гиперпараметры для увеличения их сложности. Например, попробуйте более глубокие деревья, установив max_depth
в 50 или более, чтобы модель могла учитывать больше взаимодействий между признаками.
param_grid = {
'n_estimators': [100, 200, 400],
'max_features': ['sqrt', 'log2'],
'max_depth': [None, 10, 20, 30, 50],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2]
}
2.3. Аугментация метрик
Используйте дополнительные метрики для оценки результатов. Включите F1-меру и AUC-PR (Precision-Recall Area Under the Curve) для более сложного анализа. Эти метрики могут лучше отразить точность модели, когда важность положительных предсказаний велика.
2.4. Настройка процедуры перекрестной проверки
С помощью StratifiedGroupKFold
вы можете обеспечить более равномерное распределение классов в обучающих и тестовых выборках. Это также поможет модели лучше обобщать на меньшинство классов.
2.5. Другие алгоритмы
Если проблема не решается, рассмотрите другие алгоритмы, которые могут работать лучше в условиях сильного дисбаланса, такие как XGBoost или LightGBM, где можно использовать встроенные методы борьбы с дисбалансом классов.
Заключение
Основная цель вашего анализа должна состоять в понимании природы ваших данных и в корректной интерпретации параметров модели. Random Forest может быть мощным инструментом, но его применение к несбалансированным данным требует дополнительных усилий в плане настройки и предварительной обработки. Вы можете значительно улучшить качество предсказаний, регулируя классовые веса, оптимизируя гиперпараметры и, возможно, пробуя другие методы моделирования.