Как заставить SGD Classifier работать так же хорошо, как и логистическая регрессия, используя parfit
Для больших наборов данных, используя гиперпараметры, оптимизированные parfit, мы можем получить эквивалентную производительность от SGDClassifier в трети времени, затрачиваемого LogisticRegression.
Что такое классификатор SGD?
SGD Classifier реализует регуляризованные линейные модели со стохастическим градиентным спуском.
Итак, что такое стохастический градиентный спуск?
Стохастический градиентный спуск учитывает только 1 случайную точку при изменении весов, в отличие от градиентного спуска, который учитывает все данные обучения. Таким образом, стохастический градиентный спуск намного быстрее, чем градиентный спуск, при работе с большими наборами данных. Вот хороший ответ на Quora, который подробно объясняет разницу между градиентным спуском и стохастическим градиентным спуском.
Зачем нам вообще нужен классификатор SGD, если у нас уже есть логистическая регрессия?
Логистическая регрессия по умолчанию использует градиентный спуск, и поэтому было бы лучше использовать классификатор SGD для больших наборов данных. Еще одна причина, по которой вы можете захотеть использовать классификатор SGD, заключается в том, что логистическая регрессия в ее оригинальной форме sklearn не будет работать, если вы не можете сохранить набор данных в ОЗУ, но SGD все равно будет работать.
Как сделать так, чтобы классификатор SGD работал так же хорошо, как и логистическая регрессия?
По умолчанию классификатор SGD не работает так же хорошо, как логистическая регрессия. Это требует некоторой настройки гиперпараметров.
Оптимизация гиперпараметров с использованием парфита:
Parfit - это новый пакет, написанный моим коллегой и однокурсником MSAN в Университете Сан-Франциско Джейсоном Карпентером. Этот пакет (с использованием параллельной обработки) позволяет пользователю выполнять исчерпывающий поиск по сетке модели, что дает пользователю гибкость при указании набора проверки, метрики оценки и, при необходимости, построения оценок по сетке введенных гиперпараметров. Подробнее об этом пакете вы можете прочитать в этом посте на носителе.
Основная причина, по которой вы можете захотеть использовать parfit, заключается в том, что он дает вам гибкость при оценке вашей метрики на отдельном наборе проверки, в отличие от GridSearchCV, который вместо этого использует перекрестную проверку. Перекрестная проверка не всегда является хорошей идеей. Одна из причин, по которой вы можете не захотеть использовать перекрестную проверку, - это когда в данных есть компонент времени. Например, в этом случае вы можете захотеть создать набор проверки, используя самые последние 20% наблюдений. Рэйчел Томас из fast.ai написала в блоге действительно хороший пост на тему Как (и почему) создать хороший набор для проверки ».
В этой статье я буду рассматривать эффективность набора для валидации как индикатор «насколько хорошо работает модель?». Показатель здесь - sklearn.metrics.roc_auc_score.
Parfit на логистической регрессии:
В качестве эталона мы будем использовать логистическую регрессию со штрафом «l2». Для логистической регрессии мы настроим 1 гиперпараметр C.
C = 1 / λ, где λ - параметр регуляризации. Меньшие значения C указывают на более сильную регуляризацию. Поскольку parfit подбирает модель параллельно, мы можем задать широкий диапазон параметров для C, не беспокоясь о накладных расходах, чтобы найти лучшую модель.
Как использовать парфит:
bestFit принимает следующие параметры:
- Модель: в нашем случае входной моделью является логистическая регрессия. Обратите внимание, что функция принимает в качестве входных данных только класс, а не его объект.
- paramGrid: объект ParmeterGrid с гиперпараметрами для запуска вашей модели.
- X_train, y_train, X_val, y_val: наборы для обучения и проверки.
- metric: показатель для оценки вашей модели.
- bestScore: возвращает наивысший балл, когда пройдено максимальное значение.
Он не только возвращает bestModel вместе со своим bestScore, но также возвращает allModel вместе с их allScores.
Вывод:
На поиск лучшей модели LogisticRegression ушло около 26 минут. Такая большая продолжительность - одна из основных причин, почему рекомендуется использовать SGDClassifier вместо LogisticRegression. Лучшее roc_auc_score, которое мы получаем, составляет 0,712 для C = 0,0001.
Давайте посмотрим на roc_curve для нашей лучшей модели:
Parfit на классификаторе SGD:
Как и в случае с логистической регрессией, мы будем использовать штраф «l2» для классификатора SGD. Здесь следует отметить один важный гиперпараметр - n_iter. "N_iter" в документации по sklearn определяется как
«Количество проходов по обучающим данным (иначе говоря, эпохи)».
n_iter в sklearn по умолчанию - None. Мы устанавливаем здесь достаточно большую сумму (1000). Альтернативный параметр для n_iter, который был недавно добавлен, - max_iter. Тот же совет следует применить к max_iter.
Альфа-гиперпараметр служит двойной цели. Это и параметр регуляризации, и начальная скорость обучения согласно расписанию по умолчанию. Это означает, что, помимо регуляризации коэффициентов логистической регрессии, выходные данные модели зависят от взаимодействия между альфой и количеством эпох (n_iter), которые выполняет процедура подбора. В частности, поскольку альфа становится очень маленькой, необходимо увеличить n_iter, чтобы компенсировать медленную скорость обучения. Вот почему безопаснее (но медленнее) указывать достаточно большой n_iter, например 1000, при поиске в широком диапазоне альфа.
Вывод:
Обратите внимание, что классификатору SGD потребовалось всего 8 минут, чтобы найти лучшую модель, тогда как логистической регрессии потребовалось 26 минут, чтобы найти лучшую модель. Кроме того, мы запускаем наш классификатор SGD при n_iter = 1000. Классификатор SGD дает лучшую модель при α = 0,1. roc_auc_score на лучшей модели составляет 0,712, что с точностью до третьего знака после запятой аналогично тому, что мы получили от логистической регрессии.
Теперь давайте посмотрим на кривую AUC на лучшей модели.
Мы видим, что кривая AUC похожа на то, что мы наблюдали для логистической регрессии.
Резюме
И точно так же, используя parfit для оптимизации гиперпараметров, мы смогли найти SGDClassifier, который работает так же хорошо, как и логистическая регрессия, но занимает лишь треть времени, чтобы найти лучшую модель.
Для достаточно больших наборов данных лучше всего реализовать классификатор SGD вместо логистического классификатора, чтобы получить аналогичные результаты за гораздо меньшее время.
Биография: В настоящее время я учусь на степень магистра аналитики (науки о данных) в Университете Сан-Франциско и прохожу стажировку в Manifold.ai. Раньше я работал инженером по хранению программного обеспечения в Hewlett Packard Enterprise в облачном отделе.
Linkedin: https://www.linkedin.com/in/vpatlolla/