"Машинное обучение"

Глубокое погружение в линейную регрессию и полиномиальную регрессию

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

Ранее мы обсуждали машинное обучение. Мы также обсудили его подмножества - обучение с учителем, обучение без учителя и обучение с подкреплением. В этом посте мы обсудим один из самых фундаментальных алгоритмов контролируемого обучения - Регрессии. Регрессии могут быть разных типов. Возможно, вы уже сталкивались с некоторыми типами регрессий ранее или, возможно, слышите о них впервые. В частности, в этой статье мы рассмотрим два типа регрессии, а именно: «Линейная регрессия» и «Полиномиальная регрессия» вместе с их математическими формулами и кодом Python.

Прежде чем переходить к этим типам, давайте сначала разберемся, что такое «регрессия».

«Регрессия - это статистический подход к оценке силы связи зависимой переменной с набором независимых переменных».

Смущенный? Разберемся на аналогии. Представьте, что вы хотите купить дом. Думаю, вы согласитесь со мной, что цена дома будет зависеть от размера дома (в квадратных футах) и его местоположения (может быть много других параметров, от которых может зависеть цена дома, но для простоты давайте предположим, что эти двое являются основными движущими силами.) Если вы выберете дом большего размера, естественно, его стоимость вырастет, и если дом вашей мечты - это пентхаус на Манхэттене с видом на горизонт, он будет быть намного дороже, чем в Квинсе (я лично выбрал дом в Монако!)

Здесь независимыми переменными будут размер и расположение дома. Как следует из названия, изменение одного не влияет на другой, то есть они «независимы» друг от друга. Цена дома будет зависимой переменной, так как она зависит от размера и местоположения. Таким образом, «регрессионный анализ» - это метод прогнозирования зависимой переменной с использованием независимой (ых) переменной (ов).

Без лишних слов, давайте погрузимся в линейную и полиномиальную регрессию.

Линейная регрессия

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

В случае только одной независимой переменной мы называем это «Простая линейная регрессия». Вот и все! Скажем, y - зависимая переменная, x - независимая переменная. Пусть w будет весом переменной, а b - смещением (смещение иногда может быть нулевым). Веса и смещение - это не что иное, как значения, которые превращают независимую переменную в зависимую. Следовательно, математически

Если вам трудно понять, вспомните нашу аналогию. Цена дома пропорциональна размеру дома. Итак, наше уравнение выглядит следующим образом:

В случае множества независимых переменных и зависимых переменных мы называем это «множественной линейной регрессией». Итак, пусть X будет набором n независимые функции и W - набор новых весов для каждого значения в X.

Наше уравнение множественной линейной регрессии будет:

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

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

Полиномиальная регрессия

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

Даже полиномиальную регрессию можно классифицировать как простую и множественную полиномиальную регрессию. Уравнение простой полиномиальной регрессии можно представить в виде:

Обратите внимание, что был рассмотрен квадрат независимой переменной. Это вносит нелинейность.

Аналогичным образом уравнение множественной полиномиальной регрессии можно представить в виде:

Где n, p, q, r могут быть целыми числами, которые вносят нелинейность.

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

Инициализация коэффициентов уравнения

Вы могли подумать, какие значения присвоить коэффициентам w и b перед тренировочным процессом и как эти значения оптимизировать во время тренировки? Если мы внимательно понаблюдаем, мы поймем, что именно эти коэффициенты мы хотим оценивать в процессе обучения, чтобы сделать нашу модель машинного обучения лучше при прогнозировании.

Процесс присвоения начальных значений называется «Инициализация». Есть несколько способов инициализировать коэффициенты. Вот некоторые из распространенных инициализаций:

  1. Нули
  2. Единицы
  3. Нормальное распределение
  4. Усеченное нормальное распределение

Чтобы понять, как оптимизировать эти коэффициенты во время обучения, нам нужно изучить две концепции: «Функция потерь» и «Стохастический градиентный спуск (SGD)». Эти термины могут показаться несколько сложными, но не волнуйтесь, я вас поддержу!

Функция потерь

Давайте рассмотрим множественную линейную регрессию с двумя независимыми переменными. Наше уравнение будет:

В этом уравнении y - истинные значения, а wi и b - оптимальные коэффициенты. Поскольку мы инициализируем неоптимальные коэффициенты, наши результаты также будут отклоняться от оптимальных. Таким образом, наше уравнение до тех пор, пока мы не достигнем оптимальных коэффициентов и, следовательно, оптимальных результатов, будет:

Здесь новые y, wi, и b (со шляпкой) являются субоптимальными значениями. С этого момента мы будем называть y «истинным значением», а y (шляпа) - «прогнозируемым значением».

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

Есть несколько способов определить функцию потерь в зависимости от типа решаемой задачи (регрессия или классификация). Вот некоторые из функций потерь для регрессии:

  1. Среднеквадратичная ошибка потери
  2. Среднеквадратичная потеря логарифмической ошибки
  3. Средняя абсолютная потеря ошибки

Мы подробно рассмотрим их в следующих статьях.

Стохастический градиентный спуск (SGD)

Нам необходимо оптимизировать wi и b для достижения оптимальных коэффициентов и, таким образом, получить результаты, максимально приближенные к фактическим значениям. Для этого мы используем оптимизаторы. Эти оптимизаторы используют математические функции для перемещения значений коэффициентов ближе к оптимальным значениям во время обучения. Есть ряд оптимизаторов, которые мы можем использовать. Но давайте посмотрим на один, чтобы понять, как работает оптимизатор. Мы сосредоточимся на стохастическом градиентном спуске (SGD).

Пусть L будет функцией потерь (может быть любой из трех упомянутых выше или даже другой). Математическое уравнение для этого:

Где η - размер шага (также называемый скоростью обучения), который умножается на частную производную функции потерь по коэффициенту, который обновляется.

Прелесть этого уравнения в том, что без какого-либо вмешательства человека в процессе обучения оно оптимизирует коэффициенты. Это достигается за счет минимизации функции потерь. Таким образом, этот процесс также называется «Минимизация функции потерь».

Чтобы понять, как это работает, предположим, что есть несколько холмов, и вы стоите на гребне одного из них. Если бы я сказал вам, чтобы вы достигли самой нижней точки, и вы должны были бы делать шаг за раз. Хотя есть одно условие. В любой момент ваш следующий шаг должен быть в направлении самого крутого спуска в этой точке. Градиентный спуск работает так, как вы спуститесь с холма!

У SGD могут быть определенные недостатки. Также есть много разных оптимизаторов, которые работают по-разному. Обсудим их в будущем.

Цель достигнута, линейная и полиномиальная регрессия изучена!

Итак, до сих пор мы узнали о линейной и полиномиальной регрессии.

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

Набор данных о ценах на жилье

В этом руководстве используется набор данных Прогноз цен на жилье. Он был изменен мной, чтобы упростить понимание. Полный код (Jupyter Notebook) и набор данных можно найти по адресу:



Измененный набор данных «data.csv» содержит 3 независимые переменные и 1 зависимую переменную.

Независимые переменные:

1stFlrSF - квадратных футов первого этажа
2ndFlrSF - квадратных футов второго этажа
YearBuilt - первоначальная дата строительства

Зависимые переменные:

SalePrice - продажная цена объекта недвижимости в долларах. (Это целевая переменная, которую вы пытаетесь предсказать.)

Если вы хотите работать с полным набором данных, его можно найти по адресу:



Давайте сразу перейдем к коду!

Шаг 1. Импорт библиотек Python

Краткое описание всех библиотек:

Datetime - предоставляет классы для управления датой и временем.

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

Pandas - быстрый, мощный, гибкий и простой в использовании инструмент для анализа и обработки данных с открытым исходным кодом, построенный на основе языка программирования Python.

Scikit-learn - содержит множество эффективных инструментов для машинного обучения и статистического моделирования, включая классификацию, регрессию, кластеризацию и уменьшение размерности (импортировано как sklearn)

Math - обеспечивает доступ к математическим функциям, определенным стандартом C

Шаг 2. Чтение набора данных как фрейма данных с помощью Pandas

Сначала необходимо вызвать файл data.csv, чтобы использовать его для обучения нашей модели. Мы читаем его как фрейм данных pandas и присваиваем его переменной df. Для этого воспользуемся функцией read_csv ().

Шаг 3. Инициализация независимых и зависимых переменных.

Теперь нам нужно отделить зависимую переменную (y) от независимых переменных (X). Это можно сделать, запустив следующий код:

Шаг 4. Данные обучения и тестирования

Для нашей задачи необходимы два набора данных: один для обучения, а другой - для тестирования. Sklearn предоставляет для этого функцию train_test_split (). Для задачи, которую мы собираемся выполнить, мы будем использовать 80% всех данных для обучения, а оставшиеся 20% - для тестирования.

X_train - часть X, используемая для обучения
y_train - часть y, используемая для обучения
X_test - часть X используется для тестирования
y_test - часть y, используемая для тестирования

Шаг 5. Модель линейной регрессии

Наконец-то появилась наша модель линейной регрессии! Переменная модель создает экземпляр нашей модели линейной регрессии. Во второй строке мы видим функцию подогнать. Что действительно делает функция fit (), так это то, что она обучает нашу модель с использованием обучающих данных. Теперь наша модель обучена. Мы будем использовать функцию прогноз () для получения прогнозов на X_test. Эти прогнозы можно сравнить с фактическими значениями, чтобы определить, как работает наша модель.

Шаг 6. Полиномиальные особенности

Чтобы получить полиномиально связанные функции, scikit-learn предлагает функцию с именем PolynomialFeatures (). Если переменная p связана с q квадратично, то линейно зависит от q. Таким образом, мы сгенерируем признаки более высокой мощности и скормим их модели линейной регрессии. Это позволит нам реализовать полиномиальную регрессию. В следующем коде X_poly будет действовать как новый X_train, который будет использоваться для обучающей задачи.

Шаг 7. Модель полиномиальной регрессии.

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

Шаг 8. Табулирование результатов

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

Шаг 9. Показатели оценки - среднеквадратическая ошибка (RMSE)

Как мы количественно оценим эффективность нашей модели? Для этой цели мы используем так называемые метрики оценки, которые сравнивают прогнозируемые и фактические значения и дают нам число. В зависимости от того, насколько высоко или низко значение, мы можем сказать, насколько хороша наша модель. Одним из таких показателей оценки является Среднеквадратичная ошибка или просто RMSE. Я уверен, что вы когда-нибудь изучали это. Если вы хотите узнать больше о RMSE, ознакомьтесь с этой статьей: Что на самом деле означает RMSE?

Среднеквадратичное значение, полученное с помощью линейной регрессии, составляет 46321.133955685014, а с помощью полиномиальной регрессии - 36741.49042680656.

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

Мы можем заметить одну вещь: RMSE для полиномиальной регрессии лучше, чем для линейной регрессии. Следовательно, мы можем сделать вывод, что полиномиальная регрессия обычно превосходит линейную регрессию, поскольку полиномиальная регрессия в основном подходит для широкого диапазона кривизны.

Спасибо за чтение!

Есть вопросы или предложения? Хотите поделиться со мной любыми мыслями или идеями? Не стесняйтесь обращаться ко мне в LinkedIn. Всегда рад помочь!

Также вы можете просмотреть другие работы на GitHub и моем блоге.

А пока до встречи в моем следующем посте!