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

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

В Википедии говорится: «.. линейная регрессия - это линейный подход к моделированию взаимосвязи между скалярным откликом (или зависимой переменной) и одной или несколькими независимыми переменными (или независимыми переменными). Случай с одной независимой переменной называется простой линейной регрессией. Для нескольких независимых переменных процесс называется множественной линейной регрессией ».

Проще говоря, модель линейной регрессии используется для прогнозирования взаимосвязи между переменными или факторами. Прогнозируемый фактор называется скалярным откликом (или зависимой переменной). Факторы, которые используются для прогнозирования значения зависимой переменной, называются независимыми переменными (или независимыми переменными).

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

Теперь давайте перейдем к математике, лежащей в основе линейной регрессии.

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

Обратите внимание, что это уравнение прямой линии !.

Когда у нас есть n независимых переменных, уравнение можно записать как

здесь c обозначает точку пересечения оси y (точка, в которой линия пересекает ось y), а m обозначает наклон независимой переменной x.

На приведенном выше графике показана линия, уравнение которой имеет вид y = (2/3) x + 1. Мы получили значение m, вычислив наклон (2/3) и c как 1 (отсекает ось Y на 1).

Итак, в основном, если у нас есть уравнение, имеющее зависимую переменную и независимые переменные, мы можем предсказать зависимую переменную, подставив значения вместо независимых переменных.

Наша цель - найти значения m и c, которые минимизируют разницу между yₐ (фактическое) и yᵢ (прогнозируется).

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

Чтобы минимизировать разницу между yₐ и yᵢ, мы используем метод метода наименьших квадратов.

Метод наименьших квадратов

Метод наименьших квадратов помогает нам найти наиболее подходящую линию. Значения m (наклон) и c (пересечение) находятся путем хранения суммы квадратов разницы между yₐ (фактическое) и yᵢ (прогнозируемый) свернуто .

Мы покажем, как найти m и c строки наилучшего соответствия.

Шаг 1. Вычислите среднее значение x-значений и среднее значение y-значений.

Шаг 2: Следующая формула дает m (наклон) линии наилучшего соответствия.

Шаг 3. Вычислите значение c (y -пересечение) линии по формуле:

Шаг 4. Используйте наклон m и точку пересечения y c для формирования уравнение линии.

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

Линейная регрессия с scikit-learn

scikit-learn - это модуль Python с открытым исходным кодом, который предоставляет простые и эффективные инструменты для интеллектуального анализа и анализа данных, основанные на NumPy, SciPy и matplotlib.

Давайте реализуем модель линейной регрессии, используя scikit-learn в данных о клиентах электронной торговли.

Мы хотим спрогнозировать «Годовую сумму, потраченную клиентом на платформу электронной коммерции», чтобы эту информацию можно было использовать для предоставления индивидуализированных предложений конкретному клиенту или членства в программе лояльности и т. Д.

Итак, «Годовая сумма расходов» здесь является зависимой переменной.

# Importing required libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
customers = pd.read_csv('Ecomm-Customers.csv')
customers.info()

customers.info () дает следующий результат, который в основном дает обзор набора данных.

<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 500 entries, 0 to 499
Data columns (total 8 columns):
Email 500 non-null object
Address 500 non-null object
Avatar 500 non-null object
Avg. Session Length 500 non-null float64
Time on App 500 non-null float64
Time on Website 500 non-null float64
Length of Membership 500 non-null float64
Yearly Amount Spent 500 non-null float64
dtypes: float64(5), object(3)
memory usage: 31.4+ KB

Далее мы проверим, как выглядят некоторые строки в наборе данных.

customers.head()

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

sns.pairplot(customers)

Наше внимание сосредоточено на «Годовой сумме расходов», поэтому я выделил красным наиболее очевидные переменные («Продолжительность членства» и «Время в приложении»), которые имеют положительную корреляцию с зависимой переменной.

Теперь давайте воспользуемся тепловой картой и посмотрим, есть ли еще переменные, которые следует учитывать.

sns.heatmap(customers.corr(), linewidth=0.5, annot=True)

Наряду с известными переменными мы видим, что существует еще одна возможная переменная (Средняя длина сеанса), которая может помочь в прогнозировании зависимой переменной.

А пока остановимся на переменных с более высокой степенью корреляции с зависимой переменной.

x = customers[['Time on App', 'Length of Membership']]
y = customers['Yearly Amount Spent']

Мы хотим протестировать нашу модель позже, поэтому давайте разделим набор данных на обучающие и тестовые данные. Мы будем использовать данные поезда, чтобы соответствовать нашей модели, и тестовые данные, чтобы протестировать нашу модель. Обычно мы сохраняем 30% тестовых данных и 70% данных поездов.

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 50)

