Форум врачей-аспирантов

Здравствуйте, гость ( Вход | Регистрация )

> Как грамотно поделить выборку на несколько сегментов перед предсказанием?, Деление выборки по неизвестным критериям
smeilz
сообщение 7.07.2020 - 16:18
Сообщение #1





Группа: Пользователи
Сообщений: 7
Регистрация: 2.07.2020
Пользователь №: 39533



Добрый день.
Есть очень большая выборка для бинарной классификации. Нужно предсказать 2 класса(0/1)
Есть огромная куча предикторов(независимых переменных), все они категориальные, и известно, что выборка содержит в себе несколько сегментов, в которых поведение предсказываемых классов будет существенно отличаться. Количество сегментов неизвестно.
Как грамотно найти эти сегменты и поделить выборку для дальнейшего предсказания?

Сообщение отредактировал smeilz - 7.07.2020 - 16:19
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
 
Открыть тему
Ответов
passant
сообщение 8.07.2020 - 11:30
Сообщение #2





Группа: Пользователи
Сообщений: 231
Регистрация: 27.04.2016
Пользователь №: 28223



Уважаемый smeilz.

Что-то вы начинаете "путаться в показаниях". На другом форуме вы пишете:
Есть датасет с одним бинарным признаком(зависимой переменной) 0 или 1. Распределение 57/43
На этом:
Есть очень большая выборка для бинарной классификации. Нужно предсказать 2 класса(0/1)
Это как бы две совершенно разные задачи. В одном случае - обучение с учителем (т.е. датасет с признаком) , в другом - обучение без учителя (признака изначально нет).

Кроме того, вы так и не пояснили, что означает
поведение предсказываемых классов будет существенно отличаться.
как вы себе представляете "поведение класса"? В чем оно у час выражается?
Что такое "сегмент" и чем он в вашем представлении отличается от "класса". Подчеркну - "предсказываемых классов" ??

Что означает
Как грамотно найти эти сегменты и поделить выборку для дальнейшего предсказания?
Если вы разбиваете выборку на то-ли сегменты, то-ли классы, то что вы собираетесь предсказывать дальше?

Про кластеризацию, и ее возможное использование как предварительный этап классификации вам сказали что тут, что там. Но ясности как не было, так и нет.
И я еще раз повторю:
Поставьте четко задачу, а то создается все более уверенное впечатление, что вы вообще не очень понимаете, а что в итоге вам надо?

Сообщение отредактировал passant - 8.07.2020 - 11:32
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
smeilz
сообщение 10.07.2020 - 15:09
Сообщение #3





Группа: Пользователи
Сообщений: 7
Регистрация: 2.07.2020
Пользователь №: 39533



Цитата(passant @ 8.07.2020 - 11:30) *
Уважаемый smeilz.

Что-то вы начинаете "путаться в показаниях". На другом форуме вы пишете:
Есть датасет с одним бинарным признаком(зависимой переменной) 0 или 1. Распределение 57/43
На этом:
Есть очень большая выборка для бинарной классификации. Нужно предсказать 2 класса(0/1)
Это как бы две совершенно разные задачи. В одном случае - обучение с учителем (т.е. датасет с признаком) , в другом - обучение без учителя (признака изначально нет).

Кроме того, вы так и не пояснили, что означает
поведение предсказываемых классов будет существенно отличаться.
как вы себе представляете "поведение класса"? В чем оно у час выражается?
Что такое "сегмент" и чем он в вашем представлении отличается от "класса". Подчеркну - "предсказываемых классов" ??

Что означает
Как грамотно найти эти сегменты и поделить выборку для дальнейшего предсказания?
Если вы разбиваете выборку на то-ли сегменты, то-ли классы, то что вы собираетесь предсказывать дальше?

Про кластеризацию, и ее возможное использование как предварительный этап классификации вам сказали что тут, что там. Но ясности как не было, так и нет.
И я еще раз повторю:
Поставьте четко задачу, а то создается все более уверенное впечатление, что вы вообще не очень понимаете, а что в итоге вам надо?


