《两日算法系列》之第一篇:线性回归



写在前面的话

刚巧不巧,参加了DataWhale的四月学习计划,然后就有了这个系列

两天一个算法,是小组规定的时间计划,不幸的是,只有5个算法计划,而且还有两个算法已经出现在我的大话系列中,大话系列目前已经怼完了这些算法:决策树、贝叶斯、SVM、Adaboost。所以这个系列可能很快就结束了,回过头我们在继续大话系列,这个暂且当做一个学习笔记。

今天开始第一篇:线性回归


1.线性回归
1.1. 从方程说起

说起线性回归,你可能不太理解是什么东西,但我要是说一元一次方程你瞬间就知道是啥。

一元一次方程 y=ax+b中,指的是未知数的个数(即x),指的是未知数的最大幂数(即x的几次方)

那么回归也就是针对输入变量x和输出变量y之间的一个映射,线性回归的映射呈线性分布,相对的还有一个逻辑回归,下节再说它。

在线性回归中,如果只有一个自变量,我们称之为一元线性回归,如果有两个及以上的自变量,我们称之为多元线性回归,就好比区分一元方程和多元方程 一样。


1.2. 线性回归

根据方程我们可以直接写出线性回归的一般公式:
H ( θ 0 , θ 1 . . . θ n ) = θ 0 + θ 1 x 1 + . . . + θ n x n H(\theta_0,\theta_1...\theta_n)=\theta_0+\theta_1x_1+...+\theta_nx_n H(θ0,θ1...θn)=θ0+θ1x1+...+θnxn
这个公式可以直接写成向量的形式:
H ( θ ) = θ T X H(\theta)=\theta^T\mathbf{X} H(θ)=θTX
其中加粗的X表示向量,θ的转置用θ^T表示,先记住上面这个公式,我们这会还用不到


1.3. 一元线性回归

通过上面的公式,我们可以直接写出一元线性回归的一般公式:
H ( θ 0 , θ 1 ) = θ 0 + θ 1 x 1 H(\theta_0,\theta_1)=\theta_0+\theta_1x_1 H(θ0,θ1)=θ0+θ1x1
也就相当于一元一次方程y=ax+b。在一元一次方程中,求解关键是计算出a和b的值,同理在一元线性回归中我们也需要求解出θ的值(这里包括θ0和θ1)

ok,相关的概念你都明白了,来看张图:

文章首发:公众号『知秋小一』

现在有许多蓝色的数据点(每个点对应x,y),这个时候的线性回归方程如何求解?

我们知道,一元线性回归其实就是找到一条直线,但是这个图中我们可以找到的不止一条直线,那么对应的问题来了,如何找到最优的一条直线?

先假设我们已经找到了这条直线,那么在上面图中,针对横坐标x,纵坐标y的每个点(xi,yi)最终形成了这样一条直线 :

文章首发:公众号『知秋小一』

每个点都会与最终的直线存在些许距离(误差),同时这个距离是最小的距离,所以这个直线就是最优的直线

如何计算距离呢?

每个点和直线的距离应该这样计算:
d = ∣ y i − ( a x i + b ) ∣ d = |y_i-(ax_i+b)| d=yi(axi+b)
为了简单方便我们可以直接将绝对值转化为平方,这个时候整体数据的误差:
L o s s = 1 N ∑ i = 1 N ( y i − ( a x i + b ) ) 2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-(ax_i+b))^2 Loss=N1i=1N(yi(axi+b))2
ok,这就是一元线性回归的误差方程,我们的目的就是求得a和b,使得Loss最小。

怎么求解这个a和b,我们等会再说,先来看看多元线性回归

1.4. 多元线性回归

前面我们已经写出了线性回归的表达式:
H ( θ ) = θ T X H(\theta)=\theta^T\mathbf{X} H(θ)=θTX
假如现在是一个三元线性回归,相应的:
X = [ x 11 x 12 x 13 x 21 x 22 x 23 x 31 x 32 x 33 ] ,    y = [ y 1 y 2 x 3 ] X = \begin {bmatrix}x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23}\\ x_{31} & x_{32} & x_{33}\\ \end{bmatrix}, \,\, y=\begin {bmatrix}y_1\\y_2\\x_3\\ \end{bmatrix} X=x11x21x31x12x22x32x13x23x33,y=y1y2x3
同时,回归系数θ:
θ = [ θ 1 θ 2 θ 3 ] \theta=\begin {bmatrix}\theta_1\\\theta_2\\\theta_3\\ \end{bmatrix} θ=θ1θ2θ3
对于给定的数据x1,也就是就成真的第一列数据,预测结果u1:
u 1 = [ x 11 x 21 x 31 ] T ∗ [ θ 1 θ 2 θ 3 ] u_1 = \begin {bmatrix}x_{11} \\ x_{21}\\ x_{31}\\ \end{bmatrix}^T * \begin {bmatrix}\theta_1\\\theta_2\\\theta_3\\ \end{bmatrix} u1=x11x21x31Tθ1θ2θ3
所以,我们多元线性回归的误差也可以写成:
L o s s = 1 N ∑ i = 1 N ( y i − x i T θ ) 2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2 Loss=N1i=1N(yixiTθ)2


2. 线性回归学习策略

在线性回归的模型建立过程中,有一些学习策略需要学习,但是这个学习策略不光是线性回归独有的,在其他回归模型上同样适用。

提前说两个名词,大家了解一下

经验风险:通过历史数据(训练集)得知模型对单个样本点的预测,并计算关于训练集的平均损失称作经验风险

结构风险:当经验风险越小的时候,也就是模型对训练数据完美拟合的时候(过拟合),我们需要增加一些惩罚机制避免过拟合现象,即经验风险+正则惩罚,这个时候称为结构风险

ok,可能你看的云里雾里,来一张图醒醒神

文章首发:公众号『知秋小一』

上面三个图的函数依次为 f 1 ( x ) , f 2 ( x ) , f 3 ( x ) f_1(x),f_2(x),f_3(x) f1(x),f2(x),f3(x),真实Price记为 Y Y Y

给定一个 x x x,三个函数都会输出一个 f ( x ) f(x) f(x),但是输出的结果不一定就与真实值相等,于是我们就需要一个函数去度量拟合的好坏,比如:
L ( Y , f ( x ) ) = ( Y − f ( x ) ) 2 L(Y,f(x)) = (Y-f(x))^2 L(Y,f(x))=(Yf(x))2
这个函数称为损失函数,当损失函数越小,代表模型拟合的越好。

同时,根据上面的经验风险的概念,此时的经验风险为:
1 N ∑ i = 1 N ( L ( y i , f ( x i ) ) ) \frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) N1i=1N(L(yi,f(xi)))
经验风险是针对整个模型数据集的,所以此时我们的目标就变成了如果使得经验风险最小化。

问题来了,上面图三经验风险最小,但是我们却不会用它

因为它的模型结构太复杂,产生了过拟合,我们需要增加一个函数来度量模型的复杂度——正则化

根据上面的概念,此时结构风险=经验风险+正则惩罚,即:
1 N ∑ i = 1 N ( L ( y i , f ( x i ) ) ) + λ J ( θ ) \frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta) N1i=1N(L(yi,f(xi)))+λJ(θ)
经验风险和结构风险都是针对整个数据集的,此时我们的目标变成了结构风险最小化+结构风险最小化,对应目标函数:
m i n 1 N ∑ i = 1 N ( L ( y i , f ( x i ) ) ) + λ J ( θ ) min\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta) minN1i=1N(L(yi,f(xi)))+λJ(θ)

完事,总结一下

2.1 损失函数

损失函数:度量单样本预测的错误程度。损失函数越小,模型越好

常用的损失函数包括:绝对损失函数、平方损失函数、对数损失函数等

2.2. 代价函数

代价函数:度量全部样本集的平局误差。

常见的代价函数包括:均方误差、平均绝对误差、均方根误差等

2.3. 目标函数

目标函数:代价函数+正则化函数,有时候只有前半部分

模型最终的目标一定是:不仅要经验风险最小化,还要结构风险最小化


3. 算法求解

我们已经知道最终的优化目标:目标函数最小化。

通过求解目标函数计算出相应的参数值,从而最终得到我们的最优模型。

现在我们的目标函数是:
m i n 1 N ∑ i = 1 N ( L ( y i , f ( x i ) ) ) + λ J ( θ ) min\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta) minN1i=1N(L(yi,f(xi)))+λJ(θ)
抛开后面的正则化先不说,我们需要计算前半部分,先将前半部分写成我们能看懂的形式:
L o s s = 1 N ∑ i = 1 N ( y i − x i T θ ) 2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2 Loss=N1i=1N(yixiTθ)2
这不就是求解一个方程的极小值问题嘛,ok,来搞

3.1 最小二乘法

最小二乘法又叫最小平方法,主要思想就是选择未知参数,使得理论值与观测值之差的平方和达到最小

就像在上面定义的损失函数一样,就是通过最小二乘思想使得误差最小。

问题来了,如何求解最小误差对应的未知参数?

从单变量和多变量分别来说一下吧:

先来看单变量的最小二乘法求解

单变量下,我们的假设函数是y=ax+b,此时对应的损失函数为:
L o s s = 1 N ∑ i = 1 N ( y i − ( a x i + b ) ) 2 ) Loss = \frac{1}{N}\sum_{i=1}^N(y_i-(ax_i+b))^2) Loss=N1i=1N(yi(axi+b))2)
我们的目标是通过找出合适的a、b使得Loss 最小(常数N可以先不考虑),这个时候可以直接用求极值的方法。

将Loss函数对a、b分别求偏导,并使得偏导结果为0,解出此时a、b的值,即为我们的参数目标值:
{ ∂ L ∂ a = 2 ∑ i = 1 N ( y i − ( a x i + b ) ) ( − x i ) ∂ L ∂ b = 2 ∑ i = 1 N ( y i − ( a x i + b ) ) ( − 1 ) ∂ L ∂ a = ∂ L ∂ b = 0 \begin{cases}\frac{\partial L}{\partial a}= 2 \sum_{i=1}^N(y_i-(ax_i+b))(-x_i) \\\frac{\partial L}{\partial b}= 2 \sum_{i=1}^N(y_i-(ax_i+b))(-1) \\\frac{\partial L}{\partial a} = \frac{\partial L}{\partial b} = 0\end{cases} aL=2i=1N(yi(axi+b))(xi)bL=2i=1N(yi(axi+b))(1)aL=bL=0
通过上面的方程组我们可以解得a、b的值,带入到原方程中即可求解

再来看多变量的最小二乘法求解

此时我们的损失函数变成了:
L o s s = 1 N ∑ i = 1 N ( y i − x i T θ ) 2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2 Loss=N1i=1N(yixiTθ)2
这个可以写成矩阵的形式:
L o s s = 1 N ( Y − X θ ) T ( Y − X θ ) Loss = \frac{1}{N}(Y-X\theta)^T(Y-X\theta) Loss=N1(YXθ)T(YXθ)
同样的我们求参数θ(此时的θ是个向量,常数N暂不考虑)求偏导,并使得偏导结果为0
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split} \…
在这里插入图片描述
这样我们也通过矩阵运算求解出θ的值,对应的损失函数也就确定了。


3.2. 梯度下降法

梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值。也就是函数在该点处沿着该方向变化最快。

从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向。那么,如果想计算一个函数的最小值,就可以使用梯度下降法的思想来做。

应用在我们的目标函数中,我们需要算出每个点下降最快的方向,然后使其在该方向上下降到下一个点,然后更新下降最快的方向,重复步骤直到下降到底

考虑一个问题,某一点的梯度怎么算?

对该点进行求偏导,算出该点的梯度的值。

同样的,我们从单变量和多变量分别来说一下吧:

先来看单变量的梯度下降法求解

在最下二乘法中,我们通过求偏导计算出a、b取偏导的结果 ∂ L ∂ a ,   ∂ L ∂ b \frac{\partial L}{\partial a} , \ \frac{\partial L}{\partial b} aL, bL

在梯度下降法中,我们需要计算在某一点对a、b的偏导,也就是 ∂ L ∂ a i ,   ∂ L ∂ b i \frac{\partial L}{\partial a_i} , \ \frac{\partial L}{\partial b_i} aiL, biL,同样的在该点会存在一个参数 α,它表示在梯度方向前进的步长,综合一下,在某一点参数a、b的更新为
{ a i = a i − α ∂ L ∂ a i b i = b i − α ∂ L ∂ b i \begin{cases}a_i = a_i-\alpha \frac{\partial L}{\partial a_i}\\b_i = b_i-\alpha \frac{\partial L}{\partial b_i}\\\end{cases} {ai=aiαaiLbi=biαbiL
所以梯度下降的更新可以表示成这样一个表达式:
θ i = θ i − α ∂ L ( θ ) ∂ θ i \theta_i = \theta_i-\alpha \frac{\partial L(\theta)}{\partial \theta_i} θi=θiαθiL(θ)
至于每一个点对a、b求偏导,在最小二乘法里面已经计算过了,不妨回过头去看一眼。

另外:往深的想一下,梯度下降法认为每一步的最优解合并起来就是最终的最优解,这样会导致最终结果可能并不是全局最优解

再来看多变量的梯度下降法求解

由于在多变量中我们的目标函数发生了变化,相应的对于梯度下降的更新也会发生变化
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split}&L…

在这里插入图片描述
忽略掉常数,我们可以得到:
θ = θ − α ⋅ ( y i − x i T θ ) ⋅ x i \theta = \theta-\alpha ·(y_i-x_i^T\theta)· x_i θ=θα(yixiTθ)xi
ok,求解出未知参数的值,我们的目标函数也就确定了

3.3. 正则项

上面我们留了一个问题:正则项

正则项的目的是通过对最小二乘估计加入惩罚约束,使某些系数的估计非常小或为0,可以有效的解决函数的过拟合问题

在线性回归中,一般有这两种正则化:

  • L1正则化(Lasso回归):稀疏化模型参数
  • L2正则化(Rideg/岭回归):缩小模型参数

(好像又挖了个坑,后面再填吧,这个了解一下就行了)


4. 线性回归的评估指标

通过前面的内容,我们成功的对数据进行了预测,那到底预测的准不准?有多准?就需要用到这些评估指标了

在线性回归中常用的的评估指标有四种,分别是:

  • 均方误差MSE(Mean Squared Error)
  • 均方根误差RMSE(Root Mean Squared Error)
  • 平均绝对值误差MAE(Mean Absolute Error)
  • R Squared

四种评估指标中最常用的第四种,每种的计算方式分别如下:

4.1. 均方误差MSE

1 m ∑ i = 1 m ( y i − y ^ i ) 2 \frac{1}{m}\sum_{i=1}^m(y^{i}-\hat y^{i})^2 m1i=1m(yiy^i)2

MSE的值越小,说明预测模型的精确度越高

4.2. 均方根误差RMSE

1 m ∑ i = 1 m ( y i − y ^ i ) 2 \sqrt{\frac{1}{m}\sum_{i=1}^m(y^{i}-\hat y^{i})^2} m1i=1m(yiy^i)2

相当于对MSE开根号,同越小越好

4.3. 平均绝对值误差MAE

1 m ∑ i = 1 m ∣ y i − y ^ i ∣ \frac{1}{m}\sum_{i=1}^m|y^{i}-\hat y^{i}| m1i=1myiy^i

效果同上

4.4. R Squared误差

R 2 = 1 − ∑ i = 1 m ( y i − y ^ i ) 2 ∑ i = 1 m ( y ‾ − y ^ i ) 2 R^2 = 1- \frac{\sum_{i=1}^m(y^{i}-\hat y^{i})^2}{\sum_{i=1}^m(\overline y-\hat y^{i})^2} R2=1i=1m(yy^i)2i=1m(yiy^i)2

不同的是,这个的R^2越大越好,最大值为1,表示模型准确率最高;当<0是,说明数据可能不存在线性关系,需要注意

在sklearnz中最常用的方法是R Squared方法。


4.5. 代码实现
def mean_squared_error(y_true, y_predict):
    """计算y_true和y_predict之间的MSE"""
    assert len(y_true) == len(y_predict), "the size of y_true must be equal to the size of y_predict"
 
    return np.sum((y_true - y_predict)**2) / len(y_true)
 
 
def root_mean_squared_error(y_true, y_predict):
    """计算y_true和y_predict之间的RMSE"""
 
    return sqrt(mean_squared_error(y_true, y_predict))
 
 
def mean_absolute_error(y_true, y_predict):
    """计算y_true和y_predict之间的RMSE"""
    assert len(y_true) == len(y_predict), "the size of y_true must be equal to the size of y_predict"
 
    return np.sum(np.absolute(y_true - y_predict)) / len(y_true)
 
 
def r2_score(y_true, y_predict):
    """计算y_true和y_predict之间的R Square"""
 
    return 1 - mean_squared_error(y_true, y_predict)/np.var(y_true)

5. 实战项目

下节更新


写在后面的话

稍稍总结一下,回归模型的目的是预测数值型的目标值,像诸如房价预测,年龄预测等等都可以通过回归模型去解决。

当然了你要说分类模型可以解决吗?也可以的。不过各有所长,各有所短,医生诊断病情都得对症下药,我们解决问题也是要同样的道理的


本想着把线性回归涉及到的内容都统统列出来,毕竟是回归模型的开篇,后面学习其他高级的模型也会简单很多。

无奈坑实在太多(文中好多内容一笔带过),而且恰好是周内工作日,时间有点仓促,就只能放在下一篇了。

后面还有逻辑回归,也想着趁机理一理,写一写,等做完线性回归的项目就开搞


我是小一,第一步的一,下节见!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 线性回归是一种常用的数据挖掘算法,它可以用来预测连续型变量的值。在房价预测中,我们可以使用线性回归来预测房价。线性回归的原理是通过建立一个线性方程来描述自变量和因变量之间的关系,然后利用已知的自变量和因变量的数据来拟合这个方程,从而得到一个预测模型。在房价预测中,我们可以将房屋的面积、房间数量、地理位置等作为自变量,将房价作为因变量,然后利用已知的房屋数据来拟合一个线性方程,从而得到一个预测模型,用来预测未知房屋的价格。实践中,我们可以使用Python等编程语言来实现线性回归算法,利用已知的数据来训练模型,然后使用模型来预测未知数据的结果。 ### 回答2: 线性回归是一种用于预测连续变量的监督学习算法。在房价预测中,线性回归可以通过利用历史数据和相关因素,如房屋面积、位置和装修状况等,预测房屋的售价。 线性回归的原理是拟合一条直线来近似预测目标变量和输入因素之间的关系。这条直线被称为回归线。回归线的斜率和截距分别表示输入因素和目标变量之间的关系和预测模型的截距。 在实践中,我们需要将数据集分成训练集和测试集。从训练集中选取一个子集,用来训练模型。一旦模型被训练完成,我们可以使用测试集来评估其准确性和泛化能力。 线性回归的评估指标包括平均平方误差(Mean Squared Error,MSE)和均方根误差(Root Mean Squared Error,RMSE)。MSE 衡量模型预测与实际数据之间差异的平方和的平均值。RMSE 是 MSE 的平方根。 在实践中,我们需要注意一些问题。例如,数据集的特征选择,是否需要进行数据缩放,异常值或离群值的处理,以及是否需要进行特征工程或增加多项式特征。此外,在模型的选择上,我们可以使用不同的正则化方法,如岭回归和 Lasso。这些方法可以避免过拟合和提高模型的泛化能力。 总之,线性回归是一种简单但有效的预测房价的模型。但是,在实际应用中,我们需要结合领域知识和业务需求来调整和优化模型,以提高其性能和可靠性。 ### 回答3: 线性回归数据挖掘中常用的一种算法,通过对已有的数据进行分析和学习,建立一个线性模型,以此来预测新的未知数据。 在房价预测中,线性回归可以用来预测房价与其它因素的关系,如房屋面积、房龄、地段、物业等。通过建立一个线性方程,可以将这些因素与房价之间的关系用数学形式表示出来,对于未知的房屋可以通过该方程来预测其价格。 线性回归的原理是基于一组数据集,其中包含了预测变量和响应变量的数据。通过这些数据建立了一个回归方程,以预测响应变量的值。回归方程是一条直线,它用输入变量的值来预测输出变量的值。线性回归中的许多算法使用误差平方和来评估回归模型的好坏。误差平方和是指所有观测值与预测值之间差的平方和。 线性回归算法的实践需要经历以下步骤: 1. 数据收集:收集房屋的各种信息,包括房屋价格、面积、年龄、地理位置、物业等。 2. 数据处理:清洗数据,排除不合理或者有误的数据,并将数据进行统一的格式化处理。 3. 特征工程:在收集的数据中,选取与房价相关的因素,将其进行特征选择,处理成线性回归算法所能接受的数据格式。 4. 模型拟合:在处理好的数据集上,利用线性回归算法进行模型拟合,得到回归方程。 5. 模型评估:通过误差平方和等指标对模型进行评估,判断其预测效果的好坏。 6. 应用预测:使用建立好的模型,输入新的数据特征,进行房价预测。 线性回归算法的优点是模型简单,易于理解和应用,适合于处理数量较少的数据,同时还可以提供较为准确的预测结果。但是线性回归也有其局限性,例如不能处理非线性数据,对异常值敏感等。因此,在实际应用中需要针对不同的数据模型选择合适的算法进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值