Определение

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

плюсы линейной регрессии

  • широко используемый
  • работает быстро
  • проста в использовании (не требуется большой настройки)
  • легко интерпретируемый
  • основа для многих других методов

Библиотеки

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

Данные

Фрейм данных с 200 наблюдениями по следующим 4 переменным.

2.TV

3. радио

4. газета

5.Продажи

Возможности

  • Телевидение: доллары, потраченные на рекламу на телевидении одного продукта на определенном рынке (в тысячах долларов).
  • Радио: рекламные доллары, потраченные на радио
  • Газета: рекламные доллары, потраченные на газету

Ответ

  • Продажи: продажи одного продукта на определенном рынке (в тысячах виджетов).

Ссылка для скачивания данных https://www.kaggle.com/purbar/advertising-data

import pandas as pd
import seaborn as sns
import statsmodels.formula.api as smf
from sklearn.linear_model import LinearRegression
from sklearn import metrics
from sklearn.model_selection import train_test_split
import numpy as np

# allow plots to appear directly in the notebook
%matplotlib inline

Чтение данных

# read data into a DataFrame
data = pd.read_csv('advertising.csv')
data.head()

# print the shape of the DataFrame
data.shape
OUTPUT
(200, 4)
There are 200 observations, and thus 200 markets in the dataset.

Визуализация

# visualize the relationship between the features and the response using scatterplots
sns.pairplot(data, x_vars=['TV','Radio','Newspaper'],y_vars='Sales', size=7, aspect=0.7)

Вопросы о рекламных данных

а. Есть ли связь между рекламой и продажами?

б. Насколько сильны эти отношения?

c. Какие типы рекламы способствуют продажам?

d. Каков эффект от продаж каждого типа рекламы?

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

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

1. простая линейная регрессия

Простая линейная регрессия - это подход к прогнозированию количественной реакции с использованием единственной функции (или «предиктора», или «входной переменной»). Он имеет следующий вид:

y=β0+β1x

Что означает каждый термин?

  • y - ответ / зависимый / целевой / объясненный
  • x - особенность
  • β0 - точка пересечения
  • β1 - коэффициент при x

Вместе β0β0 и β1β1 называются коэффициентами модели. мы должны найти значения этих коэффициентов. И как только мы найдем эти коэффициенты, мы сможем использовать модель для прогнозирования продаж!

OR

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

y=f(x) — — — (1)

что указывает на то, что переменная X влияет на другую переменную Y. Здесь функция может быть либо линейной функцией, либо нелинейной функцией. В этом разделе мы ограничимся только линейной функцией. Следовательно, мы можем написать уравнение. (1) как

y=α+βx — — — — (2)

где и - неизвестные параметры и очень часто называются коэффициентами пересечения и наклона.

Оценка («поиск») коэффициентов модели

Вообще говоря, коэффициенты оцениваются с использованием метода наименьших квадратов (ols), что означает, что мы найдем линию (математически), которая минимизирует сумму квадратов остатков (или «сумму квадратов ошибок »):

элементы присутствуют на изображении

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

Как коэффициенты модели соотносятся с линией наименьших квадратов?

  • β0 - точка пересечения (значение y при x = 0)
  • β1 - это наклон (изменение y, деленное на изменение x)

Вот графическое представление этих расчетов:

Оценим коэффициенты модели для рекламных данных:

Здесь я использую пакеты STATMODELS и SCIKIT-LEARN.

Здесь lm1 используется для представления пакета STATMODELS,

Здесь lm2 используется для представления пакета SCIKIT-LEARN.

### STATSMODELS ###
# create a fitted model
lm1 = smf.ols(formula='Sales ~ TV', data=data).fit()
# print the coefficients
lm1.params
OUTPUT
Intercept    6.974821
TV           0.055465
dtype: float64