Спасибо за вопросы и ответы.
Хорошо.
Есть датасет.
В нем примерно 70-80 категориальных признаков(независимых переменных или предикторов) и 1 категориальная(зависимая), которую я и буду предсказывать.
Распределение этой переменной 43%/57%. Вот 2 класса, которые уже присутствуют, соответственно я их и предсказываю.
Получается у нас датасет с признаком и обучение с учителем.

Про поведение я пожалуй не совсем корректно выразился.
Я имел ввиду, что по каким-то кускам нашей выборки прогноз будет не очень точным. Например 55% вероятность, что это класс 1 и 45% вероятность, что класс 0, их большинство.
Такие прогнозы мне не очень нужны, так как я буду часто ошибаться. Моя задача предполагает возможность отбросить куски данных и не давать по ним прогноза, если он не очень точный.
А есть куски, где прогнозы будут 65/35 или даже 70/30, они более точные, и я бы хотел брать те сегменты, где вероятность принадлежности к классу1 или классу0 больше определенного порога.
Соответственно у меня уже есть 3 сегмента.
1) Там, где прогноз класса0>65%
2) Там, где прогноз класса1> 65%
3) Остальные
Корректно ли так делать?
Если нет, то как грамотно?

В данный момент, я сделал так.
1) Взял пакет Catboost на python
2) Исключил оттуда признак, который мы предсказываем
3) Получил модель accuracy=63.5%
4) Провел на валидационной выборке, получил accuracy=62.5%
5) По тому, что качество модели упало незначительно, исключил Overfitting
6) Опытным путем нашел ту границу выбора класса0 и класса1, при которой процент ошибочных прогнозов не более 65%
(там можно автоматически задавать процент ошибки FPR и FNR, то я предпочел разобраться вручную)
В итоге что я хочу:
1)Более осознанно подходить к выбору признаков, например изучить их визуально при помощи визуализации на R. Возможно они дадут дополнительную информацию и буду точно понимать с каким признаками я имею дело. Меня ранее учили, что нельзя выбрасывать данные, даже если на первый взгляд кажется, что их влияние на целевую переменную очень маленькое, и даже если признаки скоррелированы.
2)Работать с данными не по принципу чёрного ящика, а лучше понимать, что я делаю, так как задача для меня интересная и хотелось бы повысить свой уровень понимания процесса
3)Понять какие ошибки я допустил в процессе и узнать, нужно ли балансировать данные, чтобы предсказываемые классы были в соотношении 50 на 50.

Сообщение отредактировал smeilz - 10.07.2020 - 15:20
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
ogurtsov
сообщение 10.07.2020 - 18:23
Сообщение #4





Группа: Пользователи
Сообщений: 127
Регистрация: 15.12.2015
Пользователь №: 27760



Цитата(smeilz @ 10.07.2020 - 15:09) *
Спасибо за вопросы и ответы.
Хорошо.
Есть датасет.
В нем примерно 70-80 категориальных признаков(независимых переменных или предикторов) и 1 категориальная(зависимая), которую я и буду предсказывать.
Распределение этой переменной 43%/57%. Вот 2 класса, которые уже присутствуют, соответственно я их и предсказываю.
Получается у нас датасет с признаком и обучение с учителем.

Про поведение я пожалуй не совсем корректно выразился.
Я имел ввиду, что по каким-то кускам нашей выборки прогноз будет не очень точным. Например 55% вероятность, что это класс 1 и 45% вероятность, что класс 0, их большинство.
Такие прогнозы мне не очень нужны, так как я буду часто ошибаться. Моя задача предполагает возможность отбросить куски данных и не давать по ним прогноза, если он не очень точный.
А есть куски, где прогнозы будут 65/35 или даже 70/30, они более точные, и я бы хотел брать те сегменты, где вероятность принадлежности к классу1 или классу0 больше определенного порога.
Соответственно у меня уже есть 3 сегмента.
1) Там, где прогноз класса0>65%
2) Там, где прогноз класса1> 65%
3) Остальные
Корректно ли так делать?
Если нет, то как грамотно?

