Рубрики
Без рубрики

Не потеть решатель

Советы для лучших моделей логистической регрессии в Scikit-Learn Продолжить чтение … Tagged с помощью машинного обучения, Python.

Логистическая регрессия-это алгоритм хлеба и масла для классификации машинного обучения. Если вы практикующий или начинающий ученый для данных, вам захочется знать, как его использовать. Кроме того, логистическая регрессия Scikit-Learn выплевывает предупреждения об изменении решателя по умолчанию, так что это прекрасное время, чтобы узнать, когда использовать этот решатель. 😀

FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. 
Specify a solver to silence this warning.

В этой статье вы узнаете о выборе решателей Scikit-Learn LogisticRession Solver и увидите их. Кроме того, вы увидите ключевые параметры API и получите ответы на часто задаваемые вопросы. К концу статьи вы узнаете больше о логистической регрессии в Scikit-Learn и не потеть решатель. 😓

В этом анализе я использую версию Scikit-Learn 0.21.3.

Когда использовать логистическую регрессию

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

Логистическая регрессия, вероятно, является наиболее важным методом контролируемой классификации обучения. Это быстрое, универсальное расширение обобщенной линейной модели.

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

Логистическая регрессия дает веса функций, которые обычно интерпретируются, что делает его особенно полезным, когда вам нужно иметь возможность объяснить причины решения. Эта интерпретация часто пригодится – например, с кредиторами, которым необходимо оправдать свои кредитные решения.

Не существует решения в закрытом форме для задач логистической регрессии. Это нормально – мы не используем решение в закрытой форме для проблем с линейной регрессией, потому что оно медленно.

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

Логистическая регрессия является основным алгоритмом для использования для большинства задач классификации. Это быстрое, универсальное расширение обобщенной линейной модели. Он производит веса, которые обычно интерпретируются, что делает его особенно полезным, когда вам нужно иметь возможность объяснить причины решения. Эта интерпретация часто пригодится – например, с отрицанием кредита.

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

Параметры решателя

Scikit-Learn Ships с пятью различными решателями. Каждый решатель пытается найти веса параметров, которые минимизируют функцию стоимости. Вот пять вариантов:

  • Newton-CG – метод Ньютона. Методы Ньютона используют точную матрицу гесссов. Это медленно для больших наборов данных, потому что он вычисляет вторые производные.
  • LBFGS -Стоит за ограниченную память Бройдена-Флетчер-Голдфарб-Шанно. Он аппроксимирует обновления второй производной матрицы с градиентными оценками. Он хранит только последние несколько обновлений, поэтому сохраняет память. Это не очень быстро с большими наборами данных. Это будет решатель по умолчанию как версия Scikit-Learn 0.22.0.
  • liblinear – Библиотека для большой линейной классификации. Использует алгоритм координатного спуска. Координатный спуск основан на минимизации многомерной функции путем решения одномерных задач оптимизации в цикле. Другими словами, он движется к минимуму в одном направлении за раз. Это решатель по умолчанию до V0.22.0. Это хорошо работает с высокой размерностью. У него есть несколько недостатков. Он может застрять, не может работать параллельно и может решить только многокласскую логистическую регрессию с одним Vs.-Rest.
  • SAG – Стохастический средний градиент спуск. Изменение градиентного спуска и постепенного агрегированного градиента подходов, которые используют случайную выборку предыдущих значений градиента. Быстро для больших наборов наборов.
  • сага – расширение SAG Это также учитывает регуляризацию L1. Как правило, тренироваться быстрее, чем SAG Анкет

Отличное обсуждение различных вариантов можно найти в этот стек переполнен ответ Анкет

Диаграмма ниже из Документация Scikit-learn Перечисляет характеристики решателей, включая доступные штрафы регуляризации.

Почему изменяется решатель по умолчанию?

