Main Content

splitlabels

指定の比率に従ってラベルを分割するためのインデックスの検索

R2021a 以降

説明

この関数は、機械学習または深層学習の分類問題の作業において、ラベル値の比率を維持したまま、データセットを学習セット、テスト セット、および検証セットに分割する場合に使用します。

idxs = splitlabels(lblsrc,p) は、p で指定されたラベルの比率または数に基づいて、lblsrc 内のラベルを分割する logical インデックスを検索します。

idxs = splitlabels(lblsrc,p,'randomized') は、指定された比率のラベル値を idxs に設定された各インデックスにランダムに割り当てます。

idxs = splitlabels(___,Name,Value) は、名前と値のペアを使用して追加の入力引数を指定します。たとえば、'UnderlyingDatastoreIndex',3 は、統合されたデータストアのうち、基となる 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 インスタンスが検証セット、残りがテスト セットとなるように母音を分割します。最初の 2 つのセットではすべての母音が同じ重みで表されますが、3 番目のセットではそうなりません。

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% のインスタンスが検証セット、残りがテスト セットとなるように母音を分割します。すべての母音が 3 つのセット全体で同じ重みで表されます。

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 

テーブルを 2 つのセットに分割します。子音と母音について、一方が 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 

テーブルを 2 つのセットに分割します。特定の各文字について、一方が 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 

テーブルを同じサイズの 2 つのセットに分割します。"e""s" の文字のみを含めます。セットをランダム化します。

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 のラベルを付けます。2 つのデータストアを含む統合されたデータストアにデータを保存します。最初のデータストアにはデータがあり、2 番目のデータストアにはラベルが格納されています。

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   

データ セットを 2 つのセットに分割します。一方が数字の 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   

入力引数

すべて折りたたむ

入力ラベル ソース。次のいずれかの値として指定します。

  • categorical ベクトル。

  • string ベクトル、または文字ベクトルの cell 配列。

  • 数値ベクトル、または数値スカラーの cell 配列。

  • logical ベクトル、または logical スカラーの cell 配列。

  • 前述のデータ型のいずれかを含む変数が格納された table。

  • 関数 readall によって前述のいずれかのデータ型で返されるデータストア。

  • 関数 readall によって前述のいずれかのデータ型で返される基のデータストアが格納された CombinedDatastore オブジェクト。この場合、ラベル値をもつ基となるデータストアのインデックスを指定しなければなりません。

lblsrc には、カテゴリの離散集合をもつベクトルに変換できるラベルを格納しなければなりません。

例: lblsrc = categorical(["B" "C" "A" "E" "B" "A" "A" "B" "C" "A"],["A" "B" "C" "D"]) は、ラベル ソースを、ABC、および D の 4 つのカテゴリをもつ 10 個のサンプルの categorical ベクトルとして作成します。

例: lblsrc = [0 7 2 5 11 17 15 7 7 11] は、ラベル ソースを 10 個のサンプルの数値ベクトルとして作成します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | table | cell | categorical

ラベルの比率またはラベルの数。整数スカラー、(0, 1) の範囲のスカラー、整数のベクトル、または分数のベクトルとして指定します。

  • p がスカラーの場合、splitlabels は 2 つの分割インデックス セットを求め、idxs で 2 要素の cell 配列を返します。

    • p が整数の場合、idxs の最初の要素には、各ラベル カテゴリの最初の p 個の値を指すインデックスのベクトルが格納されます。idxs の 2 番目の要素には、各ラベル カテゴリの残りの値を指すインデックスが格納されます。

    • p が (0, 1) の範囲の値であり、lblsrc の i 番目のカテゴリに Ki 個の要素がある場合、idxs の最初の要素には、各ラベル カテゴリの最初の p × Ki 個の値を指すインデックスのベクトルが格納されます。idxs の 2 番目の要素には、各ラベル カテゴリの残りの値のインデックスが格納されます。

  • pp1, p2, …, pN の形式の N 個の要素をもつベクトルの場合、splitlabelsN + 1 個の分割インデックス セットを求め、idxs 内の (N + 1) 個の要素の cell 配列を返します。

    • p が整数のベクトルである場合、idxs の最初の要素は各ラベル カテゴリの最初の p1 個の値を指すインデックスのベクトルであり、idxs の次の要素には各ラベル カテゴリの次の p2 個の値が格納され、以降も同様になります。idxs の最後の要素には、各ラベル カテゴリの残りのインデックスが格納されます。

    • p が分数のベクトルで、lblsrc に i 番目のカテゴリの Ki 個の要素がある場合、idxs の最初の要素は各カテゴリの最初の p1 × Ki 個の値を連結するインデックスのベクトルであり、idxs の次の要素には各ラベル カテゴリの次の p2 × Ki 個の値が格納され、以降も同様になります。idxs の最後の要素には、各ラベル カテゴリの残りのインデックスが格納されます。

メモ

  • p が分数を含む場合、その要素の合計が 1 を超えてはなりません。

  • p がラベル値の数を含む場合、その要素の合計は、いずれかのラベル カテゴリで使用可能なラベルの最小数を超えてはなりません。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: 'TableVariable',"AreaCode",'Exclude',["617" "508"] は、電話の市外局番に基づいてラベルを分割し、ボストンとネイティックの番号を除外することを関数に指定します。

インデックス セットに含めるラベル。ラベル カテゴリのベクトルまたはラベル カテゴリの cell 配列として指定します。この引数で指定するカテゴリは、lblsrc のラベルと型が同じでなければなりません。ベクトルまたは cell 配列の各カテゴリは、lblsrc のラベル カテゴリの 1 つと一致しなければなりません。

インデックス セットから除外するラベル。ラベル カテゴリのベクトルまたはラベル カテゴリの cell 配列として指定します。この引数で指定するカテゴリは、lblsrc のラベルと型が同じでなければなりません。ベクトルまたは cell 配列の各カテゴリは、lblsrc のラベル カテゴリの 1 つと一致しなければなりません。

読み取る table 変数。文字ベクトルまたは string スカラーとして指定します。この引数が指定されていない場合、splitlabels は最初の table 変数を使用します。

基となるデータストア インデックス。整数スカラーとして指定します。この引数は、lblsrcCombinedDatastore オブジェクトの場合に適用されます。splitlabels は、lblsrcUnderlyingDatastores プロパティを使用して、取得したデータストア内のラベルをカウントします。

出力引数

すべて折りたたむ

分割インデックス。cell 配列として返されます。

バージョン履歴

R2021a で導入

参考

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