В данный момент, я сделал так.
1) Взял пакет Catboost на python
2) Исключил оттуда признак, который мы предсказываем
3) Получил модель accuracy=63.5%
4) Провел на валидационной выборке, получил accuracy=62.5%
5) По тому, что качество модели упало незначительно, исключил Overfitting
6) Опытным путем нашел ту границу выбора класса0 и класса1, при которой процент ошибочных прогнозов не более 65%
(там можно автоматически задавать процент ошибки FPR и FNR, то я предпочел разобраться вручную)
В итоге что я хочу:
1)Более осознанно подходить к выбору признаков, например изучить их визуально при помощи визуализации на R. Возможно они дадут дополнительную информацию и буду точно понимать с каким признаками я имею дело. Меня ранее учили, что нельзя выбрасывать данные, даже если на первый взгляд кажется, что их влияние на целевую переменную очень маленькое, и даже если признаки скоррелированы.
2)Работать с данными не по принципу чёрного ящика, а лучше понимать, что я делаю, так как задача для меня интересная и хотелось бы повысить свой уровень понимания процесса
3)Понять какие ошибки я допустил в процессе и узнать, нужно ли балансировать данные, чтобы предсказываемые классы были в соотношении 50 на 50.

Вроде прояснилось.
Все деления по точности предиктов на трейне или даже на валидации бесполезны: для новых наблюдений все равно неизвестно, ошибается ли модель.
Вам нужна калибровка вероятности, которую дает классификатор - см., например, https://dyakonov.org/2020/03/27/%d0%bf%d1%8...81%d1%82%d0%b8/ Суть в том, что даже если классификатор выдает число в диапазоне от 0 до 1 (как логрег или более сложная нейросетка с сигмоидой на выходе), то это число лишь похоже на вероятность принадлежности к классу, но на самом деле вероятностью не является.
При помощи калибровки можно приблизить выхлоп модели к истинной оценке уверенности в предсказании, т.е. после калибровки в среднем из 100 предиктов со значением 0.6 в 60% случаев будет верно предсказан целевой класс.

Если копнуть еще глубже, то можно заняться интерпретацией модели с целью понять, почему она дает тот или иной ответ. Подходов много, но для выявления "проблемных" наблюдений можно прикрутить что-то типа https://pbiecek.github.io/ema/localDiagnostics.html

Сообщение отредактировал ogurtsov - 10.07.2020 - 18:26


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
smeilz
сообщение 10.07.2020 - 22:23
Сообщение #5





Группа: Пользователи
Сообщений: 7
Регистрация: 2.07.2020
Пользователь №: 39533



Цитата(ogurtsov @ 10.07.2020 - 18:23) *
Вроде прояснилось.
Все деления по точности предиктов на трейне или даже на валидации бесполезны: для новых наблюдений все равно неизвестно, ошибается ли модель.
Вам нужна калибровка вероятности, которую дает классификатор - см., например, https://dyakonov.org/2020/03/27/%d0%bf%d1%8...81%d1%82%d0%b8/ Суть в том, что даже если классификатор выдает число в диапазоне от 0 до 1 (как логрег или более сложная нейросетка с сигмоидой на выходе), то это число лишь похоже на вероятность принадлежности к классу, но на самом деле вероятностью не является.
При помощи калибровки можно приблизить выхлоп модели к истинной оценке уверенности в предсказании, т.е. после калибровки в среднем из 100 предиктов со значением 0.6 в 60% случаев будет верно предсказан целевой класс.

Если копнуть еще глубже, то можно заняться интерпретацией модели с целью понять, почему она дает тот или иной ответ. Подходов много, но для выявления "проблемных" наблюдений можно прикрутить что-то типа https://pbiecek.github.io/ema/localDiagnostics.html


Благодарю. Прочитал статью, буду изучать.
Что я сделал?
Я взял 3 похожих датасета только даже большего размера.
1 была совсем похожа и 2 других несколько отличались.
Установил те же границы prob0 и prob1 выбора класса0 и класса1, при которой процент верных прогнозов для класса1 не менее 69% и для класса0 не менее 55%.
Иными словами я сделал то, за что меня осудил 100$ и вы сказали, что это вероятностью не является, но я пока не могу применить знания из статьи и просто провожу эксперименты.
То есть отсекал все прогнозы, если Prob0 < эмпирического x1, и Prob1 < x2
РЕзультаты:
Для первого датасета, который был очень похож
1 Похожий датасет Дал 68.5% класс1 и 55.5% класс0
2 Менее похожих датасета дали нам 68% и 70% для класса1 и 51% и 51% для класса0