Теперь идет модель линейной регрессии.

lm = LinearRegression()
lm.fit(x_train, y_train)

Использовать линейную регрессию из библиотеки очень просто. Все те уравнения, которые мы обсуждали ранее, все они были выполнены, когда мы написали lm.fit (x_train, y_train). Довольно здорово, да!

print("Coeffs are Time on App : {0} , Length of Membership: {1}".format(lm.coef_[0], lm.coef_[1]))
print("Intercept : ",lm.intercept_)

Выход:

Coeffs are Time on App : 37.24859675165942 , Length of Membership: 62.76419727475292
Intercept :  -172.29634898449677

Коэффициенты - это не что иное, как значения m (наклон), а Intercept - это значение c, которое мы хотели вычислить. Теперь, когда мы подошли к нашей модели линейной регрессии, давайте получим результаты прогнозов! .

Мы используем функцию прогнозирования на тестовых данных, чтобы получить прогнозируемые значения зависимой переменной (годовая сумма расходов). Затем мы построим диаграмму рассеяния с тестовыми (фактическими) значениями «Годовой суммы расходов» и ее прогнозируемыми значениями.

result = lm.predict(x_test)
plt.scatter(y_test, result)
plt.xlabel("Actual values")
plt.ylabel("Predicted values")

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

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

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

print(‘R2 score : ‘,metrics.r2_score(y_test, result))
print(‘Variance: ‘,metrics.explained_variance_score(y_test,result))
print(‘MSE: ‘, metrics.mean_squared_error(y_test,result))

Выход:

R2 score :  0.8881506494029392
Variance:  0.8895559640312203
MSE:  711.9352710839121

Чем выше показатель R2, тем лучше, а чем ниже MSE, тем лучше. Глядя на ценности, кажется, что есть возможности для улучшения.

Помните, мы не учли переменную с меньшей степенью положительной корреляции? Давайте добавим эту переменную (Средняя продолжительность сеанса) и посмотрим, улучшит ли она нашу модель.

x = customers[['Time on App', 'Length of Membership','Avg. Session Length']]

Разделение набора данных, как это было сделано ранее.

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 50)

Давайте подгоним модель

lm.fit(x_train, y_train)

Давайте посмотрим на значения m и c.

print("Coeffs are Time on App : {0} , Length of Membership: {1} , Avg. Session Length: {2}".format(lm.coef_[0], lm.coef_[1], lm.coef_[2]))
print("Intercept : ",lm.intercept_)

Выход:

Coeffs are Time on App : 38.74012697347563 , Length of Membership: 61.779801807105294 , Avg. Session Length: 25.66375684798914
Intercept :  -1034.1551554733614

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

y = 38,74012697347563 * (Время в приложении) + 61,779801807105294 * (Продолжительность членства) + 25,66375684798914 * (Средняя продолжительность сеанса) -1034,1551554733614

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

result = lm.predict(x_test)
plt.scatter(y_test, result)
plt.xlabel("Actual values")
plt.ylabel("Predicted values")

Теперь это выглядит намного более компактным, чем предыдущий график, а это означает, что прогнозируемые и фактические значения намного ближе друг к другу. Уже сейчас можно сказать, что оценка R2 будет выше, а MSE - ниже.

Посмотрим, как обстоят дела у нашей модели на этот раз.

print('R2 score : ',metrics.r2_score(y_test, result))
print('Variance: ',metrics.explained_variance_score(y_test,result))
print('MSE ', metrics.mean_squared_error(y_test,result))

Выход:

R2 score :  0.9813533752076671
Variance:  0.9813536018865052
MSE  118.68812653328345

Это значительное улучшение показателя R2 (0,88 - ›0,98) и MSE (711,93 -› 118,68) с добавлением новой переменной.

Итак, добавлен столбец «Сред. «Продолжительность сеанса» значительно улучшила для нас модель, даже несмотря на то, что она имела небольшую положительную корреляцию с зависимой переменной.

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

Полную версию Jupyter Notebook с CSV-файлом набора данных можно найти на моем GitHub. Не стесняйтесь проверять это и предлагать улучшения модели здесь, в ответах.

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

(Это мой первый пост на Medium. Пожалуйста, не стесняйтесь проявить немного любви и, конечно, оставить отзыв.)

Мои другие сообщения:



Кроме того, посетите мой блог и подпишитесь на него, чтобы получать материалы до того, как увидите их здесь. Https://machinelearningmind.com/