小样本数据训练蛋白设计模型学习笔记——用岭回归解决过拟合

最近看一些蛋白序列或者功能预测架构的时候会碰到一些机器学习术语,为了更好地理解并改造模型特此记录。

背景

ridge regression(岭回归)最开始是统计学术语,对于缓解线性回归中的多重共线性问题特别有用,这种问题通常出现在具有大量参数的模型中。多重共线性问题就是有很多个自变量,但是自变量之间不完全独立。

举个例子,用身高和腿长来预测体重,身高和腿长之间有很强的相关性,那体重变化到底是因为身高变化还是腿长而变化呢,因此模型在分配它们权重的时候变得很难判断,岭回归就是来分清这个问题的。

什么是回归器

就是通过给每一个输入的特征xi赋予权重wi,再加上偏置b,即可得到预测值,比如一个蛋白的溶解度、稳定性等。

比如下面就是一个普通的线性回归。

也可以看到确定一个权重系数就需要一个数据点,确定两个权重系数就需要三个数据点,特征越多,需要的数据点也随着增多,而一些数据获取较为困难,是无法提供较多的数据点的。
在这里插入图片描述

普通回归器(最小二乘回归)

目标:找到一组权重𝑤使预测值和真实值之间的平方误差SSE最小或者MSE(SSE/样本数n)最小。
在这里插入图片描述

问题:如果特征很多、彼此高度相关,但样本数又不够,就容易出现过拟合(即训练集表现好,但新数据预测差),因为模型捕捉到了一些噪声细节(团队里作业其实是一个人(特征)写的,但其他几个关系好的(其他特征)都抄的他的,因此如果过度依赖那个同学(给该特征赋予很大的权重),就会造成一个人错每个人都错的局面(误学到了噪声)),并将他们误认成了规律。

Ridge 回归器(岭回归)

在这里插入图片描述
因为模型想让Loss值小,当λ大的时候,权重向量就得小,当λ小的时候,就强调前面的拟合数据项SSE,所以最优解会在拟合数据和保持权重小之间折中。

概念讲完了我们用例子来看看

让我们来看看λ为0和2的区别

从下面两个图可以看到测试集上的MSE不变,权重变小而训练集上的MSE变大,使得loss值降低,也就是模型牺牲了训练集上的一些拟合准确度来提升了整体的泛化能力。
在这里插入图片描述
在这里插入图片描述

继续可以看到下面训练集没有那么大的时候,在训练集上拟合的红线就和测试数据绿点的方差很大,而灰色的线是红色和绿色数据点合在一起后的真实拟合线,也就是说红色线在训练数据上过拟合了。

在这里插入图片描述
岭回归的方法就是让它拟合的没有那么好(像上图的灰线),但减轻过拟合的程度,能够提供长期相对稳定的预测也就是泛化能力(蓝色线)。

在这里插入图片描述
比如已知了上面红线和蓝线的斜率(权重)以及截距(偏置),将λ=1,并带入特定数值(特征值)后计算发现带入蓝色线得到的loss值要小,并且因为蓝色线斜率小,预测值也不会随着特征值的变化而变化很多。

在这里插入图片描述
通常λ的设定有三种常见方法:
1.人工设定:直接在训练前指定一个值,比如 λ=1、λ=10,根据经验或参考文献来选。

2.网格搜索 + 交叉验证(CV) ✅ 最常用
给定一组候选 λ 值(比如 0.01, 0.1, 1, 10, 100)
在训练集上做交叉验证,选出在验证集表现最好的 λ

3.自动搜索 / 贝叶斯优化 让调参算法在 λ 空间内自动探索最优值。

下面这段代码可以运行看看普通的最小二乘和岭回归对同样的样本计算出的权重系数范数和MSE的区别

import numpy as np
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
rng = np.random.default_rng(42)

# 1) 造数据:多特征 + 适度噪声
n, p = 120, 30
X = rng.normal(size=(n, p))
true_w = np.linspace(3, 0.5, p)  # 递减权重
y = X @ true_w + rng.normal(scale=1.0, size=n)

Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=42)

# 2) 普通最小二乘 vs. 岭回归
ols = LinearRegression().fit(Xtr, ytr)
ridge = Ridge(alpha=10.0, random_state=42).fit(Xtr, ytr)

# 3) 对比系数范数与MSE
def report(name, model):
    w = model.coef_
    print(f"{name:>8} | ||w||2 = {np.linalg.norm(w):6.3f} | "
          f"Train MSE = {mean_squared_error(ytr, model.predict(Xtr)):6.3f} | "
          f"Test MSE = {mean_squared_error(yte, model.predict(Xte)):6.3f}")

report("OLS", ols)
report("Ridge", ridge)

总之岭回归通过压缩权重系数,使得在训练数据没有那么多的情况下(甚至相对于普通线性回归来说数据量都不够得情况下),依然能够拟合出泛化能力还可以的模型。

参考文献

https://www.youtube.com/watch?v=Q81RR3yKn30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值