Xyang的AI学习之旅:浅谈【机器学习】- 线性回归01

从线性回归开始

1. 何为线性回归?

  1. 首先,线性回归是【机器学习】中有监督机器学习的一种算法。
  2. 在【机器学习】的有监督机器学习中,我们通常需要拿到一些【样本】,通过发掘这些样本的数个【特征】与样本表达的【结果】的关系,得到一个通过这类样本的特征推算出结果的模型。然后之后就可以用这个模型结合别的同类型样本的特征预测该样本可能会产生的结果(即使这个结果是我们不知道或者还尚未发生)。
  3. 学习关系和预测未知,正是当代人工智能(Artificial Intelligence)所做的事情。而机器学习便是人工智能的一部分。
  4. 而回归问题主要是关注唯一的目标变量(需要预测的值:y)和一个或多个自变量(影响因变量的因素:x)之间的关系,而这个关系就是我们要求解的“模型”。
  5. 简单的线性回归公式为: y = a x + b y=ax+b y=ax+b在这个公式中,y是目标变量,即未来要预测的值,x是影响目标变量y因素,而ab则是我们要求解的模型参数
  6. 在现实生活中,往往结果“y”的因素不止一个,这时“x”就会从一个变成N个,这就由简单线性回归变成了多元线性回归,而它的公式也变成了: y = a 1 x 1 + a 2 x 2 + a 3 x 3 + . . . + a n x n + b y = a_1x_1+a_2x_2+a_3x_3+...+a_nx_n+b y=a1x1+a2x2+a3x3+...+anxn+b
  7. 可以发现,从x到y的计算,x只是一次方,其实就是一元一次方程和多元一次方程,所以这就是这算法叫“线性回归的原因。
  8. 通常,在机器学习中,我们把真实值(样本的真实结果)写做y,把预测值(通过算法推算出来的结果)写作y_pred,把自变量(影响结果的因素),即样本的特征值写作x,把与x相乘的a理解为特征的重要程度,也叫权重,英文:weights,所以通常用w代替a,表达权重值。而b称为截距(bias),至于为什么要加这个b,是因为在算法的推导上,加了这个b可以让概率密度函数的均值等于0,这个在之后的推导上会讲到。所以,我们的公式就变为了: y _ p r e d = w 1 x 1 + w 2 x 2 + . . . + w n x n + b y\_pred=w_1x_1+w_2x_2+...+w_nx_n+b y_pred=w1x1+w2x2+...+wnxn+b
  9. 而我们要得到一个模型,让这个模型可以去预测其他该类样本的结果,那么我们就需要学习很多的已知结果的样本的特征与结果的关系,从理论上来讲,我们学习的样本要足够多,那么最后的模型才能预测得更加准确。样本,也就是模型的【经验】!举个例子,就好像你在学习的时候,需要去做很多练习题,只有做得多了,见到的题多了,到考试的时候才会考得好不是吗?而让模型学习经验的过程通常称之为训练模型
  10. 为了方便计算,我们引入线性代数的概念。由于一个样本有多个特征值,我们将一个样本的多个特征值排成一行,那么多个样本就有很多行的特征值,这样就构成了一个多行多列的矩阵,所以有m个样本这个矩阵就有m行,每个样本有n个特征那么就有n列 ,我们把这个m行n列的特征值矩阵记作大写的X。然后在多元线性回归中,每一个不同样本对应的w都是相同的(我们要求的模型就是去拟合这些样本的真实结果,让预测出来的结果尽可能与原始样本得到的结果相似,即预测的结果和原始的样本的真实结果在同一个分布上),所以w是一行n列的,截距项b只有一个,可以记作w0,与其他的w参数一并写成W。然后在原始有结果的样本中,我们通过W参数和X特征值预测出来的结果y_pred真实的结果y有一个差距,这个差距我们称为误差,记作ε。即样本的真实值y等于W参数与X样本矩阵相乘得到的预测值y_pred加上误差值ε。所以我们就有了新的公式: y = X W + ε 或 者 y = W T X + ε ( 矩 阵 相 乘 交 换 位 置 需 要 转 置 ) y=XW+ε或者y=W^TX+ε(矩阵相乘交换位置需要转置) y=XW+εy=WTX+ε()
  11. 最后,我们的模型是为了求到一个最优解,那么就需要使得整体误差最小整体的误差通常叫做损失Loss,在整个机器学习领域中,几乎所有的目标都是想法设法的为了让这个Loss达到最小
  12. (ps:这样写实在太累太花时间了T-T,而且全是字容易审美疲劳,所有我打算之后尽量以公式和代码加上一些简洁必要的说明来表达\>_

2. 线性回归算法的推导

  1. 目标:如何求得最优解?=>最小化损失Loss=>求得Loss的损失函数=?
  2. 根据中心极限定理 => 假设误差是符合均值为0,方差为定值的正太分布!!认为样本误差的出现是随机的,独立的。
  3. 损失函数的目标:loss最小 => 误差最小 => 让误差的分布尽可能都在0的位置 => 正太分布的概率密度函数 + 最大似然估计
  4. 正太分布的概率密度函数公式: f ( x ∣ μ , σ 2 ) = 1 2 π σ 2 e − ( x − μ ) 2 2 σ 2 f(x|μ,σ^2)=\frac{1}{\sqrt{2πσ^2}}e^-\frac{(x-μ)^2}{2σ^2} f(xμ,σ2)=2πσ2 1e2σ2(xμ)2
  5. 将单个误差ε带入公式求的x,再通过截距项来本质上平移整体分布的位置,使得均值μ=0,那么公式就变为了: f ( ε i ∣ μ , σ 2 ) = 1 2 π σ 2 e − ε i 2 2 σ 2 f(ε_i|μ,σ^2)=\frac{1}{\sqrt{2πσ^2}}e^-\frac{ε_i^2}{2σ^2} f(εiμ,σ2)=2πσ2 1e2σ2εi2
  6. 上式通过最大似然估计表达了单个误差的为0的最大可能的概率,那么最大概率的总似然就为: L θ ( ε 1 , . . . , ε m ) = f ( ε 1 , . . . , ε m ∣ μ , σ 2 ) = f ( ε 1 ∣ μ , σ 2 ) ∗ . . . ∗ f ( ε m ∣ μ , σ 2 ) L_θ(ε_1,...,ε_m)=f(ε_1,...,ε_m|μ,σ^2)=f(ε_1|μ,σ^2)*...*f(ε_m|μ,σ^2) Lθ(ε1,...,εm)=f(ε1,...,εmμσ2)=f(ε1μ,σ2)...f(εmμ,σ2)
  7. 又因为这里讲的是线性回归算法,所以误差函数可以写成如下: ε i = ∣ y i − y _ p r e d ∣ = ∣ y i − W T x i ∣ = ∣ y i − θ T x i ∣ ε_i=|y_i-y\_pred|=|y_i-W^Tx_i|=|y_i-θ^Tx_i| εi=yiy_pred=yiWTxi=yiθTxi
  8. 再讲已知样本的数据X和y带入公式,就得到了如下最大似然估计函数的公式: L θ ( ε 1 , . . . , ε m ) = ∏ i = 1 m 1 2 π σ 2 e − ( y i − θ T x i ) 2 2 σ 2 L_θ(ε_1,...,ε_m)=\prod_{i=1}^{m}\frac{1}{\sqrt{2πσ^2}}e^-\frac{(y_i-θ^Tx_i)^2}{2σ^2} Lθ(ε1,...,εm)=i=1m2πσ2 1e2σ2(yiθTxi)2
  9. 为了求得最优解,我们把总似然最大的那一时刻的参数θ(这里的θ表示前面讲的所有W参数的集合,也就是模型的参数)当成是最优解。接着引入对数函数有单调性的特性,将最大化似然函数转化为最大化对数似然函数,公式如下: a r g max ⁡ θ L θ ( ε 1 , . . . , ε m ) = a r g max ⁡ θ l o g e ( ∏ i = 1 m 1 2 π σ 2 e − ( y i − θ T x i ) 2 2 σ 2 ) arg\max_{θ}L_θ(ε_1,...,ε_m)=arg\max_{θ}log_e(\prod_{i=1}^{m}\frac{1}{\sqrt{2πσ^2}}e^-\frac{(y_i-θ^Tx_i)^2}{2σ^2}) argθmaxLθ(ε1,...,εm)=argθmaxloge(i=1m2πσ2 1e2σ2(yiθTxi)2)
  10. 引入对数函数的意义是可以把连乘变成连加,然后继续往后推导。。。 > > 此 时 迪 亚 波 罗 发 动 了 替 身 能 力 , 消 除 了 推 导 过 程 的 时 间 , 直 接 得 到 了 推 导 的 结 果 : >>此时迪亚波罗发动了替身能力,消除了推导过程的时间,直接得到了推导的结果: >> J ( θ ) = 1 2 ∑ i = 1 m ( x i θ − y i ) 2 ) J(θ)=\frac{1}{2}\sum_{i=1}^{m}(x_iθ-y_i)^2) J(θ)=21i=1m(xiθyi)2
  11. 补充说明:实际上,上式得到的J(θ)就是MSE损失函数,即对所有样本的误差【Error】(就是xi*θ-yi)的平方【Square】加和求均值【Mean】。mean squared error, 也叫最小二乘
  12. 为了求出θ什么时候可以使这个损失函数最小,我们需要对损失函数的公式求导,然后往下推导出θ的解析解形式 。 。 。 迪 亚 波 罗 再 次 发 动 了 替 身 能 力 , 快 进 到 了 得 到 结 果 的 时 间 : 。。。迪亚波罗再次发动了替身能力,快进到了得到结果的时间: θ = ( X T X ) − 1 X T y θ=(X_TX)^{-1}X^Ty θ=XTX1XTy
  13. 这个解析解相当于方程的求根公式,是方程的精确解,能在任意精度下满足方程式。这样,当我们有数据样本X,y时,我们就可以代入上面的解析解公式,直接求出θ的值了。
  14. 接下来让我们用一段python代码简单演示一下解析解求解的过程。
