机器学习-线性回归(Linear Regression)介绍与python实现

微信公众号:yale记 关注可了解更多的教程问题或建议,请公众号留言。

背景介绍

本文讨论了线性回归的基础知识及其在Python编程语言中的实现。线性回归是一种统计方法,用于建模具有给定自变量集的因变量之间的关系。注意:在本文中,为简单起见,我们将因变量作为响应和自变量引用作为特征。为了提供线性回归的基本理解,我们从最基本的线性回归版本开始,即简单线性回归。

简单线性回归

简单线性回归是一种使用单个特征预测响应的方法。假设这两个变量是线性相关的。 因此,我们试图找到一个线性函数,它尽可能准确地预测响应值(y)作为特征或自变量(x)的函数。让我们考虑一个数据集,其中我们对每个特征x都有一个响应值y:

我们定义:

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轴截距和斜率。

要创建我们的模型,我们必须“学习”或估计回归系数b_0和b_1的值。一旦我们估算了这些系数,我们就可以使用该模型来预测响应!在本文中,我们将使用最小二乘法技术。

现在考虑:

这里,e_i是第i次观察中的残差。

因此,我们的目标是最大限度地减少总残留误差。

我们定义平方误差或成本函数,J为:

我们的任务是找到j(b_0,b_1)最小的b_0和b_1的值!

在不进入数学细节的情况下,我们在此处提供结果:

其中SS_xy是y和x的交叉偏差之和:

和SS_xx是x的平方偏差之和:

注意:可以在此处找到在简单线性回归中查找最小二乘估计的完整推导。 下面给出了我们的数据集上面python实现的代码:

import numpy as npimport matplotlib.pyplot as plt def estimate_coef(x, y): 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_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() def main(): 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]) # 估计系数 b = estimate_coef(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 = -0.0586206896552
b_1 = 1.45747126437

获得的图形如下所示:

多元线性回归

多元线性回归试图通过将线性方程拟合到观察数据来模拟两个或更多个特征与响应之间的关系。显然,它只不过是简单线性回归的扩展。

考虑具有p个特征(或独立变量)和一个响应(或因变量)的数据集。

此外,数据集包含n行/观察。

我们定义:

X(特征矩阵)=大小为n×p的矩阵,其中x_ {ij}表示第i个观察的第j个特征的值。

所以:

y(响应向量)=大小为n的向量,其中y_ {i}表示第i次观察的响应值。

p特征的线性回归表示:

其中h(x_i)是第i次观测的预测响应值,b_0,b_1,...,b_p是回归系数。

另外,我们可以写:

其中e_i表示第i次观察中的残差。通过将特征矩阵X表示为:我们可以更多地概括我们的线性模型:

所以现在,线性模型可以用矩阵表示为:

其中,

现在,我们确定b的估计,即使用最小二乘法的b'。

如已经解释的,最小二乘法倾向于确定b',其总残余误差被最小化。

我们直接在这里展示结果:

其中'代表矩阵的转置,而-1代表矩阵逆。

知道最小二乘估计,b',现在可以将多元线性回归模型估计为:

其中y'是估计的响应向量。

注意:可以在此处找到在多元线性回归中获得最小二乘估计的完整推导。

下面给出了使用Scikit-learn在波士顿房屋定价数据集上实现多元线性回归技术。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn import datasets, linear_model, metrics # 加载波士顿数据集boston = datasets.load_boston(return_X_y=False) # 定义特征矩阵(X)和响应向量(y)X = boston.datay = boston.target # 将X和y分成训练和测试集from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1) # 创建线性回归对象reg = linear_model.LinearRegression() # 使用训练集训练模型reg.fit(X_train, y_train) # 回归系数print('Coefficients: \n', reg.coef_) # 方差分数:1表示完美预测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:
[ -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

残差错误图:

在上面的例子中,我们使用Explained Variance Score确定准确度分数。

我们定义:

explain_variance_score = 1 - Var {y - y'} / Var {y}

其中y'是估计的目标输出,y是相应的(正确的)目标输出,Var是方差,即标准偏差的平方。最好的分数是1.0,较低的值更差。

假设下面给出了线性回归模型对应用它的数据集的基本假设:

线性关系:响应和特征变量之间的关系应该是线性的。 可以使用散点图来测试线性假设。 如下所示,第一个图表示线性相关变量,其中第二个和第三个图中的变量很可能是非线性的。 因此,第一个数字将使用线性回归给出更好的预测。

  • 很少或没有多重共线性:假设数据中很少或没有多重共线性。当特征(或独立变量)彼此不相互独立时,就会发生多重共线性。
  • 很少或没有自相关:另一个假设是数据中很少或没有自相关。当残余误差彼此不相关时,发生自相关。您可以在此处参考以了解有关此主题的更多信息。
  • 同方差性:同方差性描述了一种情况,其中误差项(即,自变量和因变量之间的关系中的“噪声”或随机扰动)在自变量的所有值上是相同的。如下所示,图1具有同方差性,而图2具有异方差性。

当我们到达本文末尾时,我们将讨论下面的线性回归的一些应用。

应用

1.趋势线:趋势线代表一些定量数据随时间的变化(如GDP,油价等)。这些趋势通常遵循线性关系。因此,可以应用线性回归来预测未来值。然而,在其他潜在变化可能影响数据的情况下,该方法缺乏科学有效性。

2.经济学:线性回归是经济学中主要的经验工具。例如,它用于预测消费支出,固定投资支出,库存投资,国家出口购买,进口支出,持有流动资产的需求,劳动力需求和劳动力供应。

3.财务:资本价格资产模型使用线性回归来分析和量化投资的系统风险。

4.生物学:线性回归用于模拟生物系统中参数之间的因果关系。

原文发布于微信公众号 - yale记(python_yale_learning)

原文发表时间:2019-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券