Линейная регрессия (реализация на Python)

Опубликовано: 2 Марта, 2022

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

Простая линейная регрессия

Простая линейная регрессия - это подход к прогнозированию ответа с использованием одной функции .
Предполагается, что две переменные связаны линейно. Следовательно, мы пытаемся найти линейную функцию, которая предсказывает значение отклика (y) как можно точнее как функцию функции или независимой переменной (x).
Давайте рассмотрим набор данных, в котором у нас есть значение ответа y для каждой функции x:

Для общности определим:
x как вектор признаков , т.е. x = [x_1, x_2,…., x_n],
y как вектор ответа , т.е. y = [y_1, y_2,…., y_n]
для n наблюдений (в примере выше n = 10).
Диаграмма рассеяния вышеприведенного набора данных выглядит так: -

Теперь задача состоит в том, чтобы найти линию, которая лучше всего подходит для приведенного выше графика рассеяния, чтобы мы могли предсказать реакцию на любые новые значения функций. (т.е. значение x отсутствует в наборе данных)
Эта линия называется линией регрессии .
Уравнение линии регрессии представлено в виде:

Здесь,

  • h (x_i) представляет собой предсказанное значение отклика для i- го наблюдения.
  • b_0 и b_1 - коэффициенты регрессии и представляют точку пересечения по оси y и наклон линии регрессии соответственно.

To create our model, we must “learn” or estimate the values of regression coefficients b_0 and b_1. And once we’ve estimated these coefficients, we can use the model to predict responses!
In this article, we are going to use the principle of  Least Squares .
Now consider:

Here, e_i is residual error in ith observation. 
So, our aim is to minimize the total residual error.
We define the squared error or cost function, J as: 

and our task is to find the value of b_0 and b_1 for which J(b_0,b_1) is minimum!
Without going into the mathematical details, we present the result here:


where SS_xy is the sum of cross-deviations of y and x: 

and SS_xx is the sum of squared deviations of x: 

Note: The complete derivation for finding least squares estimates in simple linear regression can be found here.
Given below is the python implementation of above technique on our small dataset:
 

Python

import numpy as np
import matplotlib.pyplot as plt
 
def estimate_coef(x, y):
    # number of observations/points
    n = np.size(x)
 
    # mean of x and y vector
    m_x = np.mean(x)
    m_y = np.mean(y)
 
    # calculating cross-deviation and deviation about x
    SS_xy = np.sum(y*x) - n*m_y*m_x
    SS_xx = np.sum(x*x) - n*m_x*m_x
 
    # calculating regression coefficients
    b_1 = SS_xy / SS_xx
    b_0 = m_y - b_1*m_x
 
    return (b_0, b_1)
 
def plot_regression_line(x, y, b):
    # plotting the actual points as scatter plot
    plt.scatter(x, y, color = "m",
               marker = "o", s = 30)
 
    # predicted response vector
    y_pred = b[0] + b[1]*x
 
    # plotting the regression line
    plt.plot(x, y_pred, color = "g")
 
    # putting labels
    plt.xlabel("x")
    plt.ylabel("y")
 
    # function to show plot
    plt.show()
 
def main():
    # observations / data
    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    y = np.array([1, 3, 2, 5, 7, 8, 8, 9, 10, 12])
 
    # estimating coefficients
    b = estimate_coef(x, y)
    print("Estimated coefficients: b_0 = {} 
           b_1 = {}".format(b[0], b[1]))
 
    # plotting regression line
    plot_regression_line(x, y, b)
 
if __name__ == "__main__":
    main()

Вывод приведенного выше фрагмента кода:

 Расчетные коэффициенты:
b_0 = -0,0586206896552
b_1 = 1,45747126437

И полученный график выглядит так:

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

Multiple linear regression attempts to model the relationship between two or more features and a response by fitting a linear equation to the observed data.
Clearly, it is nothing but an extension of simple linear regression.
Consider a dataset with p features(or independent variables) and one response(or dependent variable). 
Also, the dataset contains n rows/observations.
We define:
X (feature matrix) = a matrix of size n X p where x_{ij} denotes the values of jth feature for ith observation.
So, 

and
y (response vector) = a vector of size n where y_{i} denotes the value of response for ith observation.

The regression line for p features is represented as: 

where h(x_i) is predicted response value for ith observation and b_0, b_1, …, b_p are the regression coefficients.
Also, we can write: 

where e_i represents residual error in ith observation.
We can generalize our linear model a little bit more by representing feature matrix X as: 

So now, the linear model can be expressed in terms of matrices as: 

where, 

and

Now, we determine estimate of b, i.e. b’ using Least Squares method.
As already explained, Least Squares method tends to determine b’ for which total residual error is minimized.
We present the result directly here: 

where ‘ represents the transpose of the matrix while -1 represents the matrix inverse.
Knowing the least square estimates, b’, the multiple linear regression model can now be estimated as:

where y’ is estimated response vector.
Note: The complete derivation for obtaining least square estimates in multiple linear regression can be found here.
Given below is the implementation of multiple linear regression technique on the Boston house pricing dataset using Scikit-learn.
 

Python

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, metrics
 
# load the boston dataset
boston = datasets.load_boston(return_X_y=False)
 
# defining feature matrix(X) and response vector(y)
X = boston.data
y = boston.target
 
# splitting X and y into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,
                                                    random_state=1)
 
