在机器学习算法学习的研究中,我们通常有数据集D(用于训练模型),但我们还需要评估模型,因此不能把整个D用于训练,因为拿训练过的数据再去评估必然无效。那么最基本的方法就是留出法:
把D划分为两部分:训练集S和测试集T,其中SUT=D,S∩T=Φ。
划分时一般不宜随机划分,因为如果T中正好只取到某一种特殊类型数据,从而带来了额外的误差。此时处理方法要视具体情况而定,如当数据明显的分为有限类时,可以采用分层抽样方式选择测试数据,保证数据分布比例的平衡。
大多情形下,难以得到合适的测试集,此时一般多次重复划分-训练-测试求误差的步骤,取误差的平均值。
下面是实现代码:
clear all;
close all;
clc;
S=[]
T=[]
data = csvread('irisdata.csv');
[m,n] = size(data);
label = data(:,n);
labels = unique(label);
for i = 1:length(labels)
d = sum(ismember(label,labels(i)));
choose = d*0.7;
index = find(label==labels(u));
ix = randperm(d);
S = [S:data(ix(1:choose),:)];
T = [T:data(ix(choose+1:d),:)];
end
留出法带来一个无法避免的矛盾:
我们初始动机是“评估数据集D训练出的模型”但是我们把数据集分开了,导致:
Ⅰ 若 S较大T较小,那么S训练出的模型与D训练的模型相似,但是T太少,评估结果偶然性大,不准确。
Ⅱ 若S较小T较大,那么S与D训练出的模型差异较大,T的评估失去意义。
这种矛盾是无法避免的。常用做法是选择1/5-1/3左右数据用于评估。