# 代码简单演示解析解求解模型
# 需要导入numpy是去做数值计算
import numpy as np

# 设置随机种子,方便复现代码结果
np.random.seed(42)
# 线性回归,随机生成X,y
X1 = 2*np.random.rand(100, 1)
X2 = 3*np.random.rand(100, 1)
# 这里要模拟出来的数据y是代表真实的数据,所以也就是y_pred+error
y = 5 + 4*X1 + 3*X2 + np.random.randn(100, 1)
# 为了去求解W0截距项,我们给X矩阵一开始加上一列全为1的X0
X_b = np.c_[np.ones((100, 1)), X1, X2]
print(X_b)
# 实现解析解的公式来求解θ
θ = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(θ)

# 使用模型去做预测
X_new = np.array([[0, 0],
                  [2, 3]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
print(X_new_b)
y_predict = X_new_b.dot(θ)
print(y_predict)

# 我们也可以导入matplotlib 画图以观察数据的分布
import matplotlib.pyplot as plt
%matplotlib inline
# 绘图进行展示真实的数据点和我们预测用的模型
plt.plot(X_new[:, 0], y_predict, 'r-')
plt.plot(X1, y, 'b.')
plt.axis([0, 2, 0, 25])
plt.show()

3. 最优化问题的求解算法

1. 梯度下降

  1. Q: what? A: 梯度下降是一种经典常用的优化算法,主要是指导计算机在迭代过程中如何去调整θ,公式是: W j t + 1 = W j t − η ∗ g r a d i e n t j W_j^{t+1}=W_j^t-η*gradient_j Wjt+1=Wjtηgradientj其中gradient就是梯度,即损失函数的导函数,这需要分别对损失函数MSE中的每一个变量求导,即偏导,跳过推导过程后,我们就得到了如下公式: δ δ θ j = ( h θ ( x ) − y ) x j \frac{δ}{δθ_j}=(h_θ(x)-y)x_j δθjδ=(hθ(x)y)xj总结就是: θ j t + 1 = θ j t − η ∗ g j = θ j t − η ∗ ( h θ ( x ) − y ) x j θ_j^{t+1}=θ_j^t-η*g_j=θ_j^t-η*(h_θ(x)-y)x_j θjt+1=θjtηgj=θjtη(hθ(x)y)xj
  2. Q: why? A: 当机器学习中的损失函数是非凸函数时,或者说数据的特征维度较多时,解析解公式直接求解的方式就不再适用了,这时我们需要以迭代的方式一点一点的区逼近最优解,而使用梯度下降优化算法的目的就是期望以最快的速度把模型的参数θ求解出来。
  3. Q: how? A: 分为4个步骤:
    1. 随机θ参数,随机一组数值W0…Wn
    2. 求梯度,为什么是梯度?因为梯度代表曲线某点上的切线的斜率,沿着切线往下下
      降就相当于沿着坡度最陡峭的方向下降
    3. if g<0, theta 变大,if g>0, theta 变小
    4. 判断是否收敛convergence,如果收敛跳出迭代,如果没有达到收敛,回第2 步继

2. 归一化

  1. Q: what? A: 归一化的目的是将数据的各个维度特征的数量级统一,来做到无量纲化。最大值最小值归一化可以把数值归一到0-1之间,公式是: x i , j ∗ = x i , j − x j m i n x j m a x − x j m i n x_{i,j}^*=\frac{x_{i,j}-x_j^{min}}{x_j^{max}-x_j^{min}} xi,j=xjmaxxjminxi,jxjmin标准归一化通常包含了均值归一化和方差归一化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为: X n e w = X i − X m e a n S t a n d a r d D e v i a t i o n X_{new}=\frac{X_i-X{mean}}{StandardDeviation} Xnew=StandardDeviationXiXmean
  2. Q: why? A: 归一化可以是使得最终梯度下降的时候可以不同维度θ参数可以在接近调整幅度上,同时有可能提高精度。
  3. Q: how? A: 在做特征工程的时候对数据进行预处理的时候进行归一化处理。

3. 正则化

  1. Q: what? A:为了防止过拟合,在损失函数的公式上加上的惩罚项,常用的有L1正则项和L2正则项,公式为: L 1 = ∑ i = 0 m ∣ w i ∣ L_1=\sum_{i=0}^m|w_i| L1=i=0mwi L 2 = ∑ i = 0 m w i 2 L_2=\sum_{i=0}^mw_i^2 L2=i=0mwi2在多元线性回归中,当损失函数加上L1正则时,我们称之为Lasso回归,而加上L2正则时,就诞生了Ridge领回归。
  2. Q: why? A:加上正则项可以提高模型的泛化能力,防止过拟合。
  3. Q: how? A:在计算损失函数的时候加上正则项一起计算Loss,同时也会引入一个正则项系数λ,通常会设置成0.4

4. 多项式升维

  1. Q: what? A: 多项式升维是为了去解决欠拟合的问题,通过已知的维度去构建新的维度,从而发现新的线性变换关系。
  2. Q: why? A: 当考虑的因素少了就可能得不到准确的模型,增加考虑的因素,探索更多X与y的关系,可以增加提高模型预测的准确性。
  3. Q: how? A: 在做特征工程的时候加入多项式升维,常见的手段是将已知的维度相乘来构建出新的维度,然后带入到数据中去进行训练。

4. 项目代码实战要点

  • 首先需要读取数据,接着观察数据的结构,分布等。推荐使用matplotlib画图观察。
  • 然后是做特征工程,常见的操作是选择性的去掉一些对结果影响很低的维度,然后对于一些不是数字标签的维度做一下one_hot编码,将其转换为数字标签。再就是对数据做归一化,有需要再做一下多项式升维。
  • 接下来是模型训练,sklearn是一个非常好用的机器学习库,集成了常用的函数 ,如随机梯度下降、lasso回归、领回归等函数,通常可以直接调用相应的方法构建模型,然后进行训练。
  • 再然后就是模型评估,需要评价模型预测结果的好坏,是否符合预期。
  • 最后是对代码调优,优化代码结构,编写注释,封装相应函数,调用接口等。

5. 最最后,纸上得来终觉浅,绝知此事要躬行。多动脑思考,多动手敲代码才是硬道理啊哈哈哈哈^_^

你可能感兴趣的:(机器学习)