### SCIKIT-LEARN ###
# create X and y
feature_cols = ['TV']
X = data[feature_cols]
y = data.Sales
# Initiate and fit
lm2 = LinearRegression()
lm2.fit(X, y)
# print the coefficients
print ("iNTERCEPT : ",lm2.intercept_)
print ("CO-EFFICIENT : ",lm2.coef_)
OUTPUT
iNTERCEPT :  6.9748214882298925
CO-EFFICIENT :  [0.05546477]

Интерпретация коэффициентов модели

интерпретируем коэффициент TV (β1)?

  • «Единичное» увеличение расходов на телерекламу связано с увеличением продаж на 0,0554647 «единицы».
  • Или, более ясно: дополнительная 1000 долларов, потраченная на телевизионную рекламу, связана с увеличением продаж на 47 537 виджетов.

Обратите внимание, что если увеличение расходов на телерекламу было связано с снижением продаж, β1 будет отрицательным.

Использование модели для прогнозирования

Допустим, появился новый рынок, на котором расходы на телевизионную рекламу составили 50 000 долларов. Что мы прогнозируем для продаж на этом рынке?

y=β0+β1x

y=6.974821+0.05546477×50

# manually calculate the prediction
6.974821 + 0.05546477*50
OUTPUT
9.7480595

ПРОГНОЗ

### STATSMODELS ###
# you have to create a DataFrame since the Statsmodels formula interface expects it
X_new = pd.DataFrame({'TV': [50]})
# predict for a new observation
lm1.predict(X_new)
OUTPUT
0    9.74806
dtype: float64
### SCIKIT-LEARN ###
# predict for a new observation
lm2.predict([[50]])
OUTPUT
array([9.74806001])

Таким образом, мы прогнозируем продажи 9 409 виджетов на этом рынке.

Построение линии наименьших квадратов

Давайте построим линию наименьших квадратов для продаж в зависимости от каждой из характеристик:

sns.pairplot(data, x_vars=['TV','Radio','Newspaper'], y_vars='Sales', size=7, aspect=0.7, kind='reg')

Проверка гипотез и p-значения

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

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

Что касается коэффициентов модели, вот обычный тест гипотезы:

  • нулевая гипотеза: между телеобъявлениями и продажами нет никакой связи (поэтому β1β1 равно нулю).
  • альтернативная гипотеза: существует связь между телеобъявлениями и продажами (и, следовательно, β1β1 не равно нулю).

Как проверить эту гипотезу? Интуитивно мы отвергаем ноль (и, таким образом, верим в альтернативу), если 95% доверительный интервал не включает ноль. И наоборот, p-значение представляет вероятность того, что коэффициент на самом деле равен нулю:

### STATSMODELS ###
# print the p-values for the model coefficients
lm1.pvalues
OUTPUT
Intercept    5.027719e-54
TV           7.927912e-74
dtype: float64

p-значение меньше 0,05 - это один из способов определить, существует ли связь между функцией и ответом.

В этом случае значение p для ТВ намного меньше 0,05, и поэтому мы полагаем, что существует связь между телеобъявлениями и продажами.

обычно мы не учитываем p-значение для точки пересечения.

Насколько хорошо модель соответствует данным?

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

R-квадрат находится между 0 и 1, и чем больше, тем лучше, потому что это означает, что модель объясняет большую дисперсию. Вот пример того, как «выглядит» R-квадрат:

Вы можете видеть, что

синяя линия объясняет некоторые различия в данных (R-квадрат = 0,54),

зеленая линия объясняет большую часть дисперсии (R-квадрат = 0,64), а

красная линия еще больше соответствует данным обучения (R-квадрат = 0,66).

Теперь вычисляем значение R-квадрат для нашей простой линейной модели:

### STATSMODELS ###
# print the R-squared value for the model
print("StatModel R-Square Value",lm1.rsquared)
OUTPUT
StatModel R-Square Value 0.8121757029987414
### SCIKIT-LEARN ###
# print the R-squared value for the model
print("SkLearn R-Square Value",lm2.score(X, y))
OUTPUT
SkLearn R-Square Value 0.8121757029987413

Число хорошего значения R-квадрата во многом зависит от домена. Поэтому он наиболее полезен для сравнения разных моделей.

Множественная линейная регрессия

Простую линейную регрессию можно легко расширить, включив в нее несколько функций. Это называется множественной линейной регрессией:

y = β0 + β1x1 +… + βnxn

Каждый x представляет отдельный объект, и у каждого объекта есть свой коэффициент. В этом случае:

y = β0 + β1 × ТВ + β2 × Радио + β3 × Газета

### STATSMODELS ###
# create a fitted model with all three features
lm1 = smf.ols(formula='Sales ~ TV + Radio + Newspaper', data=data).fit()
# print the coefficients
lm1.params
OUTPUT
Intercept    4.625124
TV           0.054446
Radio        0.107001
Newspaper    0.000336
dtype: float64
### SCIKIT-LEARN ###
# create X and y
feature_cols = ['TV', 'Radio', 'Newspaper']
X = data[feature_cols]
y = data.Sales
# instantiate and fit
lm2 = LinearRegression()
lm2.fit(X, y)
# print the coefficients
print (lm2.intercept_)
print (lm2.coef_)
OUTPUT
4.625124078808653
[0.05444578 0.10700123 0.00033566]
# pair the feature names with the coefficients
list(zip(feature_cols, lm2.coef_))
OUTPUT
[('TV', 0.05444578033757093),
 ('Radio', 0.10700122823870299),
 ('Newspaper', 0.0003356579223305887)]

При заданной сумме расходов на рекламу на радио и в газетах увеличение расходов на телерекламу на 1000 долларов связано с увеличением продаж на 54,4457 виджетов.

В итоговом выводе модели Statsmodels мы можем увидеть все статистические показатели.

### STATSMODELS ###
# print a summary of the fitted model
lm1.summary()

  • Телевидение и радио имеют значительные p-значения, а газеты - нет. Таким образом, мы отвергаем нулевую гипотезу для телевидения и радио (что нет связи между этими функциями и продажами) и не можем отклонить нулевую гипотезу для газет.
  • Расходы на теле- и радиорекламу положительно связаны с продажами, тогда как расходы на рекламу в газетах немного отрицательно связаны с продажами.
  • Эта множественная линейная модель имеет более высокий R-квадрат (0,903), чем простая линейная модель, что означает, что эта модель лучше соответствует данным, чем модель, которая включает только телевидение.

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

# определить истинное и прогнозируемое значения ответа
y_true = [100, 50, 30, 20]
y_pred = [90, 50, 50, 30]

# calculate MAE, MSE, RMSE
print ("mean_absolute_error :",metrics.mean_absolute_error(y_true, y_pred))
print ("mean_squared_error : ",metrics.mean_squared_error(y_true, y_pred))
print ("root_mean_squared_error : ",np.sqrt(metrics.mean_squared_error(y_true, y_pred)))
OUTPUT
mean_absolute_error : 10.0
mean_squared_error :  150.0
root_mean_squared_error :  12.24744871391589

MSE более популярна, чем MAE, потому что MSE «устраняет» более крупные ошибки. Но RMSE даже лучше, чем MSE, потому что RMSE интерпретируется в единицах «y».

Оценка модели с использованием кросс-валидации

from sklearn.model_selection import cross_val_score, cross_val_predict
scores = cross_val_score(lm2, data, y, cv=6)
print ("Cross-validated scores:", scores)
OUTPUT
Cross-validated scores: [1. 1. 1. 1. 1. 1.]

Мы видим, что мы получили 100% предсказанную точность перекрестной проверки. Иногда так получается около 90–97.

Примечание. Получение 100% точности не означает, что мы прогнозируем со 100% вероятностью отклонения от истинного и прогнозируемого, т. е. модель обеспечивает точность около 98–100%.

Github Gist LInk

Https://gist.github.com/HarisH-Reddy-DS/b29d104c521aa1a3cc558d9f59a200e7

Мой профиль на Github



использованная литература

  1. Аналитика Видья
  2. к науке о данных
  3. выродки
  4. stackexchange