matlab实现留一交叉验证,留出法和交叉验证
寫論文的時候涉及到了這兩種方法,這里進行總結。
評估方法 主要分三種:
留出法(分一次 互斥集)
交叉驗證法(分多次 對k折形成多次互斥集)
自助法(有放回抽樣)
留出法
代碼如下:
function [X_train, y_train, X_test, y_test] = split_train_test(X, y, k, ratio)
%SPLIT_TRAIN_TEST 分割訓練集和測試集
%參數X是數據矩陣 y是對應類標簽 k是類別個數 ratio是訓練集的比例
% 返回訓練集X_train和對應的類標簽y_train 測試集X_test和對應的類標簽y_test
m = size(X, 1);
y_labels = unique(y); % 去重,k應該等于length(y_labels)
d = [1:m]';
X_train = [];
y_train= [];
for i = 1:k
comm_i = find(y == y_labels(i));
if isempty(comm_i) % 如果該類別在數據集中不存在
continue;
end
size_comm_i = length(comm_i);
rp = randperm(size_comm_i); % random permutation
rp_ratio = rp(1:floor(size_comm_i * ratio));
ind = comm_i(rp_ratio);
X_train = [X_train; X(ind, :)];
y_train = [y_train; y(ind, :)];
d = setdiff(d, ind);
end
X_test = X(d, :);
y_test = y(d, :);
end
優點:
我們用幾乎所有的數據進行訓練,然后用一個數據進行測試
確定性:實驗沒有隨機因素,整個過程是可重復的。比如十折驗證,你測兩次,結果是不一樣的,你用留一法測多少次都是一樣的。
缺點:
計算時間很長
分層問題
交叉驗證
https://blog.csdn.net/yawei_liu1688/article/details/79138202
交叉驗證有時也稱為交叉比對,如:10折交叉比對。主要用于估計一個預測模型在實際數據應用中的準確度。它是一種統計學上將數據樣本切割成較小子集的實用方法。首先在一個子集上做訓練, 而其它子集則用來做后續對此分析的確認及驗證。
一個交叉驗證將樣本數據集分成兩個互補的子集,一個子集用于訓練分類器或模型,被稱為訓練集(training set);另一個子集用于驗證訓練出的分類器或模型是否有效,被稱為測試集(testing set)。測試結果作為分類器或模型的性能指標。而我們的目的是得到高度預測精確度和低的預測誤差。為了保證交叉驗證結果的穩定性,對一個樣本數據集需要多次不同的劃分,得到不同的互補子集,進行多次交叉驗證。取多次驗證的平均值作為驗證結果。
一:簡單的交叉驗證的步驟如下:
1、 從全部的訓練數據 S中隨機選擇 中隨機選擇 s的樣例作為訓練集 train,剩余的 作為測試集 作為測試集 test。
2、 通過對測試集訓練 ,得到假設函數或者模型 。
3、 在測試集對每一個樣本根據假設函數或者模型,得到訓練集的類標,求出分類正確率。
4,選擇具有最大分類率的模型或者假設。
這種方法稱為 hold -out cross validation 或者稱為簡單交叉驗證。由于測試集和訓練集是分開的,就避免了過擬合的現象
簡單交叉驗證的不足之處在于:此方法浪費了中的數據,即使我們將模型再次帶入整個樣本集,我們仍然只用了70%的樣本建模。如果樣本的采集非常的容易以致樣本量非常之大,使用交叉驗證方法沒有什么問題;但如果樣本非常稀缺,采集困難,那么我們就需要考慮一種能夠充分利用樣本的方法
二:k折交叉驗證 k-fold cross validation
1、 將全部訓練集 S分成 k個不相交的子集,假設 S中的訓練樣例個數為 m,那么每一個子 集有 m/k 個訓練樣例,,相應的子集稱作 {s1,s2,…,sk}。
2、每次從分好的子集中里面,拿出一個作為測試集,其它k-1個作為訓練集
3、根據訓練訓練出模型或者假設函數。
4、 把這個模型放到測試集上,得到分類率。
5、計算k次求得的分類率的平均值,作為該模型或者假設函數的真實分類率。
這個方法充分利用了所有樣本。但計算比較繁瑣,需要訓練k次,測試k次。
三:留一法 leave-one-out cross validation
留一法就是每次只留下一個樣本做測試集,其它樣本做訓練集,如果有k個樣本,則需要訓練k次,測試k次。
如果設原始數據有N個樣本,那么每個樣本單獨作為驗證集,其余的N-1個樣本作為訓練集,所以LOO-CV會得到N個模型,用這N個模型最終的驗證集的分類準確率的平均數作為此下LOO-CV分類器的性能指標。
留一發計算最繁瑣,但樣本利用率最高。適合于小樣本的情況。
原文:https://blog.csdn.net/u010451580/article/details/51373081
原始數據集分割為訓練集與測試集,必須遵守兩個要點:
1、訓練集中樣本數量必須夠多,一般至少大于總樣本數的 50%;
2、兩組子集必須從完整集合中均勻取樣。均勻取樣的目的是希望盡量減少訓練集/測試集與完整集合之間的偏差。一般的作法是隨機取樣,當樣本數量足夠時,便可達到均勻取樣的效果。
10折交叉驗證,代碼如下:
clc
clear all
% 導入數據
data = load('F:\work_matlab\Matlab\wdbc.txt');
[data_r, data_c] = size(data);
%將數據樣本隨機分割為10部分
indices = crossvalind('Kfold', data_r, 10);
for i = 1 : 10
% 獲取第i份測試數據的索引邏輯值
test = (indices == i);
% 取反,獲取第i份訓練數據的索引邏輯值
train = ~test;
%1份測試,9份訓練
test_data = data(test, 1 : data_c - 1);
test_label = data(test, data_c);
train_data = data(train, 1 : data_c - 1);
train_label = data(train, data_c);
% 使用數據的代碼
end
還有https://blog.csdn.net/NNNNNNNNNNNNY/article/details/45789323提到的代碼:
在評估機器學習算法的泛化能力時,我們可以選擇隨機分割后的一部分數據作為訓練樣本,另一部分作為測試樣本。具體實現流程如下
Data = rand(9,3);%創建維度為9×3的隨機矩陣樣本
indices = crossvalind('Kfold', 9, 3);%將數據樣本隨機分割為3部分
for i = 1:3 %循環3次,分別取出第i部分作為測試樣本,其余兩部分作為訓練樣本
test = (indices == i);
train = ~test;
trainData = Data(train, :);
testData = Data(test, :);
end
總結
以上是生活随笔為你收集整理的matlab实现留一交叉验证,留出法和交叉验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何处理图片用matlab,如何使用ma
- 下一篇: 面向对象的数据库db4o: 安装并使用d