多元线性回归模型(机器学习线性回归原理介绍和功能实现)

多元线性回归模型(机器学习线性回归原理介绍和功能实现)

多元回归模型(机器学习线性回归原理介绍及功能实现)

线性回归模型是最简单的线性模型之一,很有代表性。本文将详细介绍机器学习中线性回归模型的求解过程和编码实现。

内容摘要:

1.什么是线性回归

在几何意义上,回归就是寻找一条有代表性的直线或曲线(高维空)来拟合输入数据点和输出数据点。线性回归可以理解为寻找用于拟合输入数据点和输出数据点的代表性直线或曲线的过程。

为了理解线性回归的概念,我们可以先从一个例子引入本文的主题。

1.1问题描述-波士顿房价预测

波士顿房价预测是一个经典的线性回归案例。本案例中使用的数据集来自美国人口普查局在20世纪70年代中期收集的关于美国马萨诸塞州波士顿房价的信息。这个数据集统计了当地城镇人均犯罪率,城镇非零售商业比重等。总共有13个指标(特征),第14个特征(相当于标签信息)给出了房屋的报价中值。我们先来看这组数据,

有关特征转换,请参考下图。

1.2特性、标签和样品

通过上面波士顿房价预测的数据集,先介绍机器学习中关于数据集的一些概念,

特征:输入变量,即简单线性回归中的X个变量(如颜色、天气、水果等。).在这个数据集中,每一列代表一个特征(最后一列的标签除外),共有13个特征。

标签:我们想要预测的东西,即简单线性回归中的Y变量。标签可以是连续值(如房价、股市等。)或者离散值(今天是什么日子,水果好吃不好吃等等。).在这个数据集中,价格的最后一列是标签。

样本:指数据的具体实例(样本包括训练集和测试集)。在这个数据集中,每一行代表一个样本。

备注:该数据集可从卡内基梅隆大学统计与数据科学实验室或Kaggle网站下载。下载后需要删除一些额外的数据描述信息,将文件保存为CSV格式,然后使用前面介绍的熊猫来读取数据。

另外,之前介绍的机器学习框架sklearn(scikit-learn)内置了这个数据集,你可以通过调用专用的API函数导入数据,而不需要额外下载。详情请参考本文介绍。

我们现在的任务是找到这些指标(特征)和房价(目标)之间的关系。由于房价是连续变化的实数,显然这个任务属于回归分析。为了找到这些指标(特征)和房价(目标)之间的关系,我们需要建立模型。

2.建立一个模型

上表中提供了四个样本,每个样本包含13个特征值和一个标签。现在我们需要对这个房价预测问题做一个大概的描述,为建立模型做准备。

x代表样本;

y代表标签;

{x1,x2,x3...xn}代表数据集中的特征值;

{X(1),X(2),X(3)...X(n)}表示哪个样本

波士顿房价数据集的概括描述结果如下:

从数据集提供的信息来看,影响波士顿房价的因素(特征值)有13个(标签)。现在,我们希望建立一个模型,当我们输入这13个因素的量化值时,它可以帮助我们预测房价。该模型可以用数学公式表示为(n=13 ),

简化它,

Xi是我们数据集中样本的特征值,y是我们模型的预测结果,w和b是我们模型的参数。现在建立模型的问题是如何求解参数w和b。

3.损失函数(损失函数)

为了求解模型参数W和B,有必要引入损失函数的概念。根据第二章构建的线性模型,数据集中的每组x(n)个样本理论上对应一个预测值Yn,而{x1,x2,...,xn}是特征值,表示如下。

数据集中的每组样本理论上都有一个标签Y和一个预测值Y,参考下图。

一组样本对应于标签值和预测值。

我们期望建立的模型的预测值y和真实值y之差越小越好。差异越小,我们建立的模型就越准确。

第一个样本的实际值和预测值之间的差值

m个样本的总误差表示如下,

m个样本的全局求和表达式

直接加法有一个问题,可能是因为正负值的属性,误差可能会抵消,导致误差不准。要求平方和,参考表达式如下,

这样,整体预测值与实际值之间的差值可以用实际值与期望值之差的平方和来表示。这种差距叫做损失。用来表示预测值和真实值之间差异的函数称为损失函数。

简化损失函数的表达式,

损失函数表达式

代入y m(第m个样本的预测值)的计算公式中,

损失函数的表达式:

损失函数表达式

与损失函数相关的参数是w1,w2,...,wn和b .我们的目标是最小化损失函数值,采用的方法是梯度下降算法。

4.梯度下降算法。

在这一点上,问题现在变成了寻找min(L(w1,w2,...,wn,b))。求一个函数的最小值,我们一般用高阶数求导,求极值点然后代入函数求最小值。这种通用方法在特征值较小时一般不起作用,但在特征值较大时不适用。在这种情况下,就需要用另一种方法来求函数的最小值——梯度下降算法,这里就来介绍一下。

下列坐标轴,

女:

纵轴L(w):

我们的目标是找到函数的最小值L(W*)。要找到L(W*),我们需要先找到W*。那么梯度下降算法怎么求W*?

该方法如下,

1)首先随机初始化w0的一个点,求出这个点的导数值。从图中可以看出,这个点的结果值w0大于0,w0>w*。希望下次要找的w1能往左移,离w*近一点。还需要引入参数学习率。下一个点w1可以由下面的公式表示,

学习率为正,w0处的倒数也为正。找到的下一个点w1小于w0,并且接近期望值w*。

2)同理,求w1的下一个点w2,

3)重复操作,直到w*最小。

在该示例中,随机初始化的w0在最小值w*的右侧。其实w0在w*的左边,效果是一样的。当w0在左侧时,w0处的导数值为负。如果带入上式,学习率为正,下一个值w1增加。最终结果是向w*靠拢。

4.1.学习率(学习率)

正数,这个值决定了我们每次改变W的值时改变多少,

学习率的选择

如上图所示,需要设定一个合适的学习率。如果学习率设置过大,W的值会在最优解w*的左右两边波动,无法达到最优解W *;如果w*设置过小,会增加达到最优解w*的计算次数,导致执行效率低,收敛时间更长。

所以我们需要找到一个合适的学习速率,梯度下降算法可以达到更好的效果。

这里顺便补充一下超参数的概念。模型的参数叫做参数(比如这里的W和B),决定模型的参数叫做超参数,比如这里的学习率。

5.求损失函数的最小值。

回到第3节中损失函数的表达式,

w和x由矢量表示,

简化公式表示如下:

取w和b参数的偏导数,

然后用梯度下降算法寻找函数的最优解,

上图显示了一个更新过程,这个过程一直重复到最终的最优解w1*、w2*,...wn*,b*被获得。通过梯度下降算法,我们在模型中找到了这组参数,可以将其带入模型来预测新的样本。至此,线性回归的模型参数已经求解完毕,可以得到根据当前数据集拟合的整体误差最小的模型。

6.线性回归代码实现

为了演示上述过程,我们不使用框架和库文件,通过编码实现线性回归模型y = w1 * x+w2 * (x**2)+b的参数求解。展示了用梯度下降算法求解模型参数的实现过程。

1)设置数据

# # #设置数据

X = [12.3,14.3,14.5,14.8,16.1,16.8,16.5,15.3,17.0,17.8,18.7,20.2,22.3,19.3,15.5,16.7,17.2,18.3,19.2,17.3,19.5,19.7,21.2,23.04,23.8,24.6,25.2,25.7,25.9,26.3]y = [11.8,12.7,13.0,11.8,14.3,15.3,13.5,13.8,14.0,14.9,15.7,18.8,20.1,15.0,14.5,14.9,14.8,16.4,17.0,14.8,15.6,16.4,19.0,19.8,20.0,20.3,21.9,22.1,22.4,22.6]

2)显示数据

plt.scatter(X, y)plt.title(\'Dataset Samples\')plt.xlabel(\'X\')plt.ylabel(\'y\')plt.show()

数据显示见下图。

3)拆分数据集

X_train = X[0:20]y_train = y[0:20]n_train = len(X_train)X_test = X[20:]y_test = y[20:]n_test = len(X_test)

4)拟合模型

####Fit model: y = w1 * x + w2 * (x**2) + bepoches = 10000w1 = -0.1w2 = 0.1b = 0.3lr_w1 = 0.0lr_w2 = 0.0lr = 0.001for epoch in range(epoches):sum_w1 = 0.0sum_w2 = 0.0sum_b = 0.0for i in range(n_train):y_hat = w1 * X_train[i] + w2 * (X_train[i] ** 2) + bsum_w1 += (y_train[i] - y_hat) * (-X_train[i])sum_w2 += (y_train[i] - y_hat) * (-X_train[i] ** 2)sum_b += (y_train[i] - y_hat) * (-1)# Using Gradient Descent to update parameters(w, b)det_w1 = 2.0 * sum_w1det_w2 = 2.0 * sum_w2det_b = 2.0 * sum_blr_w1 = lr_w1 + det_w1 ** 2lr_w2 = lr_w2 + det_w1 ** 2w1 = w1 - (1 / math.sqrt(lr_w1) * det_w1)w2 = w2 - (1 / math.sqrt(lr_w2) * det_w2)b = b - lr * det_b

5)展示模型拟合的结果。

fig, ax = plt.subplots()ax.plot([i for i in range(10, 25)], [w1 * i + w2 * (i**2) + b for i in range(10, 25)])ax.scatter(X_train, y_train)plt.title(\'y = w1*x + w2*x^2 + b\')plt.legend((\'Model\', \'Data Points\'), loc=\'upper left\')plt.show()

模型的渲染,

6)解决损失。

total_loss_train = 0for i in range(n_train):y_hat = y_hat = w1 * X_train[i] + w2 * (X_train[i] ** 2) + btotal_loss_train += (y_hat - y_train[i]) ** 2print(\"训练集损失值:\"+str(total_loss_train))total_loss_test = 0for i in range(n_test):y_hat = y_hat = w1 * X_test[i] + w2 * (X_test[i] ** 2) + btotal_loss_test += (y_hat - y_test[i]) ** 2print(\"测试集损失值:\"+str(total_loss_train))

解决的损失见下图。

总结:

本文通过经典的线性回归案例——波士顿房价预测,介绍了机器学习中线性回归的原理。

1)建立表示数据集中特征值和标签值之间关系的模型,将线性回归问题转化为求参数wi和b的问题。

2)定义损失函数——预测值与真实值的差距。

3)介绍了机器学习中寻找函数最小值的算法——梯度下降算法。

4)利用梯度下降算法得到损失函数的最小值,确定参数wi和B,从而确定模型。

5)最后通过编码演示了梯度下降算法求解模型参数的实现过程。

以上就是由优质生活领域创作者 嘉文社百科网小编 整理编辑的,如果觉得有帮助欢迎收藏转发~