MATLAB的cvpartition函数用法
1. 函数作用
cvpartition
将数据集划分为训练集和测试集,支持多种交叉验证方法,包括:
- Hold-Out验证:单次划分(如70%训练,30%测试)
- K折交叉验证:数据分为K个子集,依次用其中一个作为测试集
- 留一法(Leave-One-Out):每次留一个样本作为测试集
- 分层交叉验证:保持不同类别的样本比例一致
2. 基本语法
c = cvpartition(n, 'Method', value, ...)
c = cvpartition(group, 'Method', value, ...) % 分层选项
3. 参数说明
参数 | 说明 |
---|---|
n | 样本数量 |
group | 类别标签向量(用于分层交叉验证) |
'Method' | 验证方法:'HoldOut' , 'KFold' , 'LeaveOut' |
'HoldOut' 参数 | 测试集比例 p (默认0.1) |
'KFold' 参数 | 折数 k (默认10) |
4. 常用方法示例
Hold-Out 验证
data = rand(100, 5); % 100个样本,5个特征
c = cvpartition(100, 'HoldOut', 0.3); % 30%作为测试集trainIdx = training(c); % 逻辑索引(训练集)
testIdx = test(c); % 逻辑索引(测试集)trainData = data(trainIdx, :);
testData = data(testIdx, :);
K折交叉验证(5折)
c = cvpartition(100, 'KFold', 5);
for i = 1:c.NumTestSetstrainIdx = training(c, i); % 第i折的训练索引testIdx = test(c, i); % 第i折的测试索引% 在此训练和验证模型
end
分层K折交叉验证
labels = [ones(50,1); zeros(50,1)]; % 类别标签(二分类)
c = cvpartition(labels, 'KFold', 5); % 保持各类比例% 查看每折的类别分布
disp(c.TestSize); % 每折测试集样本数
留一法(LOO)
c = cvpartition(100, 'LeaveOut');
for i = 1:c.NumTestSetstrainIdx = training(c, i);testIdx = test(c, i); % 每次仅1个测试样本
end
5. 对象属性与方法
- 属性:
c.NumTestSets
:测试集数量(K折时为K)c.TrainSize
:各训练集大小c.TestSize
:各测试集大小
- 方法:
training(c, i)
:获取第i折的训练索引test(c, i)
:获取第i折的测试索引repartition(c)
:重新随机化分区(仅Hold-Out和KFold)
6. 注意事项
- 随机种子:使用
rng(seed)
确保结果可重复。 - 分层必要性:分类问题建议使用分层选项,避免类别分布不均。
- 大数据慎用LOO:留一法计算成本高,样本量大时改用K折。