主要内容

本页采用了机器翻译。点击此处可查看英文原文。

splitlabels

查找用于根据指定比例拆分标签的索引

说明

当您处理机器学习或深度学习分类问题时,若希望将数据集划分为训练集、测试集和验证集,且各集中的标签值比例保持一致,请使用此函数。

idxs = splitlabels(lblsrc,p) 会根据 p 中指定的比例或标签数量,查找将 lblsrc 中的标签进行分割的逻辑索引。

示例

idxs = splitlabels(lblsrc,p,'randomized') 将指定比例的标签值随机分配给 idxs 中的每个索引集。

示例

idxs = splitlabels(___,Name,Value) 使用名称-值参量指定额外的输入参量。例如,'UnderlyingDatastoreIndex',3 仅在组合数据存储的第三个底层数据存储中对标签进行拆分。

示例

示例

全部折叠

使用 fileread 函数阅读威廉·莎士比亚的十四行诗。从文本中提取所有元音,并将它们转换为小写。

sonnets = fileread("sonnets.txt");
vowels = lower(sonnets(regexp(sonnets,"[AEIOUaeiou]")))';

统计每个元音出现的次数。

cnts = countlabels(vowels)
cnts=5×3 table
    Label    Count    Percent
    _____    _____    _______

      a      4940     18.368 
      e      9028     33.569 
      i      4895     18.201 
      o      5710     21.232 
      u      2321     8.6302 

将元音分为三个子集:训练集(每个元音包含 500 个样本)、验证集(每个元音包含 300 个样本)以及测试集(剩余样本)。在前两组中,所有元音的权重均等,但在第三组中则并非如此。

spltn = splitlabels(vowels,[500 300]);

for kj = 1:length(spltn)
    cntsn{kj} = countlabels(vowels(spltn{kj}));
end
cntsn{:}
ans=5×3 table
    Label    Count    Percent
    _____    _____    _______

      a       500       20   
      e       500       20   
      i       500       20   
      o       500       20   
      u       500       20   

ans=5×3 table
    Label    Count    Percent
    _____    _____    _______

      a       300       20   
      e       300       20   
      i       300       20   
      o       300       20   
      u       300       20   

ans=5×3 table
    Label    Count    Percent
    _____    _____    _______

      a      4140     18.083 
      e      8228      35.94 
      i      4095     17.887 
      o      4910     21.447 
      u      1521     6.6437 

将元音数据划分为三部分:包含 50% 样本的训练集、包含另外 30% 样本的验证集,以及包含剩余样本的测试集。在所有三个集合中,所有元音的权重均相同。

spltp = splitlabels(vowels,[0.5 0.3]);

for kj = 1:length(spltp)
    cntsp{kj} = countlabels(vowels(spltp{kj}));
end
cntsp{:}
ans=5×3 table
    Label    Count    Percent
    _____    _____    _______

      a      2470     18.367 
      e      4514     33.566 
      i      2448     18.203 
      o      2855      21.23 
      u      1161     8.6333 

ans=5×3 table
    Label    Count    Percent
    _____    _____    _______

      a      1482     18.371 
      e      2708     33.569 
      i      1468     18.198 
      o      1713     21.235 
      u       696     8.6277 

ans=5×3 table
    Label    Count    Percent
    _____    _____    _______

      a       988     18.368 
      e      1806     33.575 
      i       979       18.2 
      o      1142     21.231 
      u       464     8.6261 

使用 fileread 函数阅读威廉·莎士比亚的十四行诗。从文本中删除所有非字母字符,并将文本转换为小写。

sonnets = fileread("sonnets.txt");
letters = lower(sonnets(regexp(sonnets,"[A-z]")))';

将这些字母分为辅音和元音两类,并根据结果制作一张表格。显示该表的前几行。

