线性回归 Linear Regression
1 概述
线性回归类似高中的线性规划题目。线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合(加减乘除)起来,得到的结果和目标接近。
线性回归分为一元线性回归和多元线性回归。
2 一元线性回归
2.1 构造回归方程
有n组数据,自变量(特征值) x ( x 1 , x 2 , . . . , x n ) x(x_1,x_2,...,x_n) x(x1,x2,...,xn) 与因变量(目标值) y ( y 1 , y 2 , . . . , y n ) y(y_1,y_2,...,y_n) y(y1,y2,...,yn) ,我们需要找到一个线性关系,使他们之间尽可能满足: f ( x ) = a x + b f(x) =ax+b f(x)=ax+b ,这个就是构建的一元线性方程。
线性回归的目标就是让 f ( X ) f(X) f(X) 与 y y y 之间的差距最小,也就是权重 a a a和偏置 b b b取什么值的时候 f ( X ) f(X) f(X)和 y y y最接近。
2.2 构造损失函数
损失函数是来度量模型预测值与真实值不一样的程度的,或者说度量预测错误的程度,损失函数值越小,模型就越好。
在回归问题中,误差平方和是回归任务中最常用的性能度量。这里就可以令损失函数 L ( a , b ) L(a,b) L(a,b)等于误差平方和(均方误差)。
则损失函数为:
L ( a , b ) = ∑ i = 1 n ( f ( x i ) − y i ) 2 L(a, b) = \sum \limits_{i = 1}^{n}(f(x_i) - y_i)^2 L(a,b)=i=1∑n(f(xi)−yi)2
2.3 确定参数
我们需要通过最小的损失函数得到最佳的参数 a a a 和 b b b 。一般使用最小二乘法。
a = ∑ i = 1 n x i y i − n x ‾ y ‾ ∑ i = 1 n x i 2 − n x ‾ 2 b = y ‾ − a x ‾ a = \frac{\sum \limits_{i=1}^{n}x_iy_i - n \overline x \overline y}{\sum \limits_{i=1}^{n}x_i^2 - n \overline x ^ 2} \\ b = \overline y - a \overline x a=i=1∑nxi2−nx2i=1∑nxiyi−nxyb=y−ax
3 多元线性回归
多元线性回归类似一元
回归方程: y = a 1 x 1 + a 2 x 2 + a 3 x 3 + . . . + a n x n + b y = a_1 x_1 + a_2 x_2 + a_3 x_3 + ... + a_n x_n + b y=a1x1+a2x2+a3x3+...+anxn+b
对所有的数据统一用矩阵形式表示:
y ( i ) = θ T x ( i ) + ε ( i ) ( 1 ) y^{(i)} = \theta ^ T x ^ {(i)} + \varepsilon^{(i)} \ (1) y(i)=θTx(i)+ε(i) (1)
y ( i ) y^{(i)} y(i)表示第
i
个样本的真实值ε \varepsilon ε 误差代表真实值和预测值之间的差异
误差 ε ( i ) \varepsilon ^{(i)} ε(i) 是独立并具有相同的分布,服从均值为 0 方差为 θ 2 \theta ^ 2 θ2 的高斯分布
损失函数
L ( a 1 , a 2 , . . . , a n , b ) = ∑ i = 1 n ( f ( x i ) − y i ) 2 L(a_1, a_2, ..., a_n, b) = \sum_{i = 1}^{n}(f(x_i) - y_i)^2 L(a1,a2,...,an,b)=i=1∑n(f(xi)−yi)2
高斯分布的概率函数:
p ( x ) = 1 2 π σ exp ( − x 2 2 σ 2 ) ( 2 ) p(x) = \frac{1}{\sqrt {2 \pi} \sigma} \exp{(-\frac{x^2}{2 \sigma ^ 2})} \ (2) p(x)=2πσ1exp(−2σ2x2) (2)
将(1)
带入(2)
得到预测值成为真实值的概率函数:
p ( y ( i ) ∣ x ( i ) ; θ ) = 1 2 π σ exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) p(y ^ {(i)} | x ^ {(i)}; \theta) = \frac{1}{\sqrt {2 \pi} \sigma} \exp{(-\frac{(y^{(i)} - \theta ^ T x ^ {(i)})^2}{2 \sigma ^ 2})} p(y(i)∣x(i);θ)=2πσ1exp(−2σ2(y(i)−θTx(i))2)
似然函数:(什么样的参数计算出来的误差最小,即与实际值最接近)
L ( θ ) = ∏ i = 1 m p ( y ( i ) ∣ x ( i ) ; θ ) = ∏ i = 1 m 1 2 π σ exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) L(\theta) = \prod \limits_{i = 1}^{m} p(y ^ {(i)} | x ^ {(i)}; \theta) = \prod \limits_{i=1}^{m}\frac{1}{\sqrt {2 \pi} \sigma} \exp{(-\frac{(y^{(i)} - \theta ^ T x ^ {(i)})^2}{2 \sigma ^ 2})} L(θ)=i=1∏mp(y(i)∣x(i);θ)=i=1∏m2πσ1exp(−2σ2(y(i)−θTx(i))2)
对数似然法:(将乘法转化为加法),之后需要用极大似然估计方法求解
l n L ( θ ) = l n ∏ i = 1 m 1 2 π σ exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) ln L(\theta) = ln \prod \limits_{i=1}^{m}\frac{1}{\sqrt {2 \pi} \sigma} \exp{(-\frac{(y^{(i)} - \theta ^ T x ^ {(i)})^2}{2 \sigma ^ 2})} lnL(θ)=lni=1∏m2πσ1exp(−2σ2(y(i)−θTx(i))2)
展开化简:
l n L ( θ ) = ∑ i = 1 m l n 1 2 π σ exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = m l n 1 2 π σ − 1 σ 2 1 2 ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 ln L(\theta) = \sum \limits_{i = 1}^{m}ln \frac{1}{\sqrt {2 \pi} \sigma} \exp{(-\frac{(y^{(i)} - \theta ^ T x ^ {(i)})^2}{2 \sigma ^ 2})} \\ = mln \frac{1}{\sqrt {2 \pi} \sigma} - \frac{1}{\sigma^2} \frac{1}{2} \sum \limits _{i = 1}^{m} (y^{(i)} - \theta ^ T x ^ {(i)})^2 lnL(θ)=i=1∑mln2πσ1exp(−2σ2(y(i)−θTx(i))2)=mln2πσ1−σ2121i=1∑m(y(i)−θTx(i))2
目标:让似然函数越大越好(极大似然估计),即让 J ( θ ) J(\theta) J(θ)越小越好(可以使用最小二乘法求解)
J ( θ ) = 1 2 ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 J(\theta) = \frac{1}{2} \sum \limits _{i = 1}^{m} (y^{(i)} - \theta ^ T x ^ {(i)})^2 J(θ)=21i=1∑m(y(i)−θTx(i))2
其实由损失函数也可以得到同样的式子:
对于 y = θ x + b y = \theta x + b y=θx+b , θ \theta θ 将 b b b 也吸入进入得到 θ ^ = ( θ , b ) \hat \theta = (\theta, b) θ^=(θ,b) , X X X代表所有的样本数据,最后一个元素置1,最后要和 θ ^ \hat\theta θ^ 相乘,最后求偏导也是一样的结果。
L = ∑ i = 1 n ( y i − f ( x i ) ) 2 = ( y − X θ ^ ) T ( y − X θ ^ ) X = ( x 11 x 12 ⋯ x 1 d 1 x 11 x 12 ⋯ x 1 d 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 ⋯ x m d 1 ) = ( x 1 T 1 x 2 T 1 ⋮ ⋮ x m T 1 ) L = \sum \limits_{ i = 1 } ^ n ( y_i - f(x_i)) ^ 2 = (y - X \hat \theta)^T (y - X \hat\theta) \\ X = \begin{pmatrix} x_{11} & x_{12} & \cdots & x_{1d} & 1 \\ x_{11} & x_{12} & \cdots & x_{1d} & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ x_{m1} & x_{m2} & \cdots & x_{md} & 1 \end{pmatrix} = \begin{pmatrix} x_1^T & 1 \\ x_2^T & 1 \\ \vdots & \vdots \\ x_m^T & 1 \end{pmatrix} L=i=1∑n(yi−f(xi))2=(y−Xθ^)T(y−Xθ^)X= x11x11⋮xm1x12x12⋮xm2⋯⋯⋱⋯x1dx1d⋮xmd11⋮1 = x1Tx2T⋮xmT11⋮1
矩阵求导参考:
- https://zhuanlan.zhihu.com/p/263777564 (先导篇)
- https://zhuanlan.zhihu.com/p/273729929 (公式篇)
4 梯度下降
梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法。主要解决求最小值问题,其基本思想在于不断地逼近最优点,每一步的优化方向就是梯度的方向。
4.1 梯度下降方法
- 批量梯度下降
容易得到最优解,但是由于每次考虑所有样本,速度很慢。
- 随机梯度下降
每次找一个样本,迭代速度很快,但不一定每次都朝着收敛的方向。
- 小批量梯度下降
每次更新一小部分数据来算,因为在整个训练集上算梯度资源消耗太大,我们可以随机采取 b b b个样本 i 1 , i 2 , ⋯ , i b i_1, i_2, \cdots, i_b i1,i2,⋯,ib来近似损失, e e e是损失函数, b b b是批量大小。
1 b ∑ i ∈ I b e ( x i , y i , w ) \frac{1}{b} \sum \limits_{i \in I_b} \mathcal{e}(\mathbf{x_i}, y_i, \mathbf{w}) b1i∈Ib∑e(xi,yi,w)
4.2 其他参数
- 学习率:更新的步长
- 批处理数量
一般batch_size
选择32,64,128等,有时候会考虑内存和效率。
逻辑回归
逻辑回归是一个经典的二分类算法。
1 sigmoid函数
g ( z ) = 1 1 + e − z , z ∈ R g(z) = \frac{1}{1 + e ^ {-z}}, z \in R g(z)=1+e−z1,z∈R
将任意的输入映射到了 [ 0 , 1 ] [0, 1] [0,1]区间中,在线性回归中可以得到一个预测值,再将该值映射到sigmoid函数中,这样就可以完成由值到概率的转换,这就是分类任务。
2 逻辑回归求解
预测函数:
h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x 其中 θ 0 + θ 1 x 1 + . . . + θ n x n = ∑ i = 1 n θ i x i = θ T x h_{\theta}(x) = g(\theta ^ T x) = \frac{1}{1 + e ^ {-\theta^T x}} \\ \text{其中} \theta_0 + \theta_1 x_1 + ... + \theta_n x_n = \sum \limits_{i = 1}^n \theta_i x_i = \theta ^ T x hθ(x)=g(θTx)=1+e−θTx1其中θ0+θ1x1+...+θnxn=i=1∑nθixi=θTx
分类任务:
{ P ( y = 1 ∣ x ; θ ) = h θ ( x ) P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) ⇒ P ( y ∣ x ; θ ) = ( h θ ( x ) ) y ( 1 − h θ ( x ) ) 1 − y \begin{cases} P(y = 1|x; \theta) = h_\theta(x) \\ P(y = 0|x; \theta) = 1 - h_\theta(x) \end{cases} \Rightarrow P(y | x; \theta) = (h_\theta(x)) ^ y (1 - h_\theta(x)) ^ {1 - y} {P(y=1∣x;θ)=hθ(x)P(y=0∣x;θ)=1−hθ(x)⇒P(y∣x;θ)=(hθ(x))y(1−hθ(x))1−y
对于二分类任务(0, 1),整合后,y
取0只保留 ( 1 − h θ ( x ) ) 1 − y (1 - h_\theta(x)) ^ {1 - y} (1−hθ(x))1−y ,y
取1只保留 ( h θ ( x ) ) y (h_\theta(x)) ^ y (hθ(x))y 。
似然函数:
L ( θ ) = ∏ i = 1 m P ( y i ∣ x i ; θ ) = ∏ i = 1 m ( h θ ( x i ) ) i y ( 1 − h θ ( x i ) ) 1 − y i L(\theta) = \prod \limits_{i = 1}^m P(y_i | x_i; \theta) = \prod \limits_{i = 1}^m (h_\theta(x_i)) ^ y_i (1 - h_\theta(x_i)) ^ {1 - y_i} L(θ)=i=1∏mP(yi∣xi;θ)=i=1∏m(hθ(xi))iy(1−hθ(xi))1−yi
对数似然法,即求 l ( θ ) l(\theta) l(θ) 的最大值:
l ( θ ) = l o g L ( θ ) = ∑ i = 1 m ( y i l o g h θ ( x i ) + ( 1 − y i ) l o g ( 1 − h θ ( x i ) ) ) l(\theta) = logL(\theta) = \sum \limits_{i = 1} ^m (y_i log h_\theta(x_i) + (1 - y_i) log (1 - h_\theta(x_i))) l(θ)=logL(θ)=i=1∑m(yiloghθ(xi)+(1−yi)log(1−hθ(xi)))
将上述函数转化为求最小值,同时系数乘上一个常数,即求 J ( θ ) = − 1 m l ( θ ) J(\theta) = -\frac{1}{m}l(\theta) J(θ)=−m1l(θ) 的最小值,转化为梯度下降问题:
J ( θ ) = − 1 m l ( θ ) J(\theta) = -\frac{1}{m}l(\theta) J(θ)=−m1l(θ)
上述过程即求出了偏导的方向,有了更新方向就可以进行参数更新: α \alpha α代表学习率
θ j = θ j − α 1 m ∑ i = 1 m ( h θ ( x i ) − y i ) x i j \theta_j = \theta_j - \alpha \frac{1}{m} \sum \limits_{i = 1} ^ m (h_\theta(x_i) - y_i)x_i^j θj=θj−αm1i=1∑m(hθ(xi)−yi)xij
减法是代表用的梯度下降,整体除以
m
是考虑了所有的m个样本。
多分类问题:
Softmax回归是逻辑回归的一般化,相关对比参考 https://zhuanlan.zhihu.com/p/98061179
模型评估标准
1 回归模型评估
1.1 平均绝对误差(Mean Absolute Error,MAE)
平均绝对误差就是指预测值与真实值之间平均相差多大
M A E = 1 m ∑ i = 1 m ∣ f i − y i ∣ MAE = \frac{1}{m}\sum \limits _{i = 1}^m \lvert f_i - y_i \rvert MAE=m1i=1∑m∣fi−yi∣
1.2 均方误差(Mean Squared Error,MSE)
观测值与真值偏差的平方和与观测次数的比值
M S E = 1 m ∑ i = 1 m ( f i − y i ) 2 MSE = \frac{1}{m} \sum \limits_{i = 1}^m(f_i - y_i)^2 MSE=m1i=1∑m(fi−yi)2
这也是线性回归中最常用的损失函数,线性回归过程中尽量让该损失函数最小。那么模型之间的对比也可以用它来比较。
MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
1.3 R-square(决定系数)
R 2 = 1 − ∑ ( Y a c t u a l − Y p r e d i c t ) 2 ∑ ( Y a c t u a l − Y m e a n ) 2 R^2 = 1 - \frac{\sum(Y_{actual} - Y_{predict})^2}{\sum(Y_{actual} - Y_{mean})^2} R2=1−∑(Yactual−Ymean)2∑(Yactual−Ypredict)2
1.4 Adjusted R-Square(校正决定系数)
R a d j u s t e d 2 = 1 − ( 1 − R 2 ) ( n − 1 ) n − p − 1 R^2_{adjusted} = 1 - \frac{(1 - R^2)(n - 1)}{n - p - 1} Radjusted2=1−n−p−1(1−R2)(n−1)
n为样本数量,p为特征数量
消除了样本数量和特征数量的影响
1.5 交叉验证
我们有一个总的数据集,将总数据集切分,例如,将数据分为训练集(80%)和测试集(20%),训练集用来训练model,测试集用来最终的测试。
训练集还再平均进行切分为3份(标号为1、2、3)。
测试集和训练集的比例自己定。
交叉验证就是在训练集中,采用2份数据来训练,用另一份数据来验证训练出的模型的参数,进行3次。
即:1 + 2来训练,3验证;2 + 3来训练,1来验证;1 + 3来训练,2来验证。
为了让模型的评估效果比较好,最后将3次的参数取平均值。
无论分类还是回归模型,都可以利用交叉验证,进行模型评估
sklearn模块中有交叉验证函数,例如
sklearn.cross_validation
中的train_testsplit
函数
交叉验证主要是为了防止某一部分数据比较简单,导致模型的效果比较高。
2 分类模型评估
2.1 准确率、精确率、召回率、f1_score
-
准确率(Accuracy)的定义是:对于给定的测试集,分类模型正确分类的样本数与总样本数之比;
-
精确率(Precision)的定义是:对于给定测试集的某一个类别,分类模型预测正确的比例,或者说:分类模型预测的正样本中有多少是真正的正样本;
-
召回率(Recall)的定义为:对于给定测试集的某一个类别,样本中的正类有多少被分类模型预测正确;
假设有1000个人,其中990个人正常,有10个人患有癌症,模型旨在预测哪些人是患有癌症的。
如果模型预测1000个人中都是正常的,没有癌症患者,那么可以说模型的精度是 990 1000 = 0.99 \frac{990}{1000}=0.99 1000990=0.99。虽然精度很高,但是都是正样本,没有负样本,模型是无用的,因为一个患者都没有找到。因此无法用精度来评估模型,而是使用recall召回率来评估。
-
F1_score,在理想情况下,我们希望模型的精确率越高越好,同时召回率也越高越高,但是,现实情况往往事与愿违,在现实情况下,精确率和召回率像是坐在跷跷板上一样,往往出现一个值升高,另一个值降低,那么,有没有一个指标来综合考虑精确率和召回率了,这个指标就是F值。F值的计算公式为:
F = ( a 2 + 1 ) × P × R a 2 × ( P + R ) F = \frac{(a ^ 2 + 1) \times P \times R}{a ^ 2 \times (P + R)} F=a2×(P+R)(a2+1)×P×RP: Precision, R: Recall, a:权重因子
当a=1时,F值便是F1值,代表精确率和召回率的权重是一样的,是最常用的一种评价指标。
F1的计算公式为: F 1 = 2 × P × R P + R F1 = \frac{2 \times P \times R}{P + R} F1=P+R2×P×R
2.2 混淆矩阵
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。
具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。
下面是一个混淆矩阵,Actual
代表真实值,Predicted
代表预测值,预测的是标签号(因为是分类任务,主要对标签进行分类)。
下面是我对TP、TN、FP、FN四个值的理解(助记)
TP:预测正确,预测成1
TN:预测正确,预测成0
FP:预测错误,预测成1
FN:预测错误,预测成0
可以通过上面四个值计算相应的评估值,见下图。
- 准确率:预测正确的比例
- 精确率:在预测之后,在预测结果的某一结果上,正确的比例
- 召回率:在预测之前,真实值为某一结果上,正确的比例
回归模型相关技巧
1 下采样和上采样
在分类问题的数据中,很容易出现正反数据集数量存在极大的差距,这类数据直接用于训练不利于模型的构架,所以我们需要对数据进行些许处理。
很容易想到,合理的数据集应该是正反数据集数量应接近,那就存在两种策略:
下采样策略:把数量多的减少到与数量少的相近
上(过)采样策略:把数量少的增加到与数量多的相近
- 下采样:
- 上采样:SMOTE算法
步骤:
(1)对于少数类中每一个样本x,以**欧氏距离(两点之间距离)**为标准计算它到少数类样本集中所有样本的距离,得到其k
近邻(所有距离排序后前k
小的距离)
(2)根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn
(3)对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本。
x n e w = x + r a n d ( 0 , 1 ) × ( x ~ − x ) x_{new} = x + rand(0, 1) \times (\widetilde x - x) xnew=x+rand(0,1)×(x −x)
( x ~ − x ) (\widetilde x - x) (x −x) 相当于距离 d i d_i di (欧几里得距离),那么每个 d i d_i di 都可以生成一个新的数据。
2 正则化惩罚
加上了正则化项能在一定程度上避免过拟合