Должен ли я использовать несбалансированный класс в рамках выборки в моих наборах данных для проверки / тестирования?

13

Я новичок в машинном обучении и сталкиваюсь с ситуацией. Я работаю над проблемой ставок в реальном времени с набором данных IPinYou и пытаюсь сделать прогноз клика.

Дело в том, что, как вы, возможно, знаете, набор данных очень несбалансирован: около 1300 отрицательных примеров (без кликов) на 1 положительный пример (клик).

Это то чем я занимаюсь:

  1. Загрузите данные
  2. Разделите набор данных на 3 набора данных: A = Обучение (60%) B = Проверка (20%) C = Тестирование (20%)
  3. Для каждого набора данных (A, B, C) выполните недостаточную выборку для каждого отрицательного класса, чтобы получить соотношение 5 (5 отрицательных примеров для 1 положительного примера). Это дает мне 3 новых набора данных, которые являются более сбалансированными: A 'B' C '

Затем я тренирую свою модель с набором данных A 'и логистической регрессией.

Мой вопрос:

  1. Какой набор данных мне нужно использовать для проверки? B или B '?

  2. Какой набор данных мне нужно использовать для тестирования? С или С '

  3. Какие показатели наиболее актуальны для оценки моей модели? F1Score, кажется, хорошо используемый показатель. Но здесь из-за несбалансированного класса (если я использую наборы данных B и C), точность низкая (ниже 0,20), и на F1Score очень влияет низкая отзывчивость / точность. Будет ли правильнее использовать aucPR или aucROC?

  4. Если я хочу построить кривую обучения, какие метрики я должен использовать? (зная, что ошибка% не имеет значения, если я использую набор данных B для проверки)

Спасибо заранее за ваше время !

С уважением.

jmvllt
источник

Ответы:

9

Отличный вопрос ... Вот некоторые конкретные ответы на ваши пронумерованные вопросы:

1)Вы должны пройти перекрестную проверку на B, а не на B`. В противном случае вы не будете знать, насколько хорошо работает баланс вашего класса. Это не повредит перекрестной проверке как на B, так и на B`, и будет полезно, основываясь на ответе на 4 ниже.

2) Вы должны провести тесты как на C, так и на C` на основании 4 ниже.

3)Я бы придерживался F1, и было бы полезно использовать ROC-AUC, и это обеспечивает хорошую проверку работоспособности. Оба имеют тенденцию быть полезными с несбалансированными классами.

4)Это становится действительно сложно. Проблема в том, что лучший метод требует, чтобы вы переосмыслили то, как должны выглядеть кривые обучения, или использовали как повторные выборки, так и исходные наборы данных.

Классическая интерпретация кривых обучения:

  • Overfit - Линии не совсем сходятся;
  • Нижнее белье - Линии сходятся, но при слишком низком значении F1;
  • Just Right - Линии идут вместе с разумным счетом F1.

Теперь, если вы тренируетесь на A` и тестируете на C, линии никогда не сойдутся полностью. Если вы тренируетесь на A` и тестируете на C`, результаты не будут значимыми в контексте исходной задачи. Ну так что ты делаешь?

Ответ состоит в том, чтобы тренироваться на A` и тестировать на B`, но также тестировать на B. Получите балл F1 для B` там, где вы хотите, затем проверьте балл F1 для B. Затем проведите тестирование и сгенерируйте кривые обучения. для C. Кривые никогда не сойдутся, но у вас будет ощущение приемлемого смещения ... это разница между F1 (B) и F1 (B`).

Теперь новая интерпретация ваших кривых обучения:

  • Overfit - Линии не сходятся и находятся дальше друг от друга, чем F1 (B`) -F1 (B);
  • Нижнее белье - Линии не сходятся, но разница меньше, чем F1 (B`) -F1 (B), а показатель F1 (C) ниже F1 (B);
  • Совершенно верно - линии не сходятся, но разница меньше, чем F1 (B`) -F1 (B) с баллом F1 (C), аналогичным F1 (B).

Общие сведения : Я настоятельно рекомендую, чтобы для несбалансированных классов вы сначала попытались откорректировать вес вашего класса в алгоритме обучения вместо чрезмерной / недостаточной выборки, поскольку это позволяет избежать всей строгости морали, которую мы обрисовали выше. Он очень прост в библиотеках, таких как scikit-learn, и довольно прост в написании кода для всего, что использует сигмовидную функцию или большинство голосов.

Надеюсь это поможет!

AN6U5
источник
Большое спасибо @ AN605. Это так мило с твоей стороны! У меня есть несколько вопросов: Для 4) - Когда вы говорите «тренироваться на А» и тестировать на В », вы имеете в виду валидацию? - «создать кривые обучения для C» и «F1 (C) оценка ниже / аналогична F1 (B)». Я думал, что для кривой обучения мы должны были построить метрику ошибки для обучающего набора (здесь A или A ') и метрику ошибки только для проверочного набора (B или B'). Разве вы не «проверяете» здесь C?
JMVLLT
Насчет использования "весов классов", поправьте меня, если я ошибаюсь (я только что быстро об этом узнал), но этот трюк включает в себя "модификацию" функции стоимости путем добавления коэффициента / веса "k" перед несбалансированный класс, верно? : 􏲏 Стоимость (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)). Таким образом, алгоритм должен учитывать ошибочную классификацию. положительного класса как более важного. Но дело в том, что мне «нужно» использовать Apache Spark & ​​MLlib для построения всей моей модели. И я не уверен, что смогу легко изменить свою функцию стоимости с помощью spark. В любом случае спасибо за вашу время!
JMVLLT
5

Ибо, 1)и 2)вы хотите

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

Поэтому для этих наборов данных вам не нужно балансировать классы.

Вы также можете попытаться использовать веса классов вместо недостаточной / избыточной выборки, так как это позаботится об этом решении за вас.

Поскольку 3)вы, вероятно, хотите оптимизировать, используя любую метрику, по которой вы будете оцениваться (если это соревнование). Но если это не рассмотрение, все эти модели - прекрасный выбор. F1 может зависеть от низкой точности, но вы хотите, чтобы это было зафиксировано. Именно тогда, когда некоторые наивные модели (например, угадывают класс большинства) могут хорошо оценить по некоторым показателям, такие оценки, как F1, актуальны.

Что касается того, что 4)нет ничего плохого в том, чтобы показать, какой показатель вы оптимизируете.

jamesmf
источник
Привет @jamesmf, спасибо за этот классный ответ. Для F1Score проблема, с которой я столкнулся, заключается в том, что я могу больше сосредоточиться на устранении ложного положительного результата, чем на ложном отрицательном. Правильно ли было бы добавить различный «вес» для FP и FN в вычислениях точности и отзыва?
JMVLLT
Это имеет смысл для меня. Также ваше описание весов классов является правильным, и я не вижу его реализованным в MLib, но это может стоить запроса на добавление функций
jamesmf
Хорошо, спасибо, Джеймс! В настоящее время я пытаюсь сделать это самостоятельно, расширяя класс LogisticGradient и перезаписывая метод compute. Я дам вам знать, если это даст мне хорошие результаты. Хорошего дня.
JMVLLT
2

Вы должны проверить свой классификатор на наборе данных, который представляет, почему он будет использоваться. Лучшим обычно является немодифицированное распределение.

Во время обучения измените набор данных так, как вам удобно.

Подробности см. В разделе Должен ли я использовать «сбалансированный» набор данных или «репрезентативный» набор данных?

Dal
источник