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折。