ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

cvpartition

クラス: cvpartition

データの交差検証分割の作成

説明

c = cvpartition(n,'KFold',k) は、無作為な非層化分割を n 個の観測値に対する k 分割交差検証について定義する、cvpartition クラスのオブジェクト c を構築します。観測値は k 個の独立した副標本 (または "分割") に分割されます。副標本は無作為に選択され、ほぼ等しいサイズになります。k の既定値は 10 です。

c = cvpartition(n,'HoldOut',p) は、n 個の観測値に対するホールドアウト検証について、無作為な非層化分割を作成します。観測値は学習セットとテスト (または "ホールドアウト") セットに分割されます。パラメーター p はスカラー値でなければなりません。0 < p < 1 の場合、cvpartition は検定データとして約 p*n 個の観測を無作為に選択します。p が整数の場合、cvpartition は検定データとして p 個の観測を無作為に選択します。p の既定値は 1/10 です。

c = cvpartition(group,'KFold',k) は、層化 k 分割交差検証用の無作為分割を作成します。group は、各観測値のクラスを示す数値ベクトル、categorical 配列、string 配列、文字配列、または文字ベクトルの cell 配列です。各副標本は、サイズがほぼ等しく、クラスの比率が group とほぼ同じになります。

cvpartition の最初の入力引数として group を指定した場合、group 内の欠損値に対応する観測値の行が含まれない交差検証分割が作成されます。

c = cvpartition(group,'KFold',k,'Stratify',stratifyOption) は、k 分割交差検証用の無作為な分割を定義するオブジェクト c を返します。cvpartition の最初の入力引数として group を指定した場合、既定で階層化されます。'Stratify',false も指定した場合、無作為な非層化分割が作成されます。

'Stratify',true を指定できるのは、cvpartition に対する 1 番目の入力引数が group である場合だけです。

c = cvpartition(group,'HoldOut',p) は、group のクラス情報を使用して観測値を階層的に学習セットとホールドアウト (テスト) セットに無作為に分割します。学習セットとテスト セットはどちらも、クラスの比率が group とほぼ同じになります。

c = cvpartition(group,'HoldOut',p,'Stratify',stratifyOption) は、学習セットとホールドアウト (またはテスト) セットへの無作為な分割を定義するオブジェクト c を返します。cvpartition の最初の入力引数として group を指定した場合、既定で階層化されます。'Stratify',false も指定した場合、無作為な非層化分割が作成されます。

c = cvpartition(n,'LeaveOut') は、n 個の観測値に対する leave-one-out 交差検証について無作為な分割を作成します。Leave-one-out 法は 'KFold' の特別なケースであり、分割数が観測値の個数と等しくなります。

c = cvpartition(n,'resubstitution') は、データを分割しないオブジェクト c を作成します。学習セットと検定データのどちらも元の n 個の観測をすべて含みます。

すべて展開する

層化 10 分割交差検証を使って誤分類率を計算します。

フィッシャーのアヤメのデータセットを読み込みます。

load fisheriris;
y = species;
X = meas;

層化 10 分割交差検証用の無作為分割を作成します。

c = cvpartition(y,'KFold',10);

誤分類された検定標本の個数を計算する関数を作成します。

fun = @(xTrain,yTrain,xTest,yTest)(sum(~strcmp(yTest,...
    classify(xTest,xTrain,yTrain)))); 

交差検証を使用して、推定された誤分類率を取得します。

rate = sum(crossval(fun,X,y,'partition',c))...
           /sum(c.TestSize)
rate = 0.0200

5 分割された非層化 fisheriris データにおける各クラスの比率を求めます。

フィッシャーのアヤメのデータセットを読み込みます。

load fisheriris;

データ内の各クラスのインスタンス数を求めます。

[C,~,idx] = unique(species);
C % Unique classes
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

n = accumarray(idx(:),1) % Number of instances for each class in species
n = 3×1

    50
    50
    50

3 つのクラスは同じ比率になっています。

階層の無い 5 つの部分に無作為に分割します。

cv = cvpartition(species,'KFold',5,'Stratify',false) 
cv = 
K-fold cross validation partition
   NumObservations: 150
       NumTestSets: 5
         TrainSize: 120  120  120  120  120
          TestSize: 30  30  30  30  30

データセットの各分割について 3 つのクラスの比率が同じではないことを示します。

