回归算法 - 线性回归


线性回归简介

线性回归可以定义为分析因变量与给定的一组自变量之间的线性关系的统计模型。变量之间的线性关系是指当一个或多个自变量的值发生变化(增加或减少)时,因变量的值也会相应变化(增加或减少)。

从数学上讲,这种关系可以借助以下等式来表示 -

Y = mX + b

这里,Y 是我们试图预测的因变量

X是我们用来进行预测的因变量。

m是回归线的斜率,表示 X 对 Y 的影响

b是一个常数,称为 Y 截距。如果 X = 0,Y 将等于 b。

此外,线性关系本质上可以是正的或负的,如下所述 -

正线性关系

如果自变量和因变量都增加,则线性关系称为正关系。可以借助下图来理解 -

正线性

负线性关系

如果自变量增加而因变量减少,则线性关系称为正关系。可以借助下图来理解 -

负线性

线性回归的类型

线性回归有以下两种类型 -

  • 简单线性回归
  • 多元线性回归

简单线性回归 (SLR)

它是线性回归的最基本版本,它使用单个特征来预测响应。SLR 中的假设是两个变量线性相关。

Python实现

我们可以通过两种方式在Python中实现SLR,一种是提供自己的数据集,另一种是使用scikit-learn python库中的数据集。

示例 1 - 在下面的 Python 实现示例中,我们使用我们自己的数据集。

首先,我们将从导入必要的包开始,如下所示 -

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

接下来,定义一个函数来计算 SLR 的重要值 -

def coef_estimation(x, y):

以下脚本行将给出观察数 n -

n = np.size(x)

x 和 y 向量的平均值可以计算如下 -

m_x, m_y = np.mean(x), np.mean(y)

我们可以找到关于 x 的交叉偏差和偏差如下 -

SS_xy = np.sum(y*x) - n*m_y*m_x
SS_xx = np.sum(x*x) - n*m_x*m_x

接下来,回归系数即 b 可以计算如下 -

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):

以下脚本行将实际点绘制为散点图 -

plt.scatter(x, y, color = "m", marker = "o", s = 30)

以下脚本行将预测响应向量 -

y_pred = b[0] + b[1]*x

以下脚本行将绘制回归线并在其上放置标签 -

plt.plot(x, y_pred, color = "g")
plt.xlabel('x')
plt.ylabel('y')
plt.show()

最后,我们需要定义 main() 函数来提供数据集并调用我们上面定义的函数 -

def main():
   x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
   y = np.array([100, 300, 350, 500, 750, 800, 850, 900, 1050, 1250])
   b = coef_estimation(x, y)
   print("Estimated coefficients:\nb_0 = {} \nb_1 = {}".format(b[0], b[1]))
   plot_regression_line(x, y, b)
   
if __name__ == "__main__":
main()

输出

Estimated coefficients:
b_0 = 154.5454545454545
b_1 = 117.87878787878788
数据集

示例 2 - 在以下 Python 实现示例中,我们使用 scikit-learn 的糖尿病数据集。

首先,我们将从导入必要的包开始,如下所示 -

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

接下来,我们将加载糖尿病数据集并创建其对象 -

diabetes = datasets.load_diabetes()

当我们实现 SLR 时,我们将仅使用一项功能,如下所示 -

X = diabetes.data[:, np.newaxis, 2]

接下来,我们需要将数据分为训练集和测试集,如下所示 -

X_train = X[:-30]
X_test = X[-30:]

接下来,我们需要将目标分为训练集和测试集,如下所示 -

y_train = diabetes.target[:-30]
y_test = diabetes.target[-30:]

现在,为了训练模型,我们需要创建线性回归对象,如下所示 -

regr = linear_model.LinearRegression()

接下来,使用训练集训练模型,如下所示 -

regr.fit(X_train, y_train)

接下来,使用测试集进行预测,如下所示 -

y_pred = regr.predict(X_test)

接下来,我们将打印一些系数,如 MSE、方差分数等,如下 -

print('Coefficients: \n', regr.coef_)
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
print('Variance score: %.2f' % r2_score(y_test, y_pred))

现在,绘制输出如下 -

plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

输出

Coefficients:
   [941.43097333]
Mean squared error: 3035.06
Variance score: 0.41
红蓝

多元线性回归 (MLR)

它是简单线性回归的扩展,使用两个或多个特征来预测响应。从数学上我们可以解释如下 -

考虑一个具有 n 个观测值、p 个特征(即自变量)和 y 作为一个响应(即因变量)的数据集,p 个特征的回归线可以计算如下 -

$$h(x_{i})=b_{0}+b_{1}x_{i1}+b_{2}x_{i2}+...+b_{p}x_{ip}$$

这里,h(x i ) 是预测响应值,b 0 ,b 1 ,b 2 …,b p是回归系数。

多元线性回归模型始终包含数据中的误差,称为残差,这会改变计算如下 -

$$h(x_{i})=b_{0}+b_{1}x_{i1}+b_{2}x_{i2}+...+b_{p}x_{ip}+e_{i} $$

我们还可以将上面的等式写如下 -

$$y_{i}=h(x_{i})+e_{i}\:或\:e_{i}= y_{i} - h(x_{i})$$

Python实现

在此示例中,我们将使用 scikit learn 的波士顿住房数据集 -

首先,我们将从导入必要的包开始,如下所示 -

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, metrics

接下来,加载数据集如下 -

boston = datasets.load_boston(return_X_y=False)

以下脚本行将定义特征矩阵 X 和响应向量 Y -

X = boston.data
y = boston.target

接下来,将数据集分为训练集和测试集,如下所示 -

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.7, random_state=1)

例子

现在,创建线性回归对象并训练模型,如下所示 -

reg = linear_model.LinearRegression()
reg.fit(X_train, y_train)
print('Coefficients: \n', reg.coef_)
print('Variance score: {}'.format(reg.score(X_test, y_test)))
plt.style.use('fivethirtyeight')
plt.scatter(reg.predict(X_train), reg.predict(X_train) - y_train,
   color = "green", s = 10, label = 'Train data')
plt.scatter(reg.predict(X_test), reg.predict(X_test) - y_test,
   color = "blue", s = 10, label = 'Test data')
plt.hlines(y = 0, xmin = 0, xmax = 50, linewidth = 2)
plt.legend(loc = 'upper right')
plt.title("Residual errors")
plt.show()

输出

Coefficients:
[
   -1.16358797e-01  6.44549228e-02  1.65416147e-01  1.45101654e+00
   -1.77862563e+01  2.80392779e+00  4.61905315e-02 -1.13518865e+00
    3.31725870e-01 -1.01196059e-02 -9.94812678e-01  9.18522056e-03
   -7.92395217e-01
]
Variance score: 0.709454060230326
点

假设

以下是关于线性回归模型所做的数据集的一些假设 -

多重共线性- 线性回归模型假设数据中很少或没有多重共线性。基本上,当自变量或特征具有依赖性时,就会发生多重共线性。

自相关- 线性回归模型假设的另一个假设是数据中很少或没有自相关。基本上,当残差误差之间存在依赖性时,就会发生自相关。

变量之间的关系- 线性回归模型假设响应和特征变量之间的关系必须是线性的。