以下理论内容均参考DataWhale集成学习教程内容,整理为笔记。
优化基础模型
在回归中,我们使用数据集去估计模型的参数,比如线性回归模型中的参数,这个数据集称为训练集。使用训练集估计回归的参数的原则一般都是使得损失函数在训练集达到最小值。
我们建立机器学习模型的目的不是为了在已有的训练集上得出的效果优良,虽然这也是挺重要的,但是我们希望所建立的机器学习模型在未知且情况复杂的测试数据上表现优异,测试数据即称为测试集。假设我们根据顾客对产品性能的打分调研问卷数据拟合一个预测模型,目的不是为了预测这些客户的消费行为如何,而是要预测新客户在对这些产品性能打分后是否会做出购买的行为。(在我上一篇博客上有我自己之前做过的一个小小案例,顾客消费行为预测的整个步骤,可以参考参考。)
训练均方误差与测试均方误差
在回归中,最常用的评价指标为均方误差,即:
M
S
E
=
1
N
∑
i
=
1
N
(
y
i
−
f
^
(
x
i
)
)
2
MSE = \frac{1}{N}\sum\limits_{i=1}^{N}(y_i -\hat{ f}(x_i))^2
MSE=N1i=1∑N(yi−f^(xi))2
其中
f
^
(
x
i
)
\hat{ f}(x_i)
f^(xi)是样本
x
i
x_i
xi应用建立的模型
f
^
\hat{f}
f^预测的结果。
若使用训练集上的数据,则称为训练均方误差,若使用测试集计算的均方误差,则称为测试均方误差。一般来说我们的目标是使得我们建立的模型在测试集上的测试误差最小。
如何选择一个测试误差最小的模型?
简单的说,认为通过训练误差最小化来选择模型。这种观点表面看上去是可行的,但是存在缺点:一个模型的训练均方误差最小时,不能保证测试均方误差同时也很小。模型在训练误差很小,但是测试均方误差很大时,我们称这种情况叫模型的过拟合。
(图来自datawhale集成学习教程)
偏差-方差的权衡
从上图的测试均方误差曲线可以看到:测试均方误差曲线呈现U型曲线,表明在测试误差曲线中有两种力量在互相博弈。可以证明:
E
(
y
0
−
f
^
(
x
0
)
)
2
=
Var
(
f
^
(
x
0
)
)
+
[
Bias
(
f
^
(
x
0
)
)
]
2
+
Var
(
ε
)
E\left(y_{0}-\hat{f}\left(x_{0}\right)\right)^{2}=\operatorname{Var}\left(\hat{f}\left(x_{0}\right)\right)+\left[\operatorname{Bias}\left(\hat{f}\left(x_{0}\right)\right)\right]^{2}+\operatorname{Var}(\varepsilon)
E(y0−f^(x0))2=Var(f^(x0))+[Bias(f^(x0))]2+Var(ε)
也就是说,测试均方误差的期望值可以分解为
f
^
(
x
0
)
\hat{f}(x_0)
f^(x0)的方差、
f
^
(
x
0
)
\hat{f}(x_0)
f^(x0)的偏差平方和误差项
ϵ
\epsilon
ϵ的方差。
为了使得模型的测试均方误差达到最小值,也就是同时最小化偏差的平方和方差。由于我们知道偏差平方和方差本身是非负的,因此测试均方误差的期望不可能会低于误差的方差,因此我们称
Var
(
ε
)
\operatorname{Var}(\varepsilon)
Var(ε)为建模任务的难度,这个量在我们的任务确定后是无法改变的,也叫做不可约误差。
模型的方差就是:用不同的数据集去估计 f f f时,估计函数的改变量。
举个例子:
我们不可能收集到全国所有人的身高和体重数据去建立一个线性回归模型去通过身高预测体重。所以只能用到抽样方法,抽出一千个样本集建立一个模型,当然一个模型是不够的,还需要再重复100次进行抽样,所以一共建立了100个线性回归模型,由于具有随机性,所以得到的100个模型不可能参数都是一模一样的,所以这100个模型之间的差异就叫做方差。而我们希望得到一个稳定的模型,也就是在不同的样本集估计的模型都不会相差太大,即要求f的方差越小越好。一般模型的复杂度越高,f的方差就会越大。
模型的偏差是指:为了选择一个简单的模型去估计真实函数所带入的误差。假如真实的数据X与Y的关系是二次关系,但是我们选择了线性模型进行建模,那由于模型的复杂度引起的这种误差我们称为偏差,它的构成时复杂的。偏差度量了期望预测与真实结果的偏离程度,即刻画了拟合能力。偏差度量的是单个模型的学习能力,而方差度量的是同一个模型在不同数据集上的稳定性。
**“偏差-方差分解”**说明:泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。一般而言,增加模型的复杂度,会增加模型的方差,但是会减少模型的偏差,我们要找到一个方差–偏差的权衡,使得测试均方误差最小。
特征提取
避免以上误差所造成的过拟合,可以解决的方法有很多,这里举例了PCA主成分降维,也是我经常用的一种方法。是将原始的特征空间投影到一个低维的空间实现变量的数量变少,如:将二维的平面投影至一维空间。
主成分分析的思想:通过最大投影方差 将原始空间进行重构,即由特征相关重构为无关,即落在某个方向上的点(投影)的方差最大。在进行下一步推导之前,我们先把样本均值和样本协方差矩阵推广至矩阵形式:
样本均值Mean:
x
ˉ
=
1
N
∑
i
=
1
N
x
i
=
1
N
X
T
1
N
,
其
中
1
N
=
(
1
,
1
,
.
.
.
,
1
)
N
T
\bar{x} = \frac{1}{N}\sum\limits_{i=1}^{N}x_i = \frac{1}{N}X^T1_N,\;\;\;其中1_N = (1,1,...,1)_{N}^T
xˉ=N1i=1∑Nxi=N1XT1N,其中1N=(1,1,...,1)NT
样本协方差矩阵
S
2
=
1
N
∑
i
=
1
N
(
x
i
−
x
ˉ
)
(
x
i
−
x
ˉ
)
T
=
1
N
X
T
H
X
,
其
中
,
H
=
I
N
−
1
N
1
N
1
N
T
S^2 = \frac{1}{N}\sum\limits_{i=1}^{N}(x_i-\bar{x})(x_i-\bar{x})^T = \frac{1}{N}X^THX,\;\;\;其中,H = I_N - \frac{1}{N}1_N1_N^T
S2=N1i=1∑N(xi−xˉ)(xi−xˉ)T=N1XTHX,其中,H=IN−N11N1NT
最大投影方差的步骤:
(i) 中心化:
x
i
−
x
ˉ
x_i - \bar{x}
xi−xˉ
(ii) 计算每个点
x
1
,
.
.
.
,
x
N
x_1,...,x_N
x1,...,xN至
u
⃗
1
\vec{u}_1
u1方向上的投影:
(
x
i
−
x
ˉ
)
u
⃗
1
,
∣
∣
u
⃗
1
∣
∣
=
1
(x_i-\bar{x})\vec{u}_1,\;\;\;||\vec{u}_1|| = 1
(xi−xˉ)u1,∣∣u1∣∣=1
(iii) 计算投影方差:
J
=
1
N
∑
i
=
1
N
[
(
x
i
−
x
ˉ
)
T
u
⃗
1
]
2
,
∣
∣
u
⃗
1
∣
∣
=
1
J = \frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2,\;\;\;||\vec{u}_1|| = 1
J=N1i=1∑N[(xi−xˉ)Tu1]2,∣∣u1∣∣=1
(iv) 最大化投影方差求
u
⃗
1
\vec{u}_1
u1:
u
ˉ
1
=
a
r
g
m
a
x
u
1
1
N
∑
i
=
1
N
[
(
x
i
−
x
ˉ
)
T
u
⃗
1
]
2
s
.
t
.
u
⃗
1
T
u
⃗
1
=
1
(
u
⃗
1
往
后
不
带
向
量
符
号
)
\bar{u}_1 = argmax_{u_1}\;\;\frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2 \\ \;\;\;s.t. \vec{u}_1^T\vec{u}_1 = 1 (\vec{u}_1往后不带向量符号)
uˉ1=argmaxu1N1i=1∑N[(xi−xˉ)Tu1]2s.t.u1Tu1=1(u1往后不带向量符号)
得到:
J
=
1
N
∑
i
=
1
N
[
(
x
i
−
x
ˉ
)
T
u
⃗
1
]
2
=
1
N
∑
i
=
1
N
[
u
1
T
(
x
i
−
x
ˉ
)
(
x
i
−
x
ˉ
)
T
u
1
]
=
u
1
T
[
1
N
∑
i
=
1
N
(
x
i
−
x
ˉ
)
(
x
i
−
x
ˉ
)
T
]
u
1
=
u
1
T
S
2
u
1
J = \frac{1}{N}\sum\limits_{i=1}^{N}[(x_i-\bar{x})^T\vec{u}_1]^2 = \frac{1}{N}\sum\limits_{i=1}^{N}[u_1^T(x_i-\bar{x})(x_i-\bar{x})^Tu_1]\\ \; = u_1^T[\frac{1}{N}\sum\limits_{i=1}^{N}(x_i-\bar{x})(x_i - \bar{x})^T]u_1 = u_1^TS^2u_1
J=N1i=1∑N[(xi−xˉ)Tu1]2=N1i=1∑N[u1T(xi−xˉ)(xi−xˉ)Tu1]=u1T[N1i=1∑N(xi−xˉ)(xi−xˉ)T]u1=u1TS2u1
即:
u
^
1
=
a
r
g
m
a
x
u
1
u
1
T
S
2
u
1
,
s
.
t
.
u
1
T
u
1
=
1
L
(
u
1
,
λ
)
=
u
1
T
S
2
u
1
+
λ
(
1
−
u
1
T
u
1
)
∂
L
∂
u
1
=
2
S
2
u
1
−
2
λ
u
1
=
0
即
:
S
2
u
1
=
λ
u
1
\hat{u}_1 = argmax_{u_1}u_1^TS^2u_1,\;\;\;s.t.u_1^Tu_1 = 1\\ L(u_1,\lambda) = u_1^TS^2u_1 + \lambda (1-u_1^Tu_1)\\ \frac{\partial L}{\partial u_1} = 2S^2u_1-2\lambda u_1 = 0\\ 即:S^2u_1 = \lambda u_1
u^1=argmaxu1u1TS2u1,s.t.u1Tu1=1L(u1,λ)=u1TS2u1+λ(1−u1Tu1)∂u1∂L=2S2u1−2λu1=0即:S2u1=λu1
可以看到:
λ
\lambda
λ为
S
2
S^2
S2的特征值,
u
1
u_1
u1为
S
2
S^2
S2的特征向量。因此我们只需要对中心化后的协方差矩阵进行特征值分解,得到的特征向量即为投影方向。如果需要进行降维,那么只需要取p的前M个特征向量即可。
下面展示我在上一篇博客(传送门~)上机器学习完整案例中没有细写的利用PCA进行特征提取的做法。
import numpy as np
import pandas as pd
data = pd.read_excel('数据.xlsx',sheet_name='3')
print(data)
y = data['购买意愿'].values
data = data.drop(['购买意愿'],axis=1)
data = data.drop(['品牌'],axis=1)
data = data.values
def eigValPct(eigVals,percentage):
sortArray=np.sort(eigVals) #对特征值按照从小到大排序
sortArray=sortArray[-1::-1] #特征值从大到小排序
arraySum=sum(sortArray)
tempSum=0
num=0
for i in sortArray:
tempSum+=i
num+=1
if tempSum>=arraySum*percentage:
return num
def pca(dataMat,percentage=0.9):
meanVals=np.mean(dataMat,axis=0) #平均值
meanRemoved=dataMat-meanVals
covMat=np.cov(meanRemoved,rowvar=0) #计算方差
eigVals,eigVects=np.linalg.eig(np.mat(covMat)) #特征值和特征向量
k=eigValPct(eigVals,percentage) #达到方差的百分比需要前k个向量
eigValInd=np.argsort(eigVals) #对特征值从小到大排序
eigValInd=eigValInd[:-(k+1):-1] #从排好序的特征值,从后往前取k个
redEigVects=eigVects[:,eigValInd] #返回排序后特征值对应的特征向量
lowDDataMat=meanRemoved*redEigVects #将原始数据投影到主成分上得到新的低维数据
reconMat=(lowDDataMat*redEigVects.T)+meanVals #重构数据
print('特征值:',eigVals)
return reconMat
还有这一种方法
特征提取的实例:向前逐步回归
参考~