# create linear regression object
reg = linear_model.LinearRegression()
 
# train the model using the training sets
reg.fit(X_train, y_train)
 
# regression coefficients
print("Coefficients: ", reg.coef_)
 
# variance score: 1 means perfect prediction
print("Variance score: {}".format(reg.score(X_test, y_test)))
 
# plot for residual error
 
## setting plot style
plt.style.use("fivethirtyeight")
 
## plotting residual errors in training data
plt.scatter(reg.predict(X_train), reg.predict(X_train) - y_train,
            color = "green", s = 10, label = "Train data")
 
## plotting residual errors in test data
plt.scatter(reg.predict(X_test), reg.predict(X_test) - y_test,
            color = "blue", s = 10, label = "Test data")
 
## plotting line for zero residual error
plt.hlines(y = 0, xmin = 0, xmax = 50, linewidth = 2)
 
## plotting legend
plt.legend(loc = "upper right")
 
## plot title
plt.title("Residual errors")
 
## method call for showing the plot
plt.show()

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

Coefficients:
[ -8.80740828e-02   6.72507352e-02   5.10280463e-02   2.18879172e+00
-1.72283734e+01   3.62985243e+00   2.13933641e-03  -1.36531300e+00
2.88788067e-01  -1.22618657e-02  -8.36014969e-01   9.53058061e-03
-5.05036163e-01]
Variance score: 0.720898784611

и график остаточной ошибки выглядит так:

В приведенном выше примере мы определяем показатель точности с помощью показателя объясненной дисперсии .
Мы определяем:
объясненная_вариантная_счет = 1 - Вар {y - y '} / Вар {y}
где y '- предполагаемый целевой результат, y - соответствующий (правильный) целевой результат, а Var - это дисперсия, квадрат стандартного отклонения.
Наилучшая возможная оценка - 1.0, более низкие значения - хуже.

Предположения

Ниже приведены основные предположения, которые делает модель линейной регрессии в отношении набора данных, к которому она применяется:

  • Линейная взаимосвязь : взаимосвязь между откликом и характеристическими переменными должна быть линейной. Предположение о линейности можно проверить с помощью диаграмм рассеяния. Как показано ниже, 1-й рисунок представляет линейно связанные переменные, тогда как переменные на 2-м и 3-м рисунках, скорее всего, являются нелинейными. Итак, 1-е число даст лучшие прогнозы с использованием линейной регрессии.

  • Малая мультиколлинеарность или ее отсутствие. Предполагается, что мультиколлинеарность данных незначительна или отсутствует. Мультиколлинеарность возникает, когда признаки (или независимые переменные) не независимы друг от друга.
  • Небольшая автокорреляция или ее отсутствие . Другое предположение состоит в том, что автокорреляция в данных незначительна или отсутствует. Автокорреляция возникает, когда остаточные ошибки не независимы друг от друга. Вы можете обратиться сюда, чтобы получить более подробное представление об этой теме.
  • Гомоскедастичность : гомоскедастичность описывает ситуацию, в которой член ошибки (то есть «шум» или случайное нарушение во взаимосвязи между независимыми переменными и зависимой переменной) одинаков для всех значений независимых переменных. Как показано ниже, рисунок 1 имеет гомоскедастичность, а рисунок 2 - гетероскедастичность.

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

Приложения:

1. Линии тренда: линия тренда представляет изменение количественных данных с течением времени (например, ВВП, цены на нефть и т. Д.). Эти тенденции обычно имеют линейную зависимость. Следовательно, линейная регрессия может применяться для прогнозирования будущих значений. Однако этот метод страдает отсутствием научной обоснованности в тех случаях, когда другие потенциальные изменения могут повлиять на данные.
2. Экономика: линейная регрессия - преобладающий эмпирический инструмент в экономике. Например, он используется для прогнозирования потребительских расходов, инвестиций в основной капитал, инвестиций в товарно-материальные запасы, покупок экспорта страны, расходов на импорт, спроса на удержание ликвидных активов, спроса на рабочую силу и предложения рабочей силы.
3. Финансы. Модель стоимости капитала использует линейную регрессию для анализа и количественной оценки систематических рисков инвестиций.
4. Биология: линейная регрессия используется для моделирования причинно-следственных связей между параметрами в биологических системах.

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

  • https://en.wikipedia.org/wiki/Linear_regression
  • https://en.wikipedia.org/wiki/Simple_linear_regression
  • http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html
  • http://www.statisticssolutions.com/assumings-of-linear-regression/

Этот блог предоставлен Нихилом Кумаром. Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.