Сегодня поговорим о линейной регрессии. Правильно, как старейшая модель в мире науки о данных, линейная регрессия является вводным курсом почти для всех специалистов по данным. Помимо анализа моделей и тестирования с участием большого количества систем данных, можете ли вы действительно владеть применением линейной регрессии? не обязательно!
Сегодня глубокое обучение стало новым фаворитом науки о данных. Даже если его отодвинуть на 10 лет вперед, такие алгоритмы, как SVM и бустинг, могут завершить линейную регрессию с точки зрения точности.
С одной стороны, линейная регрессия может имитировать гораздо больше отношений, чем линейные отношения. «Линейный» в линейной регрессии относится к линейности коэффициентов, а благодаря нелинейному преобразованию признаков и обобщению обобщенной линейной модели функциональная связь между выходными данными и признаком может быть сильно нелинейной. С другой стороны, что более важно, простота интерпретации линейной модели делает ее незаменимой в области физики, экономики, бизнеса и других областях.
Из-за широкой популярности библиотеки машинного обучения scikit-learn распространенный подход заключается в вызове linear_model из этой библиотеки для подгонки данных. Хотя это может обеспечить другие преимущества других конвейерных функций машинного обучения (например, нормализация данных, регуляризация коэффициентов модели, передача линейной модели в другую нижестоящую модель), когда аналитику данных необходимо быстро и легко определить коэффициенты регрессии (и некоторую базовую корреляцию). статистика), обычно это не самый быстрый и простой способ.
Ниже я представлю несколько более быстрых и чистых методов, но они различаются объемом информации и гибкостью моделирования.
Метод 1: Scipy.polyfit() или numpy.polyfit()
Это самая простая функция подбора полинома методом наименьших квадратов, которая принимает набор данных и полиномиальную функцию любой размерности (заданной пользователем) и возвращает набор коэффициентов, которые минимизируют квадрат ошибки. Подробное описание функции приведено здесь. Для простой линейной регрессии можно выбрать одномерную функцию. Но если вы хотите подобрать модель более высокого измерения, вы можете построить полиномиальные объекты из данных линейных объектов и подобрать модель.
Метод 2: Stats.linregress()
Это узкоспециализированная функция линейной регрессии, которую можно найти в модуле статистики SciPy. Однако, поскольку он используется только для оптимального вычисления регрессии методом наименьших квадратов для двух наборов измерений, его гибкость весьма ограничена. Следовательно, его нельзя использовать для обобщенной линейной модели и подбора множественной регрессии. Однако из-за своей специфики это один из самых быстрых методов простой линейной регрессии. В дополнение к подобранным коэффициентам и условиям перехвата он возвращает основные статистические данные, такие как коэффициент R2 и стандартное отклонение.
Способ 3: Optimize.curve_fit()
Это согласуется с подходом Polyfit, но носит более общий характер. Эта мощная функция из модуля scipy.optimize может подогнать произвольную пользовательскую функцию к набору данных с помощью минимизации методом наименьших квадратов.
Для простой линейной регрессии можно просто написать линейную функцию mx + c и вызвать эту функцию оценки. Само собой разумеется, что он также работает для множественной регрессии и возвращает массив параметров функции с наименьшей метрикой наименьших квадратов, а также ковариационную матрицу.
Метод 4: numpy.linalg.lstsq
Это основной метод вычисления решения системы линейных уравнений по методу наименьших квадратов с помощью матричной факторизации. Удобный модуль линейной алгебры из пакета numpy. В этом методе уравнение ax = b решается путем вычисления вектора x, чья евклидова 2-норма ||b-ax||2 минимизирует.
Уравнение может иметь бесконечные решения, уникальные решения или не иметь решений. Если a является квадратным и имеет полный ранг, то x (округленный) является «точным» решением уравнения.
Вы можете использовать этот метод для выполнения одномерной или множественной линейной регрессии, чтобы получить рассчитанные коэффициенты и остатки. Небольшая хитрость заключается в том, что термин перехвата должен быть рассчитан путем добавления столбца 1 к данным x перед вызовом функции. Это оказывается одним из самых быстрых способов решения задач линейной регрессии.
Метод 5: Statsmodels.OLS ( )
Statsmodels — это небольшой пакет Python, который предоставляет классы и функции для множества различных оценок статистических моделей, а также классы и функции для статистического тестирования и исследования статистических данных. Каждой оценке соответствует список обобщенных результатов. Его можно протестировать на существующих статистических пакетах, чтобы убедиться в правильности статистических результатов.
Для линейной регрессии можно использовать МНК или общие функции наименьших квадратов в этом пакете, чтобы получить полную статистику процесса оценки.
Небольшой трюк, о котором следует помнить, заключается в том, что вам нужно вручную добавить константу к данным x для вычисления точки пересечения, иначе вы просто получите коэффициенты по умолчанию. Ниже приведен снимок экрана с полными агрегированными результатами модели OLS. Результаты столь же богаты по содержанию, как и статистические языки, такие как R или Julia.
Методы 6 и 7: аналитическое решение с использованием обратной матрицы
Для хорошо обусловленных задач линейной регрессии (где, по крайней мере, количество точек данных > количества признаков) решение коэффициентов эквивалентно существованию простого матричного решения в замкнутой форме, которое минимизирует наименьшие квадраты. дан кем-то:
Здесь есть два варианта:
(a) Используйте простое умножение, чтобы найти обратную матрицу
(b) Сначала вычислите обобщенную псевдообратную функцию Мура-Пенроуза для x, а затем возьмите скалярное произведение с y. Поскольку второй процесс включает разложение по сингулярным числам (SVD), он медленнее, но хорошо работает для наборов данных, которые не являются хорошо обусловленными.
Метод 8: sklearn.linear_model.LinearRegression()
Это типичный подход, используемый большинством инженеров по машинному обучению и специалистов по данным. Конечно, для реальных задач его можно заменить алгоритмами перекрестной проверки и регуляризации, такими как регрессия Лассо и регрессия Риджа, без чрезмерного использования, но ядром этих расширенных функций является сама модель.
Как специалист по данным, вы всегда должны искать точные и быстрые методы или функции для моделирования данных. Если модель изначально медленная, она может стать узким местом при выполнении для больших наборов данных.
Как специалисты по данным, мы всегда должны исследовать несколько решений для анализа и моделирования одной и той же задачи и выбирать лучшее для конкретной проблемы.
В этой статье мы обсудили 8 методов простой линейной регрессии. Большинство из них можно расширить до более общего многомерного и полиномиального регрессионного моделирования.
Цель этой статьи состоит главным образом в обсуждении относительной скорости работы и вычислительной сложности этих методов. Мы тестируем постоянно увеличивающийся набор синтетических данных (до 10 миллионов образцов) и сообщаем время вычислений для каждого метода.
Удивительно, но обратное решение для простых матриц быстрее, чем широко используемое scikit-learnlinear_model.