Определение
Проблемы регрессии - это задачи контролируемого обучения, в которых реакция является непрерывной. Классификационные задачи - это контролируемые обучающие задачи, ответы на которые категоричны. Линейная регрессия - это метод, который полезен для прогнозируемых проблем.
плюсы линейной регрессии
- широко используемый
- работает быстро
- проста в использовании (не требуется большой настройки)
- легко интерпретируемый
- основа для многих других методов
Библиотеки
Мы будем использовать 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
использованная литература
- Аналитика Видья
- к науке о данных
- выродки
- stackexchange