liblinear быстро с небольшими наборами данных, но имеет проблемы с седлами и не может быть параллелизировано с несколькими ядрами процессора. Он может использовать только One-Vs.-Rest для решения многоклассных задач. Это также наказывает перехват, что не подходит для интерпретации.

LBFGS избегать этих недостатков, относительно быстрые и не требует аналогичных данных. Это лучший выбор для большинства случаев без действительно большого набора данных. Некоторое обсуждение того, почему по умолчанию было изменено в этот выпуск GitHub Анкет

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

Тесты решателя

Пример бинарной классификации решателя

Во -первых, давайте посмотрим на проблему бинарной классификации. Я использовал встроенный Набор данных Scikit-learn Groud_cancer Анкет Цель состоит в том, чтобы предсказать, является ли масса молочной железы раковой.

Особенности состоят из числовых данных о ядрах ядер. Они были рассчитаны из оцифрованных изображений биопсии. Набор данных содержит 569 наблюдений и 30 числовых функций. Я разделил набор данных на обучающие и тестовые наборы и провел поиск сетки на обучающем наборе с каждым другим решателем. Вы можете получить доступ к моей записной книжке Jupyter, используемой во всех анализах по адресу Kaggle Анкет

Наиболее соответствующий фрагмент кода ниже.

solver_list = ['liblinear', 'newton-cg', 'lbfgs', 'sag', 'saga']
params = dict(solver=solver_list)
log_reg = LogisticRegression(C=1, n_jobs=-1, random_state=34)
clf = GridSearchCV(log_reg, params, cv=5)
clf.fit(X_train, y_train)
scores = clf.cv_results_['mean_test_score']

for score, solver in zip(scores, solver_list):
    print(f"  {solver} {score:.3f}" )

Liblinear 0,939 Newton-CG 0,939 фунтов стерлингов 0,934 SAG 0,911 SAGA 0,904

Значения для провальный и сага отставать за их сверстниками.

После масштабирования функций все решатели работают лучше и SAG и сага столь же точны, как и другие решатели.

Liblinear 0,960 Newton-CG 0,962 LBFGS 0,962 SAG 0,962 SAGA 0,962

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

Многоклассный решающий пример

Я оценил решателей логистической регрессии в задаче классификации многоклассов с Scikit-Learn’s набор данных вина . Набор данных содержит 178 образцов и 13 числовых функций. Цель состоит в том, чтобы предсказать тип вина, используемого для изготовления вина из химических особенностей вина.

solver_list = ['liblinear', 'newton-cg', 'lbfgs', 'sag', 'saga']
parameters = dict(solver=solver_list)
lr = LogisticRegression(random_state=34, multi_class="auto", n_jobs=-1, C=1)
clf = GridSearchCV(lr, parameters, cv=5)
clf.fit(X_train, y_train)
scores = clf.cv_results_['mean_test_score']

for score, solver, in zip(scores, solver_list):
    print(f"{solver}: {score:.3f}")

Liblinear: 0,962 Newton-CG: 0,947 LBFGS: 0,955 SAG: 0,699 Сага: 0,662

Scikit-learn дает предупреждение о том, что SAG и сага Модели не сходились. Другими словами, они так и не достигли минимального пункта. Неудивительно, что результаты не так хороши для этих решателей.

Давайте сделаем небольшую планку с использованием библиотеки Seaborn, чтобы показать различия для этой проблемы.

После масштабирования функций между 0 и 1, затем SAG и сага достигните тех же средних показателей точности, что и другие модели.

Liblinear: 0,955 Newton-CG: 0,970 фунт-фунт: 0,970 SAG: 0,970 SAGA: 0.970

Обратите внимание на предостережение, что оба этих примера с небольшими наборами данных. Кроме того, мы не рассматриваем требования к памяти и скорости в этих примерах.

Итог: предстоящий по умолчанию LBFGS Решатель – хороший первый выбор для большинства случаев. Если вы имеете дело с большим набором данных или хотите применить регуляризацию L1, я предлагаю вам начать с сага Анкет Помните, что сага Нужно, чтобы функции были в аналогичном масштабе.