type = repmat("consonant",size(letters));
type(regexp(letters',"[aeiou]")) = "vowel";

T = table(letters,type,'VariableNames',["Letter" "Type"]);
head(T)
    Letter       Type    
    ______    ___________

      t       "consonant"
      h       "consonant"
      e       "vowel"    
      s       "consonant"
      o       "vowel"    
      n       "consonant"
      n       "consonant"
      e       "vowel"    

显示每个类别的实例数量。

cnt = countlabels(T,'TableVariable',"Type")
cnt=2×3 table
      Type       Count    Percent
    _________    _____    _______

    consonant    46516    63.365 
    vowel        26894    36.635 

将该表分为两组,一组包含 60% 的辅音和元音,另一组包含 40%。显示每个类别的实例数量。

splt = splitlabels(T,0.6,'TableVariable',"Type");

sixty = countlabels(T(splt{1},:),'TableVariable',"Type")
sixty=2×3 table
      Type       Count    Percent
    _________    _____    _______

    consonant    27910    63.366 
    vowel        16136    36.634 

forty = countlabels(T(splt{2},:),'TableVariable',"Type")
forty=2×3 table
      Type       Count    Percent
    _________    _____    _______

    consonant    18606    63.363 
    vowel        10758    36.637 

将表格分为两组,一组包含每个特定字母的 60%,另一组包含 40%。请排除字母 y,它有时作为辅音,有时作为元音。显示每个类别的实例数量。

splt = splitlabels(T,0.6,'Exclude',"y");

sixti = countlabels(T(splt{1},:),'TableVariable',"Type")
sixti=2×3 table
      Type       Count    Percent
    _________    _____    _______

    consonant    26719    62.346 
    vowel        16137    37.654 

forti = countlabels(T(splt{2},:),'TableVariable',"Type")
forti=2×3 table
      Type       Count    Percent
    _________    _____    _______

    consonant    17813    62.349 
    vowel        10757    37.651 

将表格分成两组,每组大小相同。仅包含字母 es。将这些集合打乱顺序。

halves = splitlabels(T,0.5,'randomized','Include',["e" "s"]);

cnt = countlabels(T(halves{1},:))
cnt=2×3 table
    Letter    Count    Percent
    ______    _____    _______

      e       4514     64.385 
      s       2497     35.615 

创建一个由 100 个高斯随机数组成的数据集。将其中 40 个数值标记为 A,30 个标记为 B,另外 30 个标记为 C。将数据存储在一个包含两个数据存储的组合数据存储中。第一个数据存储中包含数据,第二个数据存储中包含标签。

dsData = arrayDatastore(randn(100,1));
dsLabels = arrayDatastore([repmat("A",40,1); ...
            repmat("B",30,1); repmat("C",30,1)]);
dsDataset = combine(dsData,dsLabels);
cnt = countlabels(dsDataset,UnderlyingDatastoreIndex=2)
cnt=3×3 table
    Label    Count    Percent
    _____    _____    _______

      A       40        40   
      B       30        30   
      C       30        30   

将数据集分成两部分,其中一部分包含 60% 的数值,另一部分包含剩余的数值。

splitIndices = splitlabels(dsDataset,0.6,UnderlyingDatastoreIndex=2);

dsDataset1 = subset(dsDataset,splitIndices{1});
cnt1 = countlabels(dsDataset1,UnderlyingDatastoreIndex=2)
cnt1=3×3 table
    Label    Count    Percent
    _____    _____    _______

      A       24        40   
      B       18        30   
      C       18        30   

dsDataset2 = subset(dsDataset,splitIndices{2});
cnt2 = countlabels(dsDataset2,UnderlyingDatastoreIndex=2)
cnt2=3×3 table
    Label    Count    Percent
    _____    _____    _______

      A       16        40   
      B       12        30   
      C       12        30   

输入参数

全部折叠

输入标签来源,请从以下选项中选择其一:

  • 一个分类向量。

  • 字符串向量或字符向量元胞数组。

  • 一个数值向量或由数值标量组成的元胞数组。

  • 一个逻辑向量或由逻辑标量组成的元胞数组。

  • 一个包含上述任一数据类型的变量的表。

  • 一个数据存储,其 readall 函数返回上述任一数据类型。

  • 一个 CombinedDatastore 对象,其包含一个底层数据存储,该数据存储的 readall 函数返回上述任一数据类型。在这种情况下,您必须指定包含标签值的基礎数据存储的索引。

lblsrc 必须包含可转换为具有离散类别集的向量的标签。

示例: lblsrc = categorical(["B" "C" "A" "E" "B" "A" "A" "B" "C" "A"],["A" "B" "C" "D"]) 将标签源定义为一个包含十个样本的分类向量,共有四个类别:ABCD

示例: lblsrc = [0 7 2 5 11 17 15 7 7 11] 将标签源创建为一个包含十个样本的数值向量。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | table | cell | categorical

标签的比例或数量,指定为整数标量、取值范围在 (0, 1) 之间的标量、整数向量或分数向量。

  • 如果 p 是标量,则 splitlabels 会找到两个拆分索引集,并在 idxs 中返回一个包含两个元素的元胞数组。

    • 如果 p 是一个整数,那么 idxs 的第一个元素包含一个索引向量,该向量指向每个标签类别的前 p 个值。idxs 的第二个元素包含指向每个标签类别中剩余值的索引。

    • 如果 p 是 (0, 1) 范围内的一个值,且 lblsrc 在第 i 个类别中有 Ki 个元素,那么 idxs 的第一个元素包含一个索引向量,该向量指向每个标签类别中前 p × Ki 个值的索引。idxs 的第二个元素包含每个标签类别中其余值的索引。

  • 如果 p 是一个包含 N 个形式为 p1, p2, …, pN 的元素的向量,则 splitlabels 会查找 N + 1 个拆分索引集,并在 idxs 中返回一个包含 (N + 1) 个元素的元胞数组。

    • 如果 p 是一个整数向量,那么 idxs 的第一个元素是一个索引向量,指向每个标签类别的前 p1 个值;idxs 的下一个元素包含每个标签类别的接下来的 p2 个值,以此类推。idxs 中的最后一个元素包含每个标签类别的剩余索引。

    • 如果 p 是一个分数向量,且 lblsrc 包含 Ki 个属于第 i 类别的元素,那么 idxs 的第一个元素是一个索引向量,它将每个类别的前 p1 × Ki 个值拼接在一起,idxs 的下一个元素包含每个标签类别的接下来 p2 × Ki 个值,以此类推。idxs 中的最后一个元素包含每个标签类别的剩余索引。

注意

  • 如果 p 包含分数,则其各元素之和不得大于一。

  • 如果 p 包含若干个标签值,则其各元素之和不得大于任何一个标签类别中可用的最小标签数。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: 'TableVariable',"AreaCode",'Exclude',["617" "508"] 指定该函数应根据电话区号对标签进行划分,并排除来自波士顿和纳蒂克的号码。

要包含在索引集中标签,指定为标签类别的向量或元胞数组。使用此参量指定的类别必须与 lblsrc 中的标签属于同一类型。向量或元胞数组中的每个类别都必须与 lblsrc 中的某个标签类别相匹配。

要从索引集 中排除的标签,指定为标签类别的向量或元胞数组。使用此参量指定的类别必须与 lblsrc 中的标签属于同一类型。向量或元胞数组中的每个类别都必须与 lblsrc 中的某个标签类别相匹配。

要读取的表变量,指定为字符向量或字符串标量。如果未指定此参量,则 splitlabels 将使用第一个表变量。

底层数据存储索引,指定为一个整数标量。当 lblsrc 是一个 CombinedDatastore 对象时,此参量成立。splitlabels 统计通过 lblsrcUnderlyingDatastores 属性获取的数据存储中的标签数量。

输出参量

全部折叠

拆分索引,以元胞数组形式返回。

版本历史记录

在 R2021a 中推出

另请参阅

(Signal Processing Toolbox) | (Signal Processing Toolbox) | (Signal Processing Toolbox)