Чи потрібно використовувати незбалансований клас, коли я використовую під час вибірки мої набори даних перевірки / тестування?


14

Я початківець у машинному навчанні і зіткнувся з ситуацією. Я працюю над проблемою встановлення ставок у режимі реального часу з набором даних 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. Який набір даних я повинен використовувати для тестування? C або C '

  3. Які показники є найбільш релевантними для оцінки моєї моделі? F1Score здається добре використаним показником. Але тут через незбалансований клас (якщо я використовую набори даних B і C), точність низька (до 0,20), і на F1Score дуже сильно впливає низьке виклик / точність. Чи було б точніше використовувати aucPR або aucROC?

  4. Якщо я хочу побудувати криву навчання, які показники я повинен використовувати? (знаючи, що помилка% не має значення, якщо я використовую набір даних B для перевірки)

Заздалегідь дякую за ваш час!

З повагою

Відповіді:


10

Чудове запитання ... Ось кілька конкретних відповідей на ваші нумеровані запитання:

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

2) Ви повинні протестувати як на C, так і на C` на підставі 4 нижче.

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

4)Це стає справді складним. Проблема в цьому полягає в тому, що найкращий метод вимагає переосмислити, як повинні виглядати криві навчання, або використовувати як повторно вибіркові, так і оригінальні набори даних.

Класична інтерпретація кривих навчання:

  • Переобладнання - лінії не зовсім збираються;
  • Underfit - рядки збираються разом, але занизький бал F1;
  • Тільки правильно - рядки поєднуються з розумним F1 балом.

Тепер, якщо ви тренуєтесь на A` і тестуєте на C, лінії ніколи повністю не зійдуться. Якщо ви тренуєтесь на A` і тестуєте на C`, результати не матимуть сенсу в контексті початкової проблеми. Так, що ти робиш?

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

Тепер нова інтерпретація кривих вашого навчання:

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

Загальне : Я наполегливо пропоную для неврівноважених класів спершу спробувати коригувати вагу свого класу в алгоритмі навчання, а не надмірно / недостатньо відбирати вибірки, оскільки це дозволяє уникнути суворої моралі, яку ми окреслили вище. Це дуже просто в таких бібліотеках, як scikit-learning і досить легко вручити код у будь-якому, що використовує сигмоподібну функцію або більшість голосів.

Сподіваюся, це допомагає!


Велике спасибі @ AN605. Це так приємно з вас! У мене є кілька запитань: Для 4) - Коли ви говорите "тренуватися на A" і тестувати на B ", ти маєш на увазі валідацію? - "генерувати криві навчання для балів C" та "F1 (C) менше / аналогічно F1 (B)". Я, хоча, для кривої навчання нам довелося побудувати метрику помилок для навчального набору (A або A 'тут) та метрику помилок лише для валідаційного набору (B або B'). Ви тут не "перевіряли"?
jmvllt

Щодо використання "класових ваг", виправте мене, якщо я помиляюся (я просто швидко ознайомився з цим), але ця хитрість передбачає "змінити" функцію витрат, додавши коефіцієнт / вага "k" перед неврівноважений клас, правда? : 􏲏 Вартість (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) Так, алгоритм повинен вважати помилкову класифікацію позитивного класу як важливішого. Але річ у тому, що я "мушу" використовувати Apache Spark & ​​MLlib для створення своєї всієї моделі. І я не впевнений, що я можу легко змінити свою функцію витрат за допомогою іскри. У будь-якому випадку дякую за вашу час!
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, дякую за класну відповідь. Для F1Score проблема, яку я мав, полягає в тому, що я, можливо, захочу більше зосередитись на усуненні помилкових позитивів більше, ніж на хибному негативі. Чи правильно було б додавати різну "вагу" для FP та FN в обчисленні точності та відкликання?
jmvllt

Це для мене сенс. Також ваш опис зважування класів правильний, і я не бачу його впровадженого в MLib, але, можливо, варто запитати про особливості
jamesmf

Гаразд дякую Джеймс! В даний час я намагаюся зробити це самостійно, розширивши клас LogisticGradient і перезаписавши метод обчислення. Я дам вам знати, якщо це дасть мені хороші результати. Гарного дня.
jmvllt

2

Ви повинні перевірити свій класифікатор на наборі даних, який відображає, чому він буде використовуватися. Найкраще, як правило, немодифікований розподіл.

Під час навчання змініть набір даних будь-яким чином, що вам допоможе.

Детальніше див. У розділі " Чи слід шукати" збалансований "набір даних або" представницький "набір даних?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.