У вас есть вариант использования для Newton-CG или провальный ? Если это так, пожалуйста, поделитесь в комментариях. 💬

Далее я демистифицирую параметры ключевых параметров для логистической регрессии в Scikit-Learn.

Параметры

Класс логистической регрессии Scikit-Learn может принять следующие аргументы.

штраф , двойной , Тол , В , fit_intercept , Intercept_scaling , class_weight В random_state , Решатель , max_iter , verbose В Warm_start , n_jobs , l1_ratio

Я не буду включать все приведенные ниже параметры, просто выдержки из этих параметров, скорее всего, будут ценными для большинства людей. Смотрите Документы для тех, кто опущен. Я добавил дополнительную информацию в курсив Анкет

C – Float, необязательно, Меньшие значения имеют больше регуляризации. Обратная сила регуляризации. Должно быть положительное значение. Обычно поиск логарифмично: [.001, .01, .1, 1, 10, 100, 1000]

random_state : int, случайный экземпляр или нет, необязательно) Обратите внимание, что вы должны установить здесь случайное состояние для воспроизводимости.

Решатель {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, необязательно). Смотрите диаграмму выше для получения дополнительной информации.

Изменено в версии 0.20: по умолчанию изменится с «liblinear» на «lbfgs» в 0,22.

multi_class : str, {‘ovr’, ‘multinomial’, ‘Auto’}, необязательно) Если выбранная опция – «OVR», то бинарная проблема подходит для каждой метки. Для «Multinomial» потери минимизируются, что междомиальные потери соответствия по всему распределению вероятностей, даже если данные являются бинарными. ‘ Multinomial ‘недоступен, когда. «Авто» выбирает «OVR», если данные являются двоичными, или если иным образом выбирает «многономиальный».

Изменено в версии 0.20: по умолчанию изменится с «OVR» на «Auto» в 0,22. OVR означает один против отдыха. Смотрите дальнейшее обсуждение ниже.

l1_ratio : float или нет, необязательно) Параметр смешивания упругого сети с 0. Используется только если. Настройка эквивалентна использованию, в то время как настройка эквивалентна использованию. Для 0 Только для саги.

Комментарий: Если у вас есть проблема с мультиклассным, то настройка Многокласс к Авто будет использовать многономиальный вариант каждый раз, когда он доступен. Это самый теоретически разумный выбор. Авто Скоро будет дефолт.

Используйте l1_ratio Если хотите использовать некоторую регуляризацию L1 с сага решатель. Обратите внимание, что, как и вариант линейной регрессии Elasticnet, вы можете использовать смесь штрафной L1 и L2.

Также обратите внимание, что регуляризация L2 C = 1 применяется по умолчанию.

После подгонки модели атрибуты: Classes_ , coef_ , Intercept_ и n_iter Анкет coef_ Содержит массив весов функций и Intercept_ содержит атмосфера

FAQ по логистической регрессии:

Теперь давайте рассмотрим те ноющие вопросы, которые у вас могут возникнуть в отношении логистической регрессии в Scikit-Learn.

Могу ли я использовать логистическую регрессию для многоуровневой проблемы – то есть один вывод может быть членом нескольких классов одновременно?

Неа. Извините, если вам это нужно, найдите другой алгоритм классификации Здесь Анкет

Какой вид регуляризации я должен использовать?

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

Если вы хотите сделать некоторое сокращение размерности за счет регуляризации, используйте регуляризацию L1. Ретализация L1 – это манхэттен или регуляризация такси. Ретализация L2 – это евклидовая регуляризация и, как правило, лучше работает в общих проблемах с линейной регрессией.

Вы должны использовать сага Решатель, если вы хотите применить смесь регуляризации L1 и L2. liblinear Решатель требует, чтобы у вас была регуляризация. Однако вы можете просто сделать C например, большое значение, что у него было очень, очень маленькое штраф за регуляризацию. Снова C в настоящее время установлен на 1 по умолчанию.

Должен ли я масштабировать функции?

Если использовать SAG и сага Решатели, убедитесь, что функции находятся в аналогичном масштабе. Мы увидели важность этого выше.

Стоит ли удалить выбросы?

Наверное. Удаление выбросов, как правило, улучшит производительность модели. Стандартизация входов также уменьшит эффекты выбросов.

Ortailscaler может масштабировать функции, и вы можете избежать сброса выбросов. Смотрите мою статью, обсуждающую масштабирование и стандартизацию Здесь Анкет

Какие еще предположения действительно имеют значение?

Наблюдения должны быть независимыми друг от друга.

Должен ли я преобразовать свои функции, используя полиномы и взаимодействия?

Как и в линейной регрессии, вы можете использовать полиномы и взаимодействия более высокого порядка. Это преобразование позволяет вашей модели изучить более сложную границу решения. Затем вы не ограничиваются линейной границей решений. Тем не менее, переосмысление становится риском, и интерпретация импорта функций становится сложнее. Реливеру также может быть труднее найти минимальный минимальный глобальный.

Должен ли я сделать сокращение размерности, если есть много функций?

Наверное. Анализ основных компонентов – хороший выбор, если интерпретация не является жизненно важной. Рекурсивное устранение функций может помочь вам удалить наименее важные функции. В качестве альтернативы, регуляризация L1 может привести к менее важным весам функций до нуля, если вы используете сага решатель.

Многоколлинеарность в моих функциях – это проблема?

Это для интерпретации импорта функций. Вы не можете полагаться на веса модели, чтобы быть значимыми, когда существует высокая корреляция между переменными. Кредит за эффективность переменной результата может перейти только на одну из коррелированных функций.

Есть много способов проверить на мультиколлинеарность. Смотрите Kraha et al. (2012) здесь Анкет

Одним из популярных вариантов является проверка коэффициента инфляции дисперсии (VIF). Отказ от VIF около 5-10 обычно является проблематичным, но есть живые дебаты Что касается соответствующего отсечения VIF.

Вы можете вычислить VIF, взяв матрицу корреляции, переворачивая ее и взяв значения на диагонали для каждой функции.

Одних только коэффициентов корреляции недостаточно для определения проблемной мультиколлинеарности с несколькими функциями.

Если размер выборки невелик, получение большего количества данных может быть наиболее полезным для удаления мультиколлинеарности.

Когда я должен использовать LogisticRegressionCV?

[LogisticRegressionCV] ( https://scikit-learn.org/stable/modules/linear_model.html )-алгоритм Scikit-learn, который вы хотите, если у вас много данных и вы хотите ускорить свои расчеты при перекрестном. Настройка ваших гиперпараметров.

Сворачивать

Теперь вы знаете, что делать, когда видите Логистическая регрессия ПРЕДУПРЕЖДЕНИЕ SOLVER – и еще лучше, как избежать этого в первую очередь. Нет больше пота! 😅

Я предлагаю вам использовать предстоящий по умолчанию LBGFS Решатель для большинства случаев. Если у вас много данных или нуждается в регуляризации L1, попробуйте сага Анкет Убедитесь, что вы масштабируете свои функции, если вы используете сага Анкет

Я надеюсь, что вы нашли это обсуждение логистической регрессии полезным. Если вы это сделали, пожалуйста, поделитесь этим в своих любимых социальных сетях, чтобы другие люди тоже могли его найти. 👏

Я пишу о Python, Docker, Data Science и других. Если это вам интересно, прочитайте больше Здесь и подписаться на мой список рассылки Анкет 😄

Счастливого логистика!

Оригинал: “https://dev.to/discdiver/don-t-sweat-the-solver-stuff-20np”