У мене виникають багато проблем з розумінням того, як функціонує class_weight
параметр логістичної регресії scikit-learn.
Ситуація
Я хочу використовувати логістичну регресію, щоб зробити бінарну класифікацію на дуже незбалансованому наборі даних. Класи мають позначення 0 (негативний) та 1 (позитивний), і спостережувані дані знаходяться у співвідношенні приблизно 19: 1, більшість зразків мають негативний результат.
Перша спроба: підготовка даних про навчання вручну
Я розділив отримані нами дані на непересічні набори для навчання та тестування (приблизно 80/20). Потім я випадковим чином відбирав дані тренувань вручну, щоб отримати дані тренувань у різних пропорціях, ніж 19: 1; від 2: 1 -> 16: 1.
Потім я тренував логістичну регресію на цих різних підмножинах даних тренувань і будував графічний відкликання (= TP / (TP + FN)) як функцію різних пропорцій тренувань. Звичайно, відкликання було обчислено на непересічних зразках TEST, які мали дотриману пропорцію 19: 1. Зауважте, хоча я тренував різні моделі за різними даними про навчання, я обчислював виклик для всіх їх на одних і тих же (непересічних) даних тесту.
Результати були такими, як і очікувалося: відкликання становило близько 60% при пропорціях тренувань 2: 1 і впало досить швидко до того моменту, коли він досяг 16: 1. Було кілька пропорцій 2: 1 -> 6: 1, коли відкликання було гідно вище 5%.
Друга спроба: пошук сітки
Далі я хотів перевірити різні параметри регуляризації, і тому я використав GridSearchCV і зробив сітку з кількох значень C
параметра, а також class_weight
параметра. Щоб перевести мої n: m пропорції негативні: позитивні навчальні зразки на мову словника, class_weight
я подумав, що я просто вкажу кілька словників так:
{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 } #expected 4:1
і я також включав None
і auto
.
Цього разу результати були повністю пробиті. Усі мої відкликання виходили крихітними (<0,05) за кожне значення, за class_weight
винятком auto
. Тож я можу лише припустити, що моє розуміння того, як встановити class_weight
словник, є неправильним. Цікаво, що class_weight
значення "автоматичного" в пошуку в сітці становило близько 59% для всіх значень C
, і я здогадався, що він відповідає 1: 1?
Мої запитання
Як ви правильно використовуєте
class_weight
для досягнення різних балансів у навчальних даних від того, що ви насправді надаєте? Зокрема, до якого словника я переходжу, щобclass_weight
використовувати n: m пропорції мінус: позитивні навчальні зразки?Якщо ви
class_weight
передаєте різні словники до GridSearchCV, під час перехресної перевірки вона повторно врівноважить дані тренувальної складки відповідно до словника, але використовуватиме справжні задані пропорції пропорцій для обчислення моєї функції оцінювання на тестовій складці? Це критично важливо, оскільки будь-який показник корисний для мене, лише якщо він виходить із даних у спостережуваних пропорціях.Що означає
auto
значення,class_weight
що стосується пропорцій? Я читаю документацію, і я припускаю, що "врівноважує дані, обернено пропорційні їх частоті", це означає, що це робить 1: 1. Це правильно? Якщо ні, то хтось може уточнити?