То есть несмотря на то, что эта вероятность(prob0/prob1) ей по сути не является, мы все равно получили устойчивые соотношения вероятностей предсказания целевого класса.
Да, для класса0 эта вероятность упала, но скорее всего это связано с отличием структуры двух последних выборок, и если мы один раз выставим нужный порог, то он будет неизменным.

Можно ли, принимая во внимание результаты этого эксперимента допустить, что это число в некоторых случаях можно использовать без калибровки вероятности, которую я не факт, что смогу сделать.
И какие выводы в целом можно сделать?

Сообщение отредактировал smeilz - 10.07.2020 - 22:25
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 

Сообщений в этой теме
- smeilz   Как грамотно поделить выборку на несколько сегментов перед предсказанием?   7.07.2020 - 16:18
- - ogurtsov   Кластеризацию нужно сделать, а уж какую - тут мног...   7.07.2020 - 20:07
- - passant   Уважаемый smeilz. Что-то вы начинаете "путат...   8.07.2020 - 11:30
|- - 100$   ЦитатаКроме того, вы так и не пояснили, что означа...   8.07.2020 - 19:41
|- - smeilz   Цитата(passant @ 8.07.2020 - 11:30) ...   10.07.2020 - 15:09
|- - ogurtsov   Цитата(smeilz @ 10.07.2020 - 15:09) ...   10.07.2020 - 18:23
|- - smeilz   Цитата(ogurtsov @ 10.07.2020 - 18:23...   10.07.2020 - 22:23
- - 100$   А мне очень интересно, как скоро в этой теме появ...   8.07.2020 - 18:42
|- - ogurtsov   Цитата(100$ @ 8.07.2020 - 18:42...   8.07.2020 - 19:05
- - passant   Нет, коллеги. В данном случае - вы ошибаетесь. Это...   8.07.2020 - 21:31
|- - 100$   passant, поскольку Андрей (Огурцов) ничего ошибо...   9.07.2020 - 00:17
- - passant   Цитата(100$ @ 9.07.2020 - 00:17...   9.07.2020 - 10:55
- - nokh   Цитата(smeilz @ 7.07.2020 - 18:18) Д...   9.07.2020 - 21:11
|- - 100$   Цитата(nokh @ 9.07.2020 - 21:11) Бол...   9.07.2020 - 21:50
||- - nokh   Цитата(100$ @ 9.07.2020 - 23:50...   10.07.2020 - 08:10
||- - 100$   Цитата(nokh @ 10.07.2020 - 08:10) Да...   10.07.2020 - 10:48
|- - smeilz   Цитата(nokh @ 9.07.2020 - 21:11) Ваш...   10.07.2020 - 15:13
- - comisora   Всем добрый день. Самая первая/последняя книга по...   10.07.2020 - 15:28
- - 100$   Ну вот, господа кластеризаторы и примкнувшие к ним...   10.07.2020 - 18:32
|- - ogurtsov   Цитата(100$ @ 10.07.2020 - 18:3...   10.07.2020 - 19:14
||- - 100$   Цитата(ogurtsov @ 10.07.2020 - 19:14...   10.07.2020 - 20:30
||- - smeilz   Цитата(ogurtsov @ 10.07.2020 - 19:14...   10.07.2020 - 21:57
|- - smeilz   Цитата(100$ @ 10.07.2020 - 18:3...   10.07.2020 - 21:53
||- - 100$   Цитата(smeilz @ 10.07.2020 - 21:53) ...   10.07.2020 - 22:56
|- - smeilz   Цитата(100$ @ 10.07.2020 - 18:3...   10.07.2020 - 22:42
- - passant   Цитата(smeilz @ 10.07.2020 - 22:42) ...   10.07.2020 - 23:18


Добавить ответ в эту темуОткрыть тему