Классификация машинного обучения с использованием независимых моделей для каждого класса

Имеет ли это смысл? Сравнение с голосующими ансамблями

Рассмотрим ситуацию бинарной классификации, когда одна модель лучше предсказывает первый класс, а другая модель лучше предсказывает второй класс.
Для начала создадим синтетический набор данных:

В этот раз ради простоты реализации мы не будем использовать кросс-валидацию, а обойдемся простым сплит обучение/тестирование:

Теперь давайте напишем функцию для подгонки и оценки моделей:

Теперь давайте посмотрим на модели:

Матрица путаницы теперь показывает, что модель «а лучше работает с классом 0, чем с классом 1, а модель «б» лучше с классом 1, чем с классом 0.
Вот где идея ​ Предоставление модели а всего набора тестовых данных, а затем предоставление модели б фрагмента набора тестовых данных после того, как модель а обработала его. Те модели а в случае бинарной классификации делят набор данных на 2 класса, а модель б получает набор данных с предсказанным либо первым, либо вторым классом.
Суть в том, что одна модель проверяет работу другой на классе, который он предсказывает лучше.
А теперь давайте предскажем оба класса, используя модель а:

Видно, что модель «а» определила 262 образца как класс 0 и 238 как класс 1. Согласно матрице путаницы — это 234+28 и 16+222. Да, внимательно изучите матрицу путаницы в приведенном выше фрагменте кода с первым взглядом на модели, чтобы не запутаться.
Поскольку из матрицы путаницы видно, что модель «b» работает лучше. с классом 1, давайте (на этот раз):

Из этого и предыдущего куска кода видно, что модель «b» получила 238 образцов с классом 1 и среди этих 238 образцов нашла 19 образцов класса 0. Похоже, что модель «б» действительно «подчистилась» после модели «а».
Теперь нам нужно рассчитать общую точность двух моделей и сравнить с тем, как они справились поодиночке. Для этого объедините результаты:

Оказалось, что с классом 0 теперь всего 9 ошибок, а с классом 1 целых 40. Это не тот результат, который я ожидал увидеть. Однако в некоторых случаях это может быть полезно, когда важнее совершать меньше таких ошибок, игнорируя при этом другие. В данном случае меня больше беспокоит снижение точности по сравнению с одиночной работой обеих моделей.
Добавим метод выше в одну функцию и пусть модель «б» теперь работает не с классом 1, а с классом 0:

На этот раз модель «b» получила 262 образца класса 0, определенных моделью «a». Из этих 262 образцов класса 0 модель «b» идентифицировала 37 образцов класса 1. Всего мы получили 34 ошибки для класса 0 и 9 ошибок для класса 1. И самое главное — этот подход показал себя лучше по точности, превысив производительность обеих моделей по отдельности.
Можно ли добиться еще лучшего результат, если модели поменять местами? Давай выясним!

На этот раз модель b получила 244 образца класса 0, определенных моделью a. Из этих 244 образцов класса 0 модель b идентифицировала 19 образцов класса 1. И это никак не повлияло на результат. Эти перестановки моделей местами сути не меняют, но меняют суть выбора класса для второй модели.
А теперь сравним результат с работой Голосующих ансамблей:

from sklearn.ensemble import VotingClassifier
# call hard voting ensemble
predictor(VotingClassifier(estimators=[('a', model_a), ('b', model_b)], voting='hard'))

# VotingClassifier results:
# Accuracy: 90.2%
# [[241   9]
#  [ 40 210]]
# Processed in  0.1990 seconds

Жёсткое голосование показало именно тот результат, который был достигнут при постановке модели «б» на работу класса 1.

# call soft voting ensemble
predictor(VotingClassifier(estimators=[('a', model_a), ('b', model_b)], voting='soft'))

# VotingClassifier results:
# Accuracy: 91.6%
# [[230  20]
#  [ 22 228]]
# Processed in  0.2079 seconds

Мягкое голосование показало лучший результат среди всех моделей и подходов.
Подробнее об ансамблях читайте здесь:



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



Если вам нужно что-то попроще, то вам сюда: