首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab分裂成列车/有效/测试集并保持比例

Matlab分裂成列车/有效/测试集并保持比例
EN

Stack Overflow用户
提问于 2016-04-17 09:10:48
回答 2查看 1.5K关注 0票数 1

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

数据集是相当少样本(95%的类别0到5%的类别1),所以我需要保持目标的比率在每个样本。

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

我正在使用子集葡萄酒质量数据这里

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-17 14:17:33

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

来自matlab关于cvpartition -的帮助:

C=cv分区( group,'HoldOut',p)使用组中的类信息,将观察随机地划分为一个训练集和一个具有分层的测试集;也就是说,训练和测试集的类比例与组中大致相同。

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

票数 2
EN

Stack Overflow用户

发布于 2016-04-17 10:51:15

到目前为止,我想出了这个问题,如果有人知道更好的解决方案,请告诉我。我将我的数据集按目标列拆分,然后将这两个拆分进一步拆分为前70%、接下来的20%和最后10%的数据,然后合并到一起。之后,我分裂了特征和目标。

代码语言:javascript
复制
%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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36674651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档