线性回归 (Linear Regression)基础知识4
本章节主要介绍回归任务的模型性能评价
- 回归模型的评价指标
- 开方均方误差(Rooted Mean Squared Error,RMSE)
- 平均绝对误差(Mean Absolute Error,MAE)
- 绝对误差中值(Median Absolute Error,MedAE)
- 平均平方log误差(Mean Squared Logarithmic Error,MSLE)
- R²分数
- 已解释的方差分数(Explained variance score)
- sklearn中的评价模型性能的方式
- estimator的score方法
- Metric
- Scoring参数
- sklearn.metrics中的评估函数
- Scikit-Learn中的Scoring参数
- 线性回归模型的超参数调优
- 超参数调优方法:
- 特殊的交叉验证:留一交叉验证
- BIC/AIC
- RidgeCV
- LassoCV
回归模型的评价指标
以下是几种常用的误差评估指标,它们用于衡量预测值与真实值之间的差异:
开方均方误差(Rooted Mean Squared Error,RMSE)
RMSE
(
y
^
,
y
)
=
1
N
∑
i
=
1
N
(
y
^
i
−
y
i
)
2
\text{RMSE}(\hat{y}, y) = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (\hat{y}_i - y_i)^2}
RMSE(y^,y)=N1i=1∑N(y^i−yi)2
RMSE 是均方误差(MSE)的平方根,它能够衡量预测误差的标准偏差,适用于需要强调较大误差的场景。
平均绝对误差(Mean Absolute Error,MAE)
MAE
(
y
^
,
y
)
=
1
N
∑
i
=
1
N
∣
y
^
i
−
y
i
∣
\text{MAE}(\hat{y}, y) = \frac{1}{N} \sum_{i=1}^{N} |\hat{y}_i - y_i|
MAE(y^,y)=N1i=1∑N∣y^i−yi∣
MAE 是预测误差绝对值的平均,它对异常值不敏感,适用于需要考虑所有误差的场景。
绝对误差中值(Median Absolute Error,MedAE)
MedAE
(
y
^
,
y
)
=
median
(
∣
y
^
1
−
y
1
∣
,
.
.
.
,
∣
y
^
N
−
y
N
∣
)
\text{MedAE}(\hat{y}, y) = \text{median}(|\hat{y}_1 - y_1|, ..., |\hat{y}_N - y_N|)
MedAE(y^,y)=median(∣y^1−y1∣,...,∣y^N−yN∣)
MedAE 是预测误差绝对值的中位数,它对异常值不敏感,适用于需要减少异常值影响的场景。
平均平方log误差(Mean Squared Logarithmic Error,MSLE)
MSLE
(
y
^
,
y
)
=
1
N
∑
i
=
1
N
(
log
(
1
+
y
^
i
)
−
log
(
1
+
y
i
)
)
2
\text{MSLE}(\hat{y}, y) = \frac{1}{N} \sum_{i=1}^{N} (\log(1 + \hat{y}_i) - \log(1 + y_i))^2
MSLE(y^,y)=N1i=1∑N(log(1+y^i)−log(1+yi))2
当
y
y
y 呈指数增长时可以使用 MSLE(如计数、一年的平均销量等),它对相对误差的惩罚更大,适用于需要强调相对误差的场景。
R²分数
既考虑了预测值与真实值之间的差异,也考虑了问题本身真实值之间的差异(Scikit-Learn 回归模型的默认评价准则)。
模型预测的均方误差(MSE):
S
S
r
e
s
(
y
^
,
y
)
=
1
N
∑
i
=
1
N
(
y
^
i
−
y
i
)
2
SS_{res}(\hat{y}, y) = \frac{1}{N} \sum_{i=1}^{N} (\hat{y}_i - y_i)^2
SSres(y^,y)=N1i=1∑N(y^i−yi)2
总平方和(Total Sum of Squares, SST):
S
S
t
o
t
(
y
)
=
1
N
∑
i
=
1
N
(
y
ˉ
−
y
i
)
2
SS_{tot}(y) = \frac{1}{N} \sum_{i=1}^{N} (\bar{y} - y_i)^2
SStot(y)=N1i=1∑N(yˉ−yi)2
其中,
y
ˉ
\bar{y}
yˉ 是样本均值,用来做预测的MSE(不考虑输入特征的影响,最简单粗暴的预测)。
R²分数计算公式:
R
2
(
y
^
,
y
)
=
1
−
S
S
r
e
s
(
y
,
y
^
)
S
S
t
o
t
(
y
)
R^2(\hat{y}, y) = 1 - \frac{SS_{res}(y, \hat{y})}{SS_{tot}(y)}
R2(y^,y)=1−SStot(y)SSres(y,y^)
误差减少比例,R²分数越接近1,模型的预测效果越好。
已解释的方差分数(Explained variance score)
最佳分数为1,计算公式为:
explained_variance
(
y
^
,
y
)
=
1
−
Var
(
y
^
−
y
)
Var
{
y
}
\text{explained\_variance}(\hat{y}, y) = 1 - \frac{\text{Var}(\hat{y} - y)}{\text{Var}\{y\}}
explained_variance(y^,y)=1−Var{y}Var(y^−y)
当残差的均值为0时,R²分数与已解释方差分数相同。
sklearn中的评价模型性能的方式
estimator的score方法
每个学习器都有score
方法,提供一个缺省的评估方法(对于回归问题,默认使用
R
2
R^2
R2分数)。
Metric
metrics
模块实现了一些函数,用来评估预测误差。
Scoring参数
使用交叉验证评估模型的工具有Scoring
参数,它允许用户指定评估模型性能的特定指标。
sklearn.metrics中的评估函数
以下是一些常用的评估函数,用于衡量模型预测值与真实值之间的差异:
函数名称 | 描述 |
---|---|
metrics.explained_variance_score(y_true, y_pred) | 解释方差回归评分函数,用于评估模型对数据方差的解释能力。 |
metrics.mean_absolute_error(y_true, y_pred) | 平均绝对误差回归损失,计算预测值与真实值之间绝对误差的平均值。 |
metrics.mean_squared_error(y_true, y_pred[, ...]) | 均方误差回归损失,计算预测值与真实值之间误差的平方的平均值。 |
metrics.mean_squared_log_error(y_true, y_pred) | 均方对数误差回归损失,计算预测值与真实值之间对数误差的平方的平均值。 |
metrics.median_absolute_error(y_true, y_pred) | 中位数绝对误差回归损失,计算预测值与真实值之间绝对误差的中位数。 |
Scikit-Learn中的Scoring参数
在Scikit-Learn中,Scoring参数允许用户指定用于模型评估的指标。以下是回归任务中常用的Scoring参数及其对应的metrics
函数:
回归任务中的Scoring参数 | 对应的metrics函数 |
---|---|
'explained_variance' | metrics.explained_variance_score |
'neg_mean_absolute_error' | metrics.mean_absolute_error |
'neg_mean_squared_error' | metrics.mean_squared_error |
'neg_mean_squared_log_error' | metrics.mean_squared_log_error |
'neg_median_absolute_error' | metrics.median_absolute_error |
'r2' | metrics.r2_score |
这些参数与metrics
模块中的函数一一对应,方便用户在模型评估时选择合适的指标。
线性回归模型的超参数调优
在线性回归模型中,超参数主要指的是正则化系数 λ \lambda λ,它控制模型的复杂度,防止过拟合。在Scikit-Learn中,不同的线性回归模型有对应的超参数调优方法:
- 岭回归:在Scikit-Learn中的实现为RidgeCV
,它通过交叉验证自动选择最佳的正则化系数。
- Lasso:在Scikit-Learn中的实现为LassoCV
,它同样通过交叉验证来确定最佳的
λ
\lambda
λ值。
- 弹性网络:在Scikit-Learn中的实现为ElasticNetCV
,它结合了岭回归和Lasso的优点,通过交叉验证来选择最佳的正则化参数。
超参数调优方法:
- 交叉验证:一种评估模型泛化能力的方法,通过将数据集分成多个子集,轮流作为训练集和验证集。
- 岭回归(RidgeCV):使用广义留一交叉验证(Leave-One-Out Cross-Validation, LOOCV)来选择最佳的正则化参数。
- 信息准则:如贝叶斯信息准则(BIC)和赤池信息准则(AIC),这些准则可以在不需要留出验证集的情况下,通过模型选择来确定最佳的正则化参数。这种方法计算速度快,无需重复进行 K K K次交叉验证。
特殊的交叉验证:留一交叉验证
当交叉验证的折数 K = N K = N K=N时,因为每次留出一个样本做验证集,我们称之为留一交叉验证。
- 折数更多,计算代价越高,通常当样本数非常少时使用。
对线性模型,可采用广义交叉验证(Generalized Cross Validation, GCV)近似留一交叉验证,极大降低交叉验证的计算量。
- Scikit-Learn中岭回归(RidgeCV)采用GCV确定正则超参数。
G C V ( λ ) = 1 N ∑ i = 1 N ( f ( x i ) − y i 1 − d f ( λ ) N ) 2 , d f ( λ ) = ∑ j = 1 D σ j 2 σ j 2 + λ GCV(\lambda) = \frac{1}{N} \sum_{i=1}^{N} \left(\frac{f(x_i) - y_i}{1 - \frac{df(\lambda)}{N}}\right)^2, \quad df(\lambda) = \sum_{j=1}^{D} \frac{\sigma_j^2}{\sigma_j^2 + \lambda} GCV(λ)=N1i=1∑N(1−Ndf(λ)f(xi)−yi)2,df(λ)=j=1∑Dσj2+λσj2
其中 σ j 2 \sigma_j^2 σj2为矩阵 X T X X^TX XTX的特征值。
BIC/AIC
AIC(赤池信息准则)和BIC(贝叶斯信息准则)是两种常用的模型选择准则,它们依赖于对模型自由度的正确估计:
- AIC:
A
I
C
(
λ
)
=
N
ln
(
R
S
S
(
w
,
λ
)
)
+
2
d
f
(
λ
)
AIC(\lambda) = N \ln(RSS(w, \lambda)) + 2df(\lambda)
AIC(λ)=Nln(RSS(w,λ))+2df(λ)
- BIC:
B
I
C
(
λ
)
=
N
ln
(
R
S
S
(
w
,
λ
)
)
+
ln
(
N
)
d
f
(
λ
)
BIC(\lambda) = N \ln(RSS(w, \lambda)) + \ln(N)df(\lambda)
BIC(λ)=Nln(RSS(w,λ))+ln(N)df(λ)
其中, R S S ( w , λ ) RSS(w, \lambda) RSS(w,λ)是残差平方和, d f ( λ ) df(\lambda) df(λ)是模型的自由度,即参数的数量。
&# AIC/BIC的适用条件
- 假设模型必须是正确的,并且这些准则是对大样本(渐近结果)进行推导的。
- 当问题是欠定时(特征数大于样本数),AIC和BIC可能会失效。
图中展示了使用AIC和BIC准则进行模型选择的过程,其中横轴是正则化参数
α
\alpha
α,纵轴是准则值。图中可以看到,随着
α
\alpha
α的增加,准则值先减小后增大,表明存在一个最优的
α
\alpha
α值,使得模型既不过拟合也不欠拟合。
RidgeCV
RidgeCV是一种用于岭回归模型的超参数调优方法,它在一组正则参数 α \alpha α中寻找最佳的 α \alpha α值。
class sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)
与交叉验证(CV)有关的参数:
- scoring:评价指标。
- cv:交叉校验划分策略。默认是
None
,采用高效的留一交叉验证。 - gcv_mode:广义留一交叉验证的模式,可选:
None
,'auto'
,'svd'
,'eigen'
。
模式 | 描述 |
---|---|
'auto' / None | 当
n
f
e
a
t
u
r
e
s
>
n
s
a
m
p
l
e
s
n_{features} > n_{samples}
nfeatures>nsamples或
X
X
X为稀疏矩阵时,使用'eigen' ;否则使用'svd' 。自动选择更经济的计算方式。 |
'svd' | 用 X X X的SVD分解(对稀疏矩阵不适用) |
'eigen' | X T X X^TX XTX的特征值分解 |
- store_cv_values:是否将每个
α
\alpha
α对应的交叉验证的值存储在属性cv_values_
中。
LassoCV
LassoCV是用于Lasso回归模型的超参数调优类,它通过交叉验证来选择最佳的正则化参数 α \alpha α。
class sklearn.linear_model.LassoCV(eps=0.001, n_alphas=100, alphas=None, fit_intercept=True,
normalize=False, precompute='auto', max_iter=1000, tol=0.0001,
copy_X=True, cv=None, verbose=False, n_jobs=1, positive=False,
random_state=None, selection='cyclic')
与交叉验证(CV)有关的参数:
-
Lasso的alphas可以通过两种方式设置:
- 设置参数
eps
和n_alphas
,参数alphas
为None
: α \alpha α超过一定值后,所有回归系数为0。所以算法可以自动确定 α \alpha α的最大值 α m a x \alpha_{max} αmax,再根据参数eps
的值和 α m i n / α m a x = e p s \alpha_{min} / \alpha_{max} = eps αmin/αmax=eps,确定 α \alpha α的最小值 α m i n \alpha_{min} αmin;最后在 α m i n \alpha_{min} αmin到 α m a x \alpha_{max} αmax区间的 log 10 \log_{10} log10均匀取n_alphas
个 α \alpha α:
logspace ( log 10 ( α m a x ∗ e p s ) , log 10 ( α m a x ) ) \text{logspace}(\log_{10}(\alpha_{max} * eps), \log_{10}(\alpha_{max})) logspace(log10(αmax∗eps),log10(αmax)) - 同RidgeCV一样,可以人为设定
alphas
。
- 设置参数
-
cv:交叉校验划分策略。默认是
None
,表示采用3折交叉验证。