Matlab分为训练/有效/测试集并保持比例

  • 本文关键字:有效 Matlab 测试 matlab
  • 更新时间 :
  • 英文 :


我的数据集有12列+1个目标(二进制)和大约4000行。我需要将其分为训练(70%)、验证(20%)和测试(10%)集。

数据集采样不足(0类的95%到1类的5%),所以我需要保持每个样本中目标的比例。

我能够以某种方式分割数据集,但我不知道如何保持比率。

我在这里处理葡萄酒质量数据子集

如果您可以访问Matlab的统计处理工具箱,则可以使用cvpartition作用

关于cvpartition-:的matlab帮助

c=cvpartition(group,'HoldOut',p)使用组中的类信息,将观察结果随机划分为训练集和分层测试集;也就是说,训练集和测试集的班级比例与小组大致相同。

您可以应用该函数两次以获得三个分区。此函数保留原始类分布。

到目前为止,我提出了这个方案,如果有人知道更好的解决方案,请告诉我。我按目标列分割数据集,然后将这两个分割分别进一步分割为前70%、后20%和后10%的数据,然后合并在一起。之后,我拆分了功能和目标。

%split in 0/1 samples
winedataset_0 = winedataset(winedataset(:, 13) == 0, :);
winedataset_1 = winedataset(winedataset(:, 13) == 1, :);
%train
split_tr_0 = round(length(winedataset_0)*0.7);
split_tr_1 = round(length(winedataset_1)*0.7);
train_0 = winedataset_0(1:split_tr_0,:);
train_1 = winedataset_1(1:split_tr_1,:);
train_set = vertcat(train_0, train_1);
train_set = train_set(randperm(length(train_set)),:);
%valid
split_valid_0 = split_tr_0 + round(length(winedataset_0)*0.2);
split_valid_1 = split_tr_1 + round(length(winedataset_1)*0.2);
valid_0 = winedataset_0(split_tr_0+1:split_valid_0,:);
valid_1 = winedataset_1(split_tr_1+1:split_valid_1,:);
valid_set = vertcat(valid_0, valid_1);
valid_set = valid_set(randperm(length(valid_set)),:);
%test
test_0 = winedataset_0(split_valid_0+1:end,:);
test_1 = winedataset_1(split_valid_1+1:end,:);
test_set = vertcat(test_0, test_1);
test_set = test_set(randperm(length(test_set)),:);

%Split into X and y
X_train = train_set(:,1:12);
y_train = train_set(:,13);
X_valid = valid_set(:,1:12);
y_valid = valid_set(:,13);
X_test = test_set(:,1:12);
y_test = test_set(:,13);

相关内容

最新更新