for i = 1:cv.NumTestSets
    disp(['Fold ',num2str(i)])
    testClasses = species(cv.test(i));
    [C,~,idx] = unique(testClasses);
    C % Unique classes
    nCount = accumarray(idx(:),1) % Number of instances for each class in a fold
end
Fold 1
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

     8
    13
     9

Fold 2
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    10
    11
     9

Fold 3
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    10
     8
    12

Fold 4
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    12
     8
    10

Fold 5
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    10
    10
    10

cvfisheriris データの無作為な、非層化分割なので、5 つの分割のそれぞれにおけるクラス比率が species のクラス比率と等しくなることは保証されません。つまり、species では同じでしたが、この場合は各分割におけるクラスの比率が異なります。交差検証の結果には無作為性があるので、分割における各クラスのインスタンス数はここに示されているものと異なる可能性があります。

tall 配列の層化ホールドアウト セットと非層化ホールドアウト セットとで、各クラスのインスタンス数を比較します。

クラス 1 とクラス 2 の比率が 1:10 になるように、2 つのクラスの数値ベクトルを作成します。

group = [ones(20,1);2*ones(200,1)]
group = 220×1

     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
      ⋮

group から tall 配列を作成します。

tgroup = tall(group)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 4).

tgroup =

  220x1 tall double column vector

     1
     1
     1
     1
     1
     1
     1
     1
     :
     :

tall 配列がサポートされている cvpartition のオプションは Holdout だけです。非層化ホールドアウト分割を無作為に作成します。

CV0 = cvpartition(tgroup,'Holdout',1/4,'Stratify',false)  
CV0 = 
Hold-out cross validation partition
   NumObservations: [1x1 tall]
       NumTestSets: 1
         TrainSize: [1x1 tall]
          TestSize: [1x1 tall]

関数 gather を使用して、CV0.test の結果をメモリに取得します。

testIdx0 = gather(CV0.test);
Evaluating tall expression using the Parallel Pool 'local':
Evaluation completed in 0.35 sec

ホールドアウト セットにおける各クラスの発生数を求めます。

accumarray(group(testIdx0),1) % Number of instances for each class in the holdout set
ans = 2×1

     5
    50

cvpartition の結果には無作為性があるので、各クラスのインスタンス数はここに示されているものと異なる可能性があります。

CV0 は階層化されない分割なので、ホールドアウト セットにおけるクラス 1 とクラス 2tgroup と同じ比率になるという保証はありません。ただし、cvpartition には無作為性があるので、'Stratify',false を指定した場合でも、ホールドアウト セットにおけるクラスの比率が tgroup と同じになることがあります。同様の結果を学習セットについて示すことができます。

CV0.training の結果をメモリに取得します。

trainIdx0 = gather(CV0.training);
Evaluating tall expression using the Parallel Pool 'local':
Evaluation completed in 0.066 sec

学習セットにおける各クラスの発生数を求めます。

accumarray(group(trainIdx0),1) % Number of instances for each class in the training set
ans = 2×1

    15
   150

非層化学習セットにおけるクラスが tgroup と同じ比率になるという保証はありません。

層化ホールドアウト分割を無作為に作成します。

CV1 = cvpartition(tgroup,'Holdout',1/4)  
CV1 = 
Hold-out cross validation partition
   NumObservations: [1x1 tall]
       NumTestSets: 1
         TrainSize: [1x1 tall]
          TestSize: [1x1 tall]

CV1.test の結果をメモリに取得します。

testIdx1 = gather(CV1.test);
Evaluating tall expression using the Parallel Pool 'local':
Evaluation completed in 0.084 sec

ホールドアウト セットにおける各クラスの発生数を求めます。

accumarray(group(testIdx1),1) % Number of instances for each class in the holdout set
ans = 2×1

     5
    50

層化ホールドアウト分割の場合は、ホールドアウト セットと tgroup でクラスの比率が同じ (1:10) になります。

アルゴリズム

  • cvpartition の最初の入力引数として group を指定した場合、group 内の欠損値に対応する観測値の行が含まれない交差検証分割が作成されます。

  • cvpartition の最初の入力引数として group を指定した場合、既定で階層化されます。'Stratify',false を指定すると、無作為な非層化分割を作成できます。

  • 'Stratify',true を指定できるのは、cvpartition に対する 1 番目の入力引数が group である場合だけです。

拡張機能

R2008a で導入