У мене виникають багато проблем з розумінням того, як функціонує 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. Це правильно? Якщо ні, то хтось може уточнити?