目录
偏差和方差
偏差与方差之间的关系(题2)
测试均方误差的期望值可以分解为 f ^ ( x 0 ) \hat{f}(x_0) f^(x0)的方差 、 f ^ ( x 0 ) \hat{f}(x_0) f^(x0)的偏差平方 和误差项 ϵ \epsilon ϵ的方差 。
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(ε)
区别 | 偏差 | 方差 |
---|---|---|
度量 | 单个模型的学习能力 | 同一个模型在不同数据集上的稳定性 |
模型复杂度越高 | 越小 | 方差越大 |
模型的泛化性能是由学习算法的能力(偏差进行控制)、数据的充分性(方差)以及学习任务本身的难度(误差方差)所共同决定的。
给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。 但是方差和偏差不可能同时能达到最小。因此要选择两者的折中。
训练误差与测试误差(题3)
模型应用在训练集上的误差为训练误差,应用在测试集上的误差为测试误差。
- 估计测试误差的方法
-
间接估计:训练误差修正
思路:模型越复杂训练模型误差越小,先构造一个模型使训练误差越小,模型过拟合,再增加一个关于特征数的惩罚系数,即特征越多惩罚系数越大,以这两者的综合作用估计训练误差。- C p = 1 N ( R S S + 2 d σ ^ 2 ) C_p = \frac{1}{N}(RSS + 2d\hat{\sigma}^2) Cp=N1(RSS+2dσ^2)
- AIC赤池信息量准则: A I C = 1 d σ ^ 2 ( R S S + 2 d σ ^ 2 ) AIC = \frac{1}{d\hat{\sigma}^2}(RSS + 2d\hat{\sigma}^2) AIC=dσ^21(RSS+2dσ^2)
- BIC贝叶斯信息量准则: B I C = 1 n ( R S S + l o g ( n ) d σ ^ 2 ) BIC = \frac{1}{n}(RSS + log(n)d\hat{\sigma}^2) BIC=n1(RSS+log(n)dσ^2)
其中,d——模型特征个数,
R S S = ∑ i = 1 N ( y i − f ^ ( x i ) ) 2 RSS = \sum\limits_{i=1}^{N}(y_i-\hat{f}(x_i))^2 RSS=i=1∑N(yi−f^(xi))2,
σ ^ 2 \hat{\sigma}^2 σ^2——模型预测误差的方差的估计值,即残差的方差。
BIC惩罚最重,因此选出的模型特征参数最小。 -
直接估计:交叉验证
K折交叉验证:我们把训练样本分成K等分,然后用K-1个样本集当做训练集,剩下的一份样本集为验证集去估计由K-1个样本集得到的模型的精度,这个过程重复K次取平均值得到测试误差的一个估计 C V ( K ) = 1 K ∑ i = 1 K M S E i CV_{(K)} = \frac{1}{K}\sum\limits_{i=1}^{K}MSE_i CV(K)=K1i=1∑KMSEi。
-
特征选择
最优子集选择
若则p个特征中选择子集,则有 2 p 2^p 2p个子集。
向前逐步选择
只需要计算 ( 1 + p ) p / 2 (1+p)p/2 (1+p)p/2个子集。
压缩估计(正则化)(题4)
对回归的系数进行约束或者加罚的技巧对p个特征的模型进行拟合,(就是将回归系数往零的方向压缩=>特征提取)显著降低模型方差,这样也会提高模型的拟合效果。
岭回归——l2正则化
在线性回归损失函数的基础上增加对系数的约束或惩罚。
J
(
w
)
=
∑
i
=
1
N
(
y
i
−
w
0
−
∑
j
=
1
p
w
j
x
i
j
)
2
+
λ
∑
j
=
1
p
w
j
2
,
其
中
,
λ
≥
0
w
^
=
(
X
T
X
+
λ
I
)
−
1
X
T
Y
J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2 + \lambda\sum\limits_{j=1}^{p}w_j^2,\;\;其中,\lambda \ge 0\\ \hat{w} = (X^TX + \lambda I)^{-1}X^TY
J(w)=i=1∑N(yi−w0−j=1∑pwjxij)2+λj=1∑pwj2,其中,λ≥0w^=(XTX+λI)−1XTY
可以通过调节
λ
\lambda
λ ,保证
X
T
X
+
λ
I
X^TX + \lambda I
XTX+λI可逆。
调节参数 λ \lambda λ的大小是影响压缩估计的关键, λ \lambda λ越大,惩罚的力度越大,系数则越趋近于0(但不等于0)。
岭回归通过牺牲线性回归的无偏性降低方差,有可能使得模型整体的测试误差较小,提高模型的泛化能力。
可以用梯度下降法进行寻优
Lasso回归——l1正则化
J ( w ) = ∑ i = 1 N ( y i − w 0 − ∑ j = 1 p w j x i j ) 2 + λ ∑ j = 1 p ∣ w j ∣ , 其 中 , λ ≥ 0 J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2 + \lambda\sum\limits_{j=1}^{p}|w_j|,\;\;其中,\lambda \ge 0 J(w)=i=1∑N(yi−w0−j=1∑pwjxij)2+λj=1∑p∣wj∣,其中,λ≥0
因为有绝对值项,所以不能用梯度下降法进行寻优。寻优通过LARS最小角回归进行。
降维
目的
- 降噪
- 寻找数据内部本质结构
PCA(题5)
- 思路:将原始特征处理为在某个方向上的投影的方差最大特征(不具有相关性)。
- 计算: 对中心化后的协方差矩阵进行特征值分解,得到的特征向量即为投影方向。
- 习题:对一个3维椭球进行PCA降维成2维,请问是什么图形?
答:设椭球的三个轴长分别为a,b,c。
(1) 当a>b>c时或a>b=c:降维后图形为椭圆形;
(2) 当a=b>c时:降维后图形为圆形;
调参
基本概念
参数与超参数
参数 | 超参数 |
---|---|
模型内部变量,可以根据数据进行估计 | 模型外部配置变量,无法通过数据进行估计 |
参数定义了模型 | 超参数用于帮助估计模型参数 |
通过训练得到参数估计值 | 通常通过人工给定 |
方法
- 网格搜索 GridSearchCV()
- 随即搜索 RandomizedSearchCV()
- 贝叶斯搜索
库: bayesian-optimization
案例(题8)
选择一个数据集,对特征进行三种方法简化,再使用回归模型,并用网格搜索进行调参,观察三种方法优劣。
- 数据集:波士顿房价
- 特征简化方法:岭回归,Lasso回归,PCA+线性回归
- 模型评价方法:10-折交叉验证
代码如下
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn import linear_model
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV
#数据准备
boston = datasets.load_boston()
X = boston.data
y = boston.target
gslst = []
#岭回归
param_grid = {'alpha' : [0.1,0.2,0.3,0.4,0.5]}
gs = GridSearchCV(estimator=linear_model.Ridge(),param_grid = param_grid,scoring = 'r2',cv = 10)
gs = gs.fit(X,y)
print("网格搜索最优得分:",gs.best_score_)
print("网格搜索最优参数组合:\n",gs.best_params_)
gslst.append([gs.best_score_,gs.best_params_])
#Lasso回归
param_grid = {'alpha' : [0.1,0.2,0.3,0.4,0.5]}
gs = GridSearchCV(estimator=linear_model.Lasso(),param_grid = param_grid,scoring = 'r2',cv = 10)
gs = gs.fit(X,y)
print("网格搜索最优得分:",gs.best_score_)
print("网格搜索最优参数组合:\n",gs.best_params_)
gslst.append([gs.best_score_,gs.best_params_])
#PCA+回归
pipe = Pipeline([("pca",PCA()),("lr",linear_model.LinearRegression())])
param_grid = {'pca__n_components': [2,3,4,5,6,7,8,9,10,11,12]}
gs = GridSearchCV(estimator=pipe,param_grid = param_grid,scoring = 'r2',cv = 10)
gs = gs.fit(X,y)
print("网格搜索最优得分:",gs.best_score_)
print("网格搜索最优参数组合:\n",gs.best_params_)
gslst.append([gs.best_score_,gs.best_params_])