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

Множественная линейная регрессия с помощью Python

Автор оригинала: Dan Nelson.

Вступление

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

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

Определение Терминов

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

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

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

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

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

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

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

  • Линейная регрессия
  • Полиномиальная регрессия
  • Пошаговая регрессия
  • Регрессия хребта
  • Регрессия лассо
  • Эластичная Чистая регрессия

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

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

Теория Множественной Линейной Регрессии

Линейная регрессия просто показывает связь между зависимой переменной и независимой переменной .

Если линейная регрессия-это просто построение зависимости между независимой переменной (X) и зависимой переменной (Y), вы можете догадаться, что многомерная /множественная линейная регрессия – это просто линейная регрессия, выполняемая более чем по одной независимой переменной.

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

Кредит: Кредит:

linear_regression

Уравнение линейной регрессии имеет вид: Y+b*X . В задаче линейной регрессии мы будем иметь параметры ( a и b ), оцениваемые нашей моделью. Затем мы возьмем константу или перехват a и добавим наклон линии b к независимой переменной X (наша входная функция), чтобы вычислить значение зависимой переменной ( Y ).

Рисунок выше является примером того, как выглядит линейная зависимость между переменными X и Y .

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

Если Y+b*X является уравнением для сингулярной линейной регрессии, то из этого следует, что для множественной линейной регрессии число независимых переменных и наклонов включены в уравнение.

Например, вот уравнение для множественной линейной регрессии с двумя независимыми переменными:

Это справедливо для любого заданного числа переменных.

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

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

Внедрение MLR

Преобразование Категориальных Переменных

Кредит: Кредит:

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

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

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

Дихотомические переменные

Дихотомические переменные-это те, которые существуют только в одной из двух категорий. Дихотомическая переменная-это либо “да”, либо “нет”, белый или черный. Дихотомические переменные легко преобразовать в непрерывные переменные, они просто должны быть помечены 0 или 1 .

Номинальные/Порядковые переменные

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

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

По этой причине тактика по умолчанию для преобразования номинальных переменных в непрерывные переменные называется one-hot encoding , иногда называемая “созданием фиктивных переменных”. По сути, вы создаете больше функций или переменных, которые соответствуют фактическим категориям в ваших данных. Процесс однократного кодирования означает создание массива размером с ваше количество категорий и заполнение их “единицей” в позиции, соответствующей соответствующей категории, и нулями везде.

Например, вот таблица с категориальными данными:

Красный
Зеленый
Синий

После того как мы провели эту таблицу через процесс однократного горячего кодирования, она выглядит следующим образом:

1 0 0
0 0 1
0 1 0

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

Конвейер машинного обучения

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

Каждая реализация алгоритмов машинного обучения имеет одни и те же базовые компоненты. Вам нужно:

  • Подготовьте данные
  • Создайте модель
  • Тренируйте модель
  • Оцените модель

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

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

Обучение модели также довольно просто при использовании такой библиотеки, как Scikit-Learn, поскольку, как правило, для обучения алгоритма на выбранном вами наборе данных требуется всего несколько строк кода.

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

Пример реализации MLR

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

Кредит: Кредит:

Во-первых, нам нужно загрузить наш набор данных. Мы используем библиотеку Scikit-Learn, и она поставляется в комплекте с некоторыми образцами наборов данных. Набор данных, который мы будем использовать, – это набор данных Boston Housing Dataset . Набор данных содержит множество различных характеристик домов в районе Бостона, таких как размер дома, уровень преступности, возраст здания и т. Д. Цель состоит в том, чтобы предсказать цену дома на основе этих особенностей.

Вот весь импорт, который нам нужен:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error, r2_Score

Теперь нам нужно создать экземпляр набора данных, вызвав функцию load_boston() :

bh_data = load_boston()

Давайте распечатаем значение переменной data, чтобы увидеть, какие типы данных она содержит:

print(bh_data.keys())

Вот что мы получаем обратно:

dict_keys(['data', 'target', 'feature_names', 'DESCR'])

data – это вся фактическая информация о домах, в то время как target – это цена дома, feature names – это названия категорий, в которые попадают данные, и DESCR – это команда для описания функций набора данных.

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

Мы также передаем имена объектов в качестве заголовков столбцов:

boston = pd.Dataframe(bh_data.data, columns=bh_data.feature_names)

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

print(data.DESCR)

Вот несколько описаний, которые возвращаются:

CRIM: Per capita crime rate by town
ZN: Proportion of residential land zoned for lots over 25,000 sq. ft
INDUS: Proportion of non-retail business acres per town
...
LSTAT: Percentage of lower status of the population
MEDV: Median value of owner-occupied homes in $1000s

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

Это делается просто путем указания фрейма данных и имени столбца, который мы хотим создать в переменной, а затем выбора значений target :

boston['MEDV'] = bh_data.target

Обычно вы делаете некоторый анализ данных, чтобы выяснить, каковы наиболее важные функции, и используете эти переменные для регрессии. Однако это может быть статья сама по себе, поэтому в данном случае я просто скажу вам, что особенности с наиболее сильными корреляциями-это доля “более низкого статуса” в населении (“LSTAT”) и количество комнат в доме (“RM”).

Итак, давайте использовать “RM” и “LSTAT” в качестве переменных для линейной регрессии. Эти значения уже непрерывны в нашем наборе данных, поэтому нам вообще не нужно их кодировать.

Однако давайте объединим два столбца переменных в один столбец с помощью команды Numpy библиотеки np.c_ . Мы также создадим новую переменную для хранения целевых значений, указав фрейм данных boston и нужный столбец:

X = pd.DataFrame(np.c_[boston['LSTAT'], boston['RM']], columns=['LSTAT','RM']
Y = boston['MEDV']

Теперь давайте разделим фрейм данных на обучающие и тестовые наборы:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=9)

Теперь нам нужно создать экземпляр модели, который мы делаем, просто вызывая функцию Linear Regression из Scikit-Learn:

lin_reg_mod = LinearRegression()

Теперь мы подгоняем модель под обучающие данные:

lin_reg_mod.fit(X_train, y_train)

Теперь, когда модель подходит, мы можем делать прогнозы, вызывая команду predict . Мы делаем прогнозы на тестовом наборе:

pred = lin_reg_mod.predict(X_test)

Теперь мы проверим прогнозы относительно фактических значений с помощью метрик RMSE и R2, двух метрик, обычно используемых для оценки регрессионных задач:

test_set_rmse = (np.sqrt(mean_squared_error(y_test, pred)))

test_set_r2 = r2_score(y_test, pred)

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

Давайте распечатаем показатели точности и посмотрим, какие результаты мы получим:

print(test_set_rmse)
print(test_set_r2)

Вот наши результаты:

# Note that for rmse, the lower that value is, the better the fit
6.035041736063677
# The closer towards 1, the better the fit
0.6400551238836978

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

Вывод

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

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

Если вы хотите взглянуть на исходный код, он есть у нас на GitHub !