@Guywithinterest

Что делать с экстремально дисбалансным датасетом?

Передо мной стоит задача классификации с тремя классами и чрезвычайно дисбалансным датасетом.

Распределения в тестовом и тренировочном сетах такие:
6497ec4241fbf198048660.png

Тестовый набор данных полностью отражает реальное распределение данных из жизни, поэтому он ценен для честной оценки модели. В нем лежат :
113 тыс. выборок класса 2,
900 выборок класса 1
240 выборок класса 0.

Тренировочный набор данных содержит:
1 миллион выборок класса 2,
262 тыс. выборок класса 1
102 тыс. выборок класса 0.

Веса классов из тестового сета который имеет распределение из реальной задачи из реальной жизни, равны:
{2: 0.33674243092169065, 1: 41.56039173014146, 0: 158.4813278008299}


Я знаю обо всех известных техниках и методиках, и перепробовал очень многое:

- оверсемплил SMOTE'ом и обучал на распределении 1 к 1 с миллионом сэмплов для каждого класса
- использовал обучение с весами из тренировочного класса
- даунсемплил самый большой класс 2
- пробовал разные модели, вроде Random Forest, XGBoost, AdaBoost, Decision Tree и другие.

И попробовав и перепробовав все, я получил максимум такие результаты:
6497ecb2e0016796526180.png

Они меня не устраивают. Как эту задачу решить?
  • Вопрос задан
  • 218 просмотров
Пригласить эксперта
Ответы на вопрос 2
Maksim_64
@Maksim_64
Data Analyst
1. Метрики используй либо ROC, а лучше матрицу ошибок классификации (confusion matrix). Тебе здесь необходимо смотреть в сторону байесовых интерпретации теории вероятности.

2. Не один из методов работы с выборками не гарантирует решения проблемы. (Что не означает что от них надо отказаться, я бы попробовал сгенерировать дополнительные данные)

3. Посмотри в сторону алгоритмов "детекции аномалий". Из известных алгоритмов SVM может быть использован ну у них есть и свои более специализированные (даже для медицины свои бывают). гугли anomaly detection classification python или на чем ты там реализуешь и изучай. Это большая тема в машинном обучении и вообще отдельный навык и например какой то датасаентист может фокусироваться только на детекции аномалий.

Ты наверное знаешь в теории вероятностей есть Bayes байесова интерпретация (мы смотрим на вероятность как степень уверенности) и что называется Frequentism мы смотрим на вероятность как частоту на длинной дистанции. Так вот тебе нужно смотреть в сторону байесовой здесь, как по метрикам так и по алгоритмам. Алгоритмы детекции аномалий я в контексте данного вопроса так же отношу к ним.

Что касается твоих замечаний, то ты прав. Модель имеет сильную предрасположенность, что мешает обучению. Собственно я по этому и дал советы выше.
Ответ написан
@rPman
А задача в принципе решаема? На обучающих данных какие оценки дает? нет ли признака переобученности для классов 0 и 1? (т.е. для оубчающей выборки там будут большие значения а на тестовой маленькие). Уменьши размерность сети.

Покажи отчет обучения на сокращенной выборке по классу 2 раза в 3 чтобы объем был сравним с другими классами.

Еще вариант - определи веса class_weight для несбалансированного класса, чем больше размер тем меньше вес.

Еще, не понимаю почему твои тесты имеют другое распределение, плюнь на текущее распределение train/test и случайно выбери из train распределения тестовую часть (или задай validation_split и shuffle=True) и заново проведи обучение. Соотношение примеров по каждым классом сделай равным (т.е. если количество примеров 2 в три раза больше чем для 1+0, значит то же самое и в тестовой выборке должно быть)

p.s. еще гуглится (вернее сказать Бинго-чатится) MetaBalance, автоматически тюнит глобальные параметры и функцию потерь как раз на несбалансированные классы

p.p.s. от себя добавлю, попробуй построй ансамбль сетей, обучи сетку которая ищет только два класса - это большой класс 2 и а другой класс - все остальные 0+1 (он уже будет не такой несбалансированный), затем отдельно обучи сетку на данных состоящих только из классов 0+1 на их выявление, т.е. вместо одной сети у тебя будет две - первая выделит несбалансированный класс, вторая на основе ее результата - будет уже выявлять подклассы 0-1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы