问题一: 机器学习的基本流程( 二 )


y ^ = X w \hat{y}=X w y^?=Xw
线性回归的任务, 就是构造一个预测函数来映射输入的特征矩阵和标签值的线性关系, 这个预测函数在不同的教材上写法不同, 可能写作f ( x ) , y w ( x ) f(x), y_{w}(x) f(x),yw?(x), 或者h ( x ) h(x) h(x) 等等形式, 但无论如何, 这个预测函数的本质就是我们需要构建的模型 。
对于线性回归而言, 预测函数y ^ = X w \hat{y}=X w y^?=Xw 就是我们的模型, 在机器学习我们也称作 “决策数” 。其中只有w w w 是末知的, 所以线性回归原理的核心就是找出模型的参数向量w w w。但我们怎样才能栘求解出参数向量呢? 我们需要依赖一个重要概念: 损失函数 。
在之前的算法学习中,我们提到过两种模型表现:在训练集上的表现,和在测试集上的表现 。我们建模,是追求模型在测试集上的表现最优,因此模型的评估指标往往是?来衡量模型在测试集上的表现的 。然而,线性回归有着基于训练数据求解参数的需求,并且希望训练出来的模型能够尽可能地拟合训练数据,即模型在训练集上的预测准确率越靠近100%越好 。
因此,我们使用损失函数这个评估指标,来衡量系数为w w w 的模型拟合训练集时产生的信息损失的大小,并以此衡量参数w w w 的优劣 。如果用一组参数建模后,模型在训练集上表现良好,那我们就说模型拟合过程中的损失很小,损失函数的值很小,这一组参数就优秀;相反,如果模型在训练集上表现糟糕,损失函数就会很大,模型就训练不足,效果较差,这一组参数也就比较差 。即是说,我们在求解参数w w w 时,追求损失函数最小,让模型在训练数据上的拟合效果最优,即预测准确率尽量靠近100% 。
(注意:对于非参数模型没有损失函数,比如KNN、决策树)
对于有监督学习算法而言,建模都是依据有标签的数据集,回归类问题则是对客观事物的?个定量判别 。这里以 $ y_i$ 作为第i i i 行数据的标签,且y i y_i yi? 为连续变量,x i x_i xi? 为第i i i 行特征值所组成的向量,则线性回归建模优化方向就是希望模型判别的y ^ i \hat y_i y^?i? 尽可能地接近实际的y i y_i yi?。而对于连续型变量而言,邻近度度量方法可采用S S E SSE SSE 来进行计算,S S E SSE SSE 称作「残差平方和」,也称作「误差平方和」或者「离差平方和」 。
因此我们的优化目标可用下述方程来进行表示:
min ? w ∑ i = 1 m ( y i ? y ^ i ) 2 = min ? w ∑ i = 1 m ( y i ? X i w ) 2 \min _{w} \sum_{i=1}^{m}\left(y_{i}-\hat{y}_{i}\right)^{2}=\min _{w} \sum_{i=1}^{m}\left(y_{i}-X_{i} w\right)^{2} wmin?i=1∑m?(yi??y^?i?)2=wmin?i=1∑m?(yi??Xi?w)2
【问题一: 机器学习的基本流程】来看一个简单的小例子 。假设现在w w w 为[ 1 , 2 ] [1,2] [1,2] 这样一个向量, 求解出的模型为y = x 1 + 2 x 2 y=x_{1}+2 x_{2} y=x1?+2x2?。
样本特征 1特征 2真实标签
0
1
0.5
3
1
-1
0.5
2
则我们的损失函数的值就是:
( 3 ? ( 1 ? 1 + 2 ? 0.5 ) ) 2 + ( 2 ? ( 1 ? ( ? 1 ) + 2 ? 0.5 ) ) 2 ( y 1 ? y ^ 1 ) 2 + ( y 2 ? y ^ 2 ) 2 \begin{} (3-(1 * 1+2 * 0.5))^{2}+(2-(1 *(-1)+2 * 0.5))^{2} \\ \left(y_{1}-\hat{y}_{1}\right)^{2}+\left(y_{2}-\hat{y}_{2}\right)^{2} \end{} (3?(1?1+2?0.5))2+(2?(1?(?1)+2?0.5))2(y1??y^?1?)2+(y2??y^?2?)2?
现在问题转换成了求解S S E SSE SSE 最小化的参数向量w w w ,这种通过最小化真实值和预测值之间的S S E SSE SSE 来求解参数的方法叫做最小二乘法 。
下面我们来用代码尝试一下 。
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt#生成横坐标范围 0 -10np.random.seed(420)x = np.random.rand(50) * 10 #50个点x# y = 2x - 5#添加扰动项np.random.seed(420)y = 2 * x - 5 + np.random.randn(50) #正太分布下的随机数plt.plot(x,y,'o')