
留一交叉验证及SAS代码
在数据量很少,用什么模型?我们总结过当数据量很少时如何选择模型和方法,以使得数据能够最大限度的得到利用。
其中有一个方法就是做交叉验证。
我有备选的模型G(x1, x2, x3), G(x1, x5, x6), F(x1, x2, x3),想知道哪一个预测的效果好。不能做样本内预测(就是用样本训练出模型,再用同样的样本代到模型中看准确度),样本量太少,再分成训练集和测试集就更少的可怜了,怎么办?
K折交叉验证可以充分利用少样本的信息。
K折交叉验证是将样本分成K个子样本集,拿出其中的K-1个子样本集来训练模型,用剩下的1个子样本集来对模型进行验证;再拿出K-1个训练模型,留下另外1个(与上一步的不同)子样本集进行验证......,如此交叉验证K次,每个子样本集验证1次,平均K次的结果作为一个模型的预测效果。
而本文想说的留一交叉验证(Leave-one-out cross validation, LOOCV)就是这种方法的极端情况:
假设只有10个样本(真的很小啊),每次拿出其中9个来训练模型,用剩下一个进行测试,得到一个测试结果(真实值与预测值的差异);再拿出另外9个进行训练,留下另外一个进行测试......如此验证10次(每个样本都能轮到一次验证样本),将10次的预测效果平均,就可以评价这个模型的好坏。
留一交叉验证就是留下1个单样本,将其他所有样本拿来做训练。可以充分利用小样本的信息。
下面分享一下数说君留一交叉验证的SAS代码,样本量假设为30:
*样本量30;
%let K=30;
*为数据增加一个变量:index,标识出观测值的ID(从1到30);
data sample;
set sample;
index = _n_;
run;
*用全30个样本建模看一下;
proc reg data=sample;
model y= x1 x2 x3;
run;
data sample_all;
set sample;
selected = .;
replicate = .;
run;
*每次模型将一个样本留作测试,其他用来训练样本,重复30次,那我们就建立30个数据集,并将这30个数据集合在一起;
%macro generateData;
%do i = 1%to &K;
*每次选择一个观测值,其selected=0,意为测试样本,其他29个均为1,意为训练样本。
data temp;
set sample;
if index = &i thenselected = 0;
else selected = 1;
replicate =&i;
run;
data sample_all;
set sample_all temp;
run;
%end;
data sampleOut;
set sample_all;
where selected ^= .;
run;
%mend;
*运行宏;
%generateData;
*slelected=0的样本意为一个数据集中的测试样本,我们看一下是否每个观测值都轮到一次测试;
proc print data=sampleOut;
where Selected=0;
var Selected id;
run;
data sampleOut;
set sampleOut;
if selected then new_y=y;
run;
*计算selected=0的样本、也就是测试样本的预测值;
proc reg data=sampleOut;
model new_y=x1 x2 x3;
by replicate;
outputout=out1(where=(new_y=.)) predicted=y_hat;
run;
data out2;
set out1;
d=y-y_hat;
absd=abs(d);
run;
*画出预测值与真实值的散点图;
proc gplot data=out2;
plot y*y_hat;
run;
proc summary data=out2;
var d absd;
outputout=out3std(d)=rmse mean(absd)=mae sum(d)=sumd;
run;
*计算y与y_hat的相关系数,以及y=y_hat的R方(这个常被用于评价模型的拟合好坏);
proc corr data=out2 pearson out=corr(where=(_TYPE_='CORR'));
var y ;
with y_hat;
run;
data corr;
set corr;
Rsqrd=y**2;
run;
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
用 SQL 生成逆向回滚 SQL:数据操作的 “后悔药” 指南 在数据库操作中,误删数据、错改字段或误执行批量更新等问题时有发生。 ...
2025-07-14如何考取数据分析师证书:以 CDA 为例 在数字化浪潮席卷各行各业的当下,数据分析师已然成为企业挖掘数据价值、驱动决策的 ...
2025-07-14t检验与Wilcoxon检验的选择:何时用t.test,何时用wilcox.test? t 检验与 Wilcoxon 检验的选择:何时用 t.test,何时用 wilcox. ...
2025-07-14AI 浪潮下的生存与进阶: CDA数据分析师—开启新时代职业生涯的钥匙(深度研究报告、发展指导白皮书) 发布机构:CDA数据科 ...
2025-07-13LSTM 模型输入长度选择技巧:提升序列建模效能的关键 在循环神经网络(RNN)家族中,长短期记忆网络(LSTM)凭借其解决长序列 ...
2025-07-11CDA 数据分析师报考条件详解与准备指南 在数据驱动决策的时代浪潮下,CDA 数据分析师认证愈发受到瞩目,成为众多有志投身数 ...
2025-07-11数据透视表中两列相乘合计的实用指南 在数据分析的日常工作中,数据透视表凭借其强大的数据汇总和分析功能,成为了 Excel 用户 ...
2025-07-11尊敬的考生: 您好! 我们诚挚通知您,CDA Level I和 Level II考试大纲将于 2025年7月25日 实施重大更新。 此次更新旨在确保认 ...
2025-07-10BI 大数据分析师:连接数据与业务的价值转化者 在大数据与商业智能(Business Intelligence,简称 BI)深度融合的时代,BI ...
2025-07-10SQL 在预测分析中的应用:从数据查询到趋势预判 在数据驱动决策的时代,预测分析作为挖掘数据潜在价值的核心手段,正被广泛 ...
2025-07-10数据查询结束后:分析师的收尾工作与价值深化 在数据分析的全流程中,“query end”(查询结束)并非工作的终点,而是将数 ...
2025-07-10CDA 数据分析师考试:从报考到取证的全攻略 在数字经济蓬勃发展的今天,数据分析师已成为各行业争抢的核心人才,而 CDA(Certi ...
2025-07-09【CDA干货】单样本趋势性检验:捕捉数据背后的时间轨迹 在数据分析的版图中,单样本趋势性检验如同一位耐心的侦探,专注于从单 ...
2025-07-09year_month数据类型:时间维度的精准切片 在数据的世界里,时间是最不可或缺的维度之一,而year_month数据类型就像一把精准 ...
2025-07-09CDA 备考干货:Python 在数据分析中的核心应用与实战技巧 在 CDA 数据分析师认证考试中,Python 作为数据处理与分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 检验:数据趋势与突变分析的有力工具 在数据分析的广袤领域中,准确捕捉数据的趋势变化以及识别 ...
2025-07-08备战 CDA 数据分析师考试:需要多久?如何规划? CDA(Certified Data Analyst)数据分析师认证作为国内权威的数据分析能力认证 ...
2025-07-08LSTM 输出不确定的成因、影响与应对策略 长短期记忆网络(LSTM)作为循环神经网络(RNN)的一种变体,凭借独特的门控机制,在 ...
2025-07-07统计学方法在市场调研数据中的深度应用 市场调研是企业洞察市场动态、了解消费者需求的重要途径,而统计学方法则是市场调研数 ...
2025-07-07CDA数据分析师证书考试全攻略 在数字化浪潮席卷全球的当下,数据已成为企业决策、行业发展的核心驱动力,数据分析师也因此成为 ...
2025-07-07