今天是生信星球陪你的第998天
公众号里的文章大多数需要编程基础,如果因为代码看不懂,而跟不上正文的节奏,可以来找我学习,相当于给自己一个新手保护期。我的课程都是循环开课,点进去咨询微信↓
生信分析直播课程(每月初开一期,春节休一个月)
生信新手保护学习小组(每月两期)
单细胞陪伴学习小组(每月两期)
1.交叉验证的目的
今天国庆节,先祝大家节日快乐咯。
在前面的学习中,已经熟悉了训练集和测试集的拆分,在测试集上计算模型性能指标,但这个过程有一个潜在的陷阱。
如果在测试集上计算R方,则返回的值依赖于我们拆分数据的方式,测试集中的数据点可能有一些特殊性,这意味着计算的R方并不代表模型泛化到所有的未遇到过的新数据的能力。
交叉验证可以消除这种对随机拆分的依赖。
2.交叉验证基础知识
首先将数据集分成五个组或者五个fold。
用第一个fold作为测试集,剩下的作为训练集,计算感兴趣的模型指标,例如R方。
然后用第二个fold作为测试集,剩下的作为训练集,计算感兴趣的指标
以此类推,可以计算5个R方,也可以进一步计算这些R方的平均值,中位数和95%置信区间。
将数据集分成5折,就是5折交叉验证,
将数据集分成10折,就是10折交叉验证。
将数据集分成k折,就是k折交叉验证。
folds数越大,计算成本越高。(代码接上一篇继续)
from sklearn.model_selection import cross_val_score, KFold
kf = KFold(n_splits=6, shuffle=True, random_state=42)
reg = LinearRegression()
cv_results = cross_val_score(reg, X, y, cv=kf)
shuffle是打乱顺序,就像打扑克时洗牌是一个道理。
print(cv_results)
## [0.31239631 0.39992274 0.38698031 0.19731639 0.32317527 0.3320924 ]
import numpy as np
print(np.mean(cv_results), np.std(cv_results))
## 0.32531390402925003 0.06579003824551578
print(np.quantile(cv_results, [0.025, 0.975]))
## [0.21170138 0.39830494]
注:cv_results里的数值是R方,因为这是线性回归的默认评分。