www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Простая и множественная линейная регрессия в Python

Дата публикации May 8, 2017

Краткое введение в линейную регрессию в Python

Привет всем! Послекратко знакомство с библиотекой «Панды»так же хорошо какБиблиотека NumPyЯ хотел бы дать краткое введение в построение моделей в Python, и что может быть лучше для начала, чем одна из самых базовых моделей, линейная регрессия? Это будет первый пост о машинном обучении, и я планирую написать о более сложных моделях в будущем. Следите за обновлениями! Но сейчас давайте сосредоточимся на линейной регрессии.

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

Как видите, линейные отношения могут быть положительными (независимая переменная повышается, зависимая переменная повышается) или отрицательными (независимая переменная повышается, зависимая переменная понижается). Как я уже сказал, я сосредоточусь на реализации регрессионных моделей в Python, поэтому я не хочу углубляться в математику под регрессионным колпаком, но я немного напишу об этом. Если вы хотите написать в блоге об этом, не стесняйтесь писать мне в ответах!


Немного о математике

Связь между переменными Y и X представлена ​​этим уравнением:

Y`i = mX + b

В этом уравненииYявляется зависимой переменной - или переменной, которую мы пытаемся предсказать или оценить; X - независимая переменная - переменная, которую мы используем для прогнозирования; m - наклон линии регрессии - это представляет эффектИксимеет наY, Другими словами, еслиИксувеличивается на 1 единицу,Yувеличится ровномединицы. ("Полное раскрытие": это правда, только если мы знаем, чтоИкса такжеYиметь линейные отношения. Почти во всех случаях линейной регрессии это не будет правдой!)бявляется константой, также известной как Y-перехват. Если Х равно0, Yбудет равноб(Предостережение: смотрите полное раскрытие ранее!). Это не обязательно применимо в реальной жизни - мы не всегда будем знать точные отношения междуИкса такжеYили иметь точные линейные отношения.

Эти предостережения приводят нас кПростая линейная регрессия(SLR). В модели SLR мы строим модель, основанную на данных - наклон и Y-точка пересечения происходят из данных; кроме того, нам не нужны отношения междуИкса такжеYбыть точно линейным. Модели SLR также включают ошибки в данных (также известные как остатки). Сейчас я не буду вдаваться в подробности, возможно, в следующем посте, но остатки - это, в основном, различия между истинным значением Y и прогнозируемым / оценочным значением Y. Важно отметить, что в линейной регрессии мы пытаемся предсказать непрерывную переменную. В регрессионной модели мы пытаемся минимизировать эти ошибки, находя «линию наилучшего соответствия» - линия регрессии от ошибок будет минимальной. Мы пытаемся минимизировать длину черных линий (или, точнее, расстояние синих точек) от красной линии - как можно ближе к нулю. Это связано с (или эквивалентно) минимизациисреднеквадратическая ошибка (MSE)или суммаквадраты ошибки (SSE), также называемый «остаточной суммой квадратов» (RSS), но это может выходить за рамки этого сообщения в блоге :-)

В большинстве случаев у нас будет более одной независимой переменной - у нас будет несколько переменных; это может быть всего две независимые переменные и до сотен (или теоретически даже тысяч) переменных. в этих случаях мы будем использовать модель множественной линейной регрессии (MLR). Уравнение регрессии почти такое же, как простое уравнение регрессии, только с большим количеством переменных:

Y’i = b0 + b1X1i + b2X2i

На этом мы завершаем математическую часть этого поста :) Готовы приступить к реализации на Python?


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

Есть два основных способа выполнить линейную регрессию в Python - сStatsmodelsа такжеscikit учиться, Также можно использоватьScipy библиотека, но я чувствую, что это не так часто, как две другие библиотеки, которые я упомянул. Давайте посмотрим на выполнение линейной регрессии в обоих из них:

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

Statsmodels«Модуль Python, который предоставляет классы и функции для оценки множества различных статистических моделей, а также для проведения статистических тестов и исследования статистических данных». (из документации)

Как в сПандыа такжеNumPyСамый простой способ получить или установить Statsmodels черезАнаконда пакет, Если по какой-либо причине вы заинтересованы в установке другим способом, проверьтеэта ссылка После установки вам нужно будет импортировать его каждый раз, когда вы захотите его использовать:

import statsmodels.api as sm

Давайте посмотрим, как на самом деле использовать Statsmodels для линейной регрессии. Я буду использовать пример изкласс науки о данныхЯ взял вГенеральная Ассамблея DC:

Во-первых, мы импортируемнабор данных от sklearn(другая библиотека, которую я упомянул):

from sklearn import datasets ## imports datasets from scikit-learn
data = datasets.load_boston() ## loads Boston dataset from datasets library

Этонабор данных о ценах на жилье в Бостоне(ссылка на описание). Поскольку это набор данных, предназначенный для тестирования и обучения инструментам машинного обучения, он поставляется с описанием набора данных, и мы можем увидеть его с помощью командыРаспечататьdata.DESCR (это верно только для наборов данных sklearn, но не для каждого набора данных! Было бы здорово, хотя…). Я добавляю начало описания для лучшего понимания переменных:

Boston House Prices dataset
===========================

Notes
------
Data Set Characteristics:

:Number of Instances: 506

:Number of Attributes: 13 numeric/categorical predictive

:Median Value (attribute 14) is usually the target

:Attribute Information (in order):
- 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
- CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
- NOX nitric oxides concentration (parts per 10 million)
- RM average number of rooms per dwelling
- AGE proportion of owner-occupied units built prior to 1940
- DIS weighted distances to five Boston employment centres
- RAD index of accessibility to radial highways
- TAX full-value property-tax rate per $10,000
- PTRATIO pupil-teacher ratio by town
- B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
- LSTAT % lower status of the population
- MEDV Median value of owner-occupied homes in $1000's

:Missing Attribute Values: None

:Creator: Harrison, D. and Rubinfeld, D.L.

This is a copy of UCI ML housing dataset.
http://archive.ics.uci.edu/ml/datasets/Housing


This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.

Бегdata.feature_namesа такжеdata.targetвыведет имена столбцов независимых переменных и зависимых переменных соответственно. То есть Scikit-learn уже установил данные о стоимости дома / цене в качестве целевой переменной, а 13 других переменных - в качестве предикторов. Давайте посмотрим, как запустить линейную регрессию для этого набора данных.

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

import numpy as np
import pandas as pd# define the data/predictors as the pre-set feature names
df = pd.DataFrame(data.data, columns=data.feature_names)

# Put the target (housing value -- MEDV) in another DataFrame
target = pd.DataFrame(data.target, columns=["MEDV"])

Что мы сделали здесь, так это взяли набор данных и загрузили его как фрейм данных pandas; после этого мы устанавливаем предикторы (как df) - независимые переменные, которые предварительно установлены в наборе данных. Мы также устанавливаем цель - зависимую переменную или переменную, которую мы пытаемся предсказать / оценить.

Далее мы хотим соответствовать модели линейной регрессии. Нам нужно выбрать переменные, которые, по нашему мнению, будут хорошими предикторами для зависимой переменной - это можно сделать, проверив корреляцию (и) между переменными, построив график данных и осуществив визуальный поиск взаимосвязей, проведя предварительное исследование того, какие переменные являются хорошими предикторами для y и т. д. Для этого первого примера возьмем RM - среднее количество комнат и LSTAT - процент от более низкого статуса населения. Важно отметить, что Statsmodels не добавляет константу по умолчанию. Давайте сначала увидим это без константы в нашей регрессионной модели:

## Without a constant

import statsmodels.api as sm

X = df["RM"]
y = target["MEDV"]

# Note the difference in argument order
model = sm.OLS(y, X).fit()
predictions = model.predict(X) # make the predictions by the model

# Print out the statistics
model.summary()

Выход:

Интерпретация таблицы- Это очень длинный стол, не так ли? Сначала мы имеем то, что является зависимой переменной, а также модель и метод.МНКобозначаетОбычные наименьшие квадратыа метод «Наименьших квадратов» означает, что мы пытаемся подогнать линию регрессии, чтобы минимизировать квадрат расстояния от линии регрессии (см. предыдущий раздел этого поста). Дата и время довольно очевидны :) Так же, как количество наблюдений. Df остатков и моделей относится кстепени свободы- «количество значений в окончательном расчете статистики, которые могут варьироваться».

Коэффициент 3,634 означает, что в качествеRMпеременная увеличивается на 1, прогнозируемое значениеMDEVувеличивается на3,634, Несколько других важных значений - R-квадрат - процент дисперсии, который объясняет наша модель; стандартная ошибка (стандартное отклонение выборочного распределения статистики, чаще всего среднего значения); T баллы и р-значения, для проверки гипотезы -RMимеет статистически значимое значение p; есть 95% доверительные интервалы дляRM (Это означает, что мы прогнозируем с уверенностью 95%, что значениеRMнаходится между3,548в3,759).

Если мы хотим добавить константу в нашу модель - мы должны установить ее с помощью командыX = sm.add_constant(X)где X - имя вашего фрейма данных, содержащего ваши входные (независимые) переменные.

import statsmodels.api as sm # import statsmodels 

X = df["RM"] ## X usually means our input variables (or independent variables)
y = target["MEDV"] ## Y usually means our output/dependent variable
X = sm.add_constant(X) ## let's add an intercept (beta_0) to our model

# Note the difference in argument order
model = sm.OLS(y, X).fit() ## sm.OLS(output, input)
predictions = model.predict(X)

# Print out the statistics
model.summary()

Выход:

Интерпретация таблицы- С постоянным членом коэффициенты разные. Без константы мы вынуждаем нашу модель пройти начало координат, но теперь у нас есть y-перехват в-34,67, Мы также изменили наклонRMпредсказатель из3,634в9,1021,

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

X = df[[“RM”, “LSTAT”]]
y = target[“MEDV”]model = sm.OLS(y, X).fit()
predictions = model.predict(X)model.summary()

И вывод:

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

Интерпретация вывода- Мы видим здесь, что эта модель имеет гораздо более высокое значение R-квадрата - 0,948, что означает, что эта модель объясняет 94,8% дисперсии в нашей зависимой переменной. Всякий раз, когда мы добавляем переменные в регрессионную модель, R² будет выше, но это довольно высокое R². Мы можем видеть, что обаRMа такжеLSTATявляются статистически значимыми в прогнозировании (или оценке) средней стоимости дома; неудивительно, что мы видим, чтоRMувеличивается на1,MEDVувеличится на 4.9069 и когдаLSTATувеличивается на1,MEDVволяснижениена -0,6557. Как вы помните,LSTATэто процент от более низкого статуса населения, и, к сожалению, мы можем ожидать, что это снизит среднюю стоимость домов С этой же логикой, чем больше комнат в доме, тем больше будет его стоимость.

Это был пример как одиночной, так и множественной линейной регрессии в Statsmodels. Мы могли бы использовать как мало или столько переменных, сколько хотели в нашей регрессионной модели (ях) - до всех 13! Далее я покажу, как запускать модели линейной регрессии в SKLearn.

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

SKLearn - это в значительной степени золотой стандарт, когда речь заходит о машинном обучении на Python. Он имеет много алгоритмов обучения для регрессии, классификации, кластеризации и уменьшения размерности. Проверять, выписыватьсямой пост по алгоритму KNNдля карты различных алгоритмов и больше ссылок на SKLearn. Чтобы использовать линейную регрессию, нам нужно ее импортировать:

from sklearn import linear_model

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

from sklearn import datasets ## imports datasets from scikit-learn
data = datasets.load_boston() ## loads Boston dataset from datasets library

Далее мы загрузим данные в Pandas (как и раньше):

# define the data/predictors as the pre-set feature names  
df = pd.DataFrame(data.data, columns=data.feature_names)

# Put the target (housing value -- MEDV) in another DataFrame
target = pd.DataFrame(data.target, columns=["MEDV"])

Так что теперь, как и раньше, у нас есть фрейм данных, который содержит независимые переменные (помечены как «df») и фрейм данных с зависимой переменной (помечен как «цель»). Давайте подгоним регрессионную модель, используя SKLearn. Сначала мы определим наши X и Y - на этот раз я буду использовать все переменные в фрейме данных для прогнозирования цены на жилье:

X = df
y = target[“MEDV”]

И тогда я подберу модель:

lm = linear_model.LinearRegression()
model = lm.fit(X,y)

Функция lm.fit () подходит для линейной модели. Мы хотим использовать модель для прогнозирования (вот для чего мы здесь!), Поэтому мы будем использовать lm.predict ():

predictions = lm.predict(X)
print(predictions)[0:5]

Функция печати будет печатать первые 5 прогнозов для y (я не печатал весь список, чтобы «сэкономить место». Удаление [0: 5] напечатало бы весь список):

[ 30.00821269  25.0298606   30.5702317   28.60814055  27.94288232]

Помните, что lm.predict () предсказывает y (зависимую переменную), используя линейную модель, которую мы установили. Вы, должно быть, заметили, что когда мы запускаем линейную регрессию с SKLearn, мы не получаем симпатичную таблицу (хорошо, она не такая симпатичная ... но довольно полезная), как в Statsmodels. То, что мы можем сделать, это использовать встроенные функции для получения результата, коэффициентов и оценочных перехватов. Давайте посмотрим, как это работает:

lm.score(X,y)

Дал бы такой вывод:

0.7406077428649428

Это оценка R² нашей модели. Как вы, наверное, помните, это процент объясненной дисперсии прогнозов. Если тебе интересно,читать больше здесь, Далее, давайте проверим коэффициенты для предикторов:

lm.coef_

даст этот вывод:

array([ -1.07170557e-01,   4.63952195e-02,   2.08602395e-02,
2.68856140e+00, -1.77957587e+01, 3.80475246e+00,
7.51061703e-04, -1.47575880e+00, 3.05655038e-01,
-1.23293463e-02, -9.53463555e-01, 9.39251272e-03,
-5.25466633e-01])

и перехват:

lm.intercept_

что даст этот вывод:

36.491103280363134

Это все (предполагаемые / прогнозируемые) части уравнения множественной регрессии, о котором я упоминал ранее. Ознакомьтесь с документацией, чтобы узнать больше о coef_ и intercept_.


Итак, это было краткое (но довольно длинное!) Введение о том, как проводить линейную регрессию в Python. На практике вы не будете использовать весь набор данных, но разделите свои данные на обучающие данные, на которых будет тренироваться ваша модель, и тестовые данные - чтобы, как вы уже догадались, проверить свою модель / прогнозы. Если вы хотите прочитать об этом,пожалуйста, проверьте мой следующий пост в блоге.Между тем, я надеюсь, что вам понравился этот пост, и что я «увижу» вас в следующем.

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

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map