из среды
Автор: Тиртаджьоти Саркар.
Сборник "Сердце машины"
Участие: Ян Ци, Лю Сяокунь
В этой статье автор обсуждает 8 алгоритмов простых вычислений линейной регрессии в среде Python, но не обсуждает их производительность, а сравнивает их показатели относительной вычислительной сложности.
Адрес гитхаба:GitHub.com/TI RT Hajiayo Body…
Для большинства специалистов по данным методы линейной регрессии являются отправной точкой для задач статистического моделирования и прогнозной аналитики. Но мы не можем переоценить важность подгонки линейных моделей (быстро и точно) к большим наборам данных. Как показано в этой статье, в моделях линейной регрессии слово «линейный» относится к коэффициентам регрессии, а не к степени признака.
Характеристики (или независимые переменные) могут быть любой степенью или даже трансцендентными функциями, такими как экспоненциальные функции, логарифмические функции и синусоидальные функции. Следовательно, многие природные явления могут быть аппроксимированы этими преобразованиями и линейными моделями, даже когда функциональная связь между выходными данными и признаками сильно нелинейна.
С другой стороны, поскольку Python быстро становится предпочтительным языком программирования для специалистов по данным, важно понимать, что существует множество способов подогнать линейные модели к большим наборам данных. Не менее важно, чтобы специалисты по данным должны были оценить важность, связанную с каждой функцией, исходя из результатов, полученных с помощью модели.
Однако существует ли только один способ выполнить линейный регрессионный анализ в Python? Если есть несколько способов, как выбрать наиболее эффективный?
Поскольку Scikit-learn — очень популярная библиотека Python в области машинного обучения, линейные модели часто вызываются из этой библиотеки для подгонки данных. Кроме того, мы также можем использовать функции конвейера и FeatureUnion библиотеки (такие как: нормализация данных, регуляризация коэффициента регрессии модели, передача линейных моделей в последующие модели), но в целом, если аналитику данных нужен только быстрый и простой способ чтобы определить коэффициенты регрессии (или какой-либо связанный статистический базовый результат), то это не самый быстрый или самый краткий способ.
Хотя существуют другие более быстрые и чистые подходы, ни один из них не обеспечивает такого же количества информации и гибкости модели.
Читать дальше.
Код различных методов линейной регрессии можно найти на GitHub автора. Большинство из них основаны на пакетах SciPy.
SciPy построен на Numpy и сочетает в себе математические алгоритмы и простые в использовании функции. SciPy значительно расширяет интерактивный сеанс Python, предоставляя пользователям расширенные команды, а также классы для обработки и визуализации данных.
Различные методы кратко обсуждаются ниже.
Метод 1: Scipy.polyfit() или numpy.polyfit()
Это очень общая функция подбора полинома методом наименьших квадратов, которая работает с наборами данных любой степени с помощью полиномиальной функции (заданной пользователем), возвращаемое значение которой представляет собой массив коэффициентов регрессии (с минимальной дисперсией).
Для простой линейной регрессии вы можете установить степень равной 1. Если вы хотите подобрать модель с более высокой степенью, вы также можете сделать это, построив полиномиальные функции из данных линейных функций.
Ссылка на подробное описание:docs.last friend.org/doc/num py-1….
Способ 2: stats.linregress()
Это узкоспециализированная функция линейной регрессии в модуле статистики в Scipy. Его гибкость довольно ограничена, поскольку он оптимизирован только для регрессии наименьших квадратов, которая вычисляет два набора измерений. Следовательно, вы не можете использовать его для подбора общих линейных моделей или для многомерного регрессионного анализа. Однако, поскольку целью этой функции является выполнение специализированных задач, это один из самых быстрых методов, когда мы сталкиваемся с простым линейным регрессионным анализом. В дополнение к подобранным коэффициентам и члену перехвата он также возвращает основные статистические значения, такие как коэффициент R² и стандартное отклонение.
Ссылка на подробное описание:blog.mini tab.com/blog/advent…
Метод 3: optimize.curve_fit()
Этот метод похож на метод Полифита, но принципиально более общий. Выполняя минимизацию методом наименьших квадратов, эта мощная функция из модуля scipy.optimize может подогнать любую определяемую пользователем функцию к набору данных методом наименьших квадратов.
Для простых задач линейной регрессии мы можем написать линейную функцию: mx+c, которую мы называем оценкой. Он также работает для многомерной регрессии. Он возвращает массив параметров функции, которые представляют собой параметры, минимизирующие значение метода наименьших квадратов, и параметры связанной ковариационной матрицы.
Ссылка на подробное описание:docs.lastfriend.org/doc/lastfriend/day…
Метод 4: numpy.linalg.lstsq
Это основной способ вычисления решения системы линейных уравнений по методу наименьших квадратов с использованием матричной факторизации. Это происходит из модуля линейной алгебры в пакете numpy. Он решает уравнение ax=b, находя вектор x, который минимизирует евклидову 2-норму ||b — a x ||².
Уравнение может быть недоопределенным, детерминированным или переопределенным (то есть количество линейно независимых строк в a меньше, равно или больше числа его линейно независимых столбцов). Если a является и квадратной матрицей, и матрицей полного ранга, то вектор x (если нет ошибки округления) является решением уравнения.
С помощью этого метода вы можете выполнять как простую, так и многомерную регрессию. Вы можете вернуть рассчитанные коэффициенты и остатки. Небольшая хитрость заключается в том, что перед вызовом этой функции вы должны добавить столбец 1 к данным x, чтобы вычислить термин перехвата. Оказывается, это один из самых быстрых способов решения задач линейной регрессии.
Ссылка на подробное описание:docs.last friend.org/doc/num py-1…
Метод 5: Statsmodels.OLS()
statsmodel — это хороший пакет Python, который предоставляет людям классы и функции для оценки множества различных статистических моделей, выполнения статистических экспериментов и изучения статистических данных. Каждый оценщик будет иметь список результатов, которые собирают большое количество статистических данных. Результаты будут сравниваться с существующими статистическими пакетами для обеспечения точности.
Для линейной регрессии можно вызвать OLS или функцию обычных наименьших квадратов из этого пакета, чтобы получить окончательную статистику процесса оценки.
Небольшой трюк, о котором следует помнить, заключается в том, что вам нужно вручную добавить константу к данным x, которые используются для вычисления точки пересечения. В противном случае по умолчанию будут выводиться только коэффициенты регрессии. В таблице ниже приведены общие результаты модели OLS. Он так же богат, как и любой язык функциональной статистики, такой как R и Julia.
Ссылка на подробное описание:Woohoo.stats models.org/Dev/index.Также…
Методы 6, 7: Аналитическое решение методом обращения матриц
Для хорошо обусловленной задачи линейной регрессии (по крайней мере, для точек данных и признаков) существует матричное решение в закрытой форме для вычисления коэффициентов регрессии (что гарантирует минимизацию методом наименьших квадратов). Он определяется следующим уравнением:
Здесь у нас есть два варианта:
Метод 6: Используйте простое обратное умножение матриц.
Подход 7: Сначала вычислите обобщенную псевдообратную модель Мура-Пенроуза для данных x, а затем выполните скалярное произведение с y. Поскольку второй шаг здесь включает разложение по сингулярным числам (SVD), он медленный при работе с плохо обусловленными наборами данных, но результаты хорошие. (Ссылка: Разработчик должен прочитать: Линейная алгебра в компьютерных науках)
Ссылка на подробное описание:En. Wikipedia.org/wiki/linear…
Метод 8: sklearn.linear_model.LinearRegression()
Этот метод часто используется большинством инженеров по машинному обучению и специалистов по данным. Однако для реальных задач он может использоваться не так широко, и мы можем заменить его алгоритмами перекрестной проверки и регуляризации, такими как регрессия Лассо и регрессия Риджа. Но вы должны знать, что основное ядро этих расширенных функций по-прежнему подчинено этой модели.
Ссылка на подробное описание:SCI kit-learn.org/stable/Modu…
Измерение скорости и временной сложности вышеперечисленных методов
Работа специалиста по данным часто требует от него быстрого и точного моделирования данных. Если используемый метод изначально медленный, то при работе с большими наборами данных возникнет узкое место в выполнении.
Хороший способ оценить масштабируемость возможностей алгоритма — протестировать данные с постоянно расширяющимся набором данных, затем извлечь время выполнения всех испытаний и отобразить тенденции.
Код этого метода можно посмотреть на GitHub. Окончательный результат приведен ниже. Из-за простоты модели stats.linregress и простое обратное умножение матриц являются самыми быстрыми, даже для 10 миллионов точек данных.
Суммировать
Как специалист по данным, вы всегда должны проводить исследования, чтобы найти несколько способов решения одной и той же задачи анализа или моделирования, а затем прописывать правильное лекарство для каждой проблемы.
В этой статье мы обсудили 8 способов выполнения простой линейной регрессии. Большинство этих методов можно распространить на более общие задачи многомерной и полиномиальной регрессии. Мы не приводим подходящие коэффициенты R² для этих методов, потому что все они очень близки к 1.
Для одномерной регрессии (с миллионами искусственно сгенерированных точек данных) оценки коэффициентов регрессии довольно хороши.
Основная цель этого поста — обсудить скорость/вычислительную сложность, связанную с вышеупомянутыми 8 методами. Мы измеряем вычислительную сложность каждого метода, проводя эксперименты на синтетическом наборе данных увеличивающегося размера (до 10 миллионов образцов). Удивительно, но аналитическое решение для простого обращения матриц и умножения оказывается намного быстрее, чем обычно используемая линейная модель scikit-learn.
Оригинальная ссылка:medium.free code camp.org/data - Вознаграждение милости…