ドキュメンテーション

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

testckfold

相互検定の反復により 2 つの分類モデルの精度を比較

説明

testckfold は、反復的に 2 つの分類モデルの交差検証を行うことにより 2 つのモデルの精度を評価し、分類損失の差を求め、分類損失の差を結合して検定統計量を計算します。このタイプの検定は、標本サイズが制限されている場合に特に適しています。

複数の分類モデルの精度が異なるかどうかや、ある分類モデルの性能が別のモデルより優れているかどうかを評価できます。実行できる検定には、5 x 2 のペア t 検定、5 x 2 のペア F 検定、10 x 10 の反復交差 t 検定があります。詳細は、反復交差検証を参照してください。計算を高速化するため、testckfold は並列計算をサポートしています (Parallel Computing Toolbox™ のライセンスが必要)。

h = testckfold(C1,C2,X1,X2) は、5 x 2 のペア F 交差検証を実施することにより得られた検定の判定を返します。帰無仮説は、「テーブル X1 および X2 内の予測子および応答データを使用する真のクラス ラベルの予測において、分類モデル C1 および C2 の精度は等しい」です。h = 1 の場合、帰無仮説は 5% の有意水準で棄却されます。

testckfold は、C1 および C2 をそれぞれ X1 および X2 内のすべての予測子変数に適用することにより交差検証を実施します。X1 および X2 内の真のクラス ラベルは同じでなければなりません。X1X2C1.ResponseName および C2.ResponseName 内の応答変数名は同じでなければなりません。

モデルを比較する方法の例については、ヒントを参照してください。

h = testckfold(C1,C2,X1,X2,Y) は、完全な分類モデルまたは分類テンプレート C1 および C2をそれぞれテーブル データまたは行列データ X1 および X2 内のすべての予測子変数に適用します。Y は、真のクラス ラベルに対応するテーブル変数の名前、または真のクラス ラベルの配列です。

h = testckfold(___,Name,Value) は、前の構文の入力引数のいずれかと、1 つ以上の Name,Value ペア引数で指定された追加オプションを使用します。たとえば、対立仮説のタイプ、検定のタイプ、並列計算の使用を指定できます。

[h,p,e1,e2] = testckfold(___) は、仮説検定の p 値 (p) と、各交差検証の実行および分割に対する分類損失 (e1 および e2) も返します。

すべて折りたたむ

fitctree の既定設定では、網羅的探索を使用して、各ノードで分割に最適な予測子が選択されます。また、曲率検定を実施すると、応答が独立していないと考えられる予測子を分割することもできます。この例では、網羅的探索による最適分割によって成長させた分類木と、交互作用がある曲率検定の実施により成長させた分類木とを統計的に比較します。

census1994 データセットを読み込みます。

load census1994.mat
rng(1) % For reproducibility

学習セットのテーブル adultdata を使用して、既定の分類木を成長させます。応答変数名は 'salary' です。

C1 = fitctree(adultdata,'salary')
C1 = 
  ClassificationTree
           PredictorNames: {1x14 cell}
             ResponseName: 'salary'
    CategoricalPredictors: [2 4 6 7 8 9 10 14]
               ClassNames: [<=50K    >50K]
           ScoreTransform: 'none'
          NumObservations: 32561


  Properties, Methods

C1 は完全な ClassificationTree モデルです。このモデルの ResponseName プロパティは 'salary' です。C1 は、網羅的探索を使用し、最大の分割ゲインに基づいて分割に最適な予測子を求めます。

同じデータセットを使用して、別の分類木を成長させます。この分類木では、交互作用がある曲率検定を使用して分割に最適な予測子を求めるよう指定します。

C2 = fitctree(adultdata,'salary','PredictorSelection','interaction-curvature')
C2 = 
  ClassificationTree
           PredictorNames: {1x14 cell}
             ResponseName: 'salary'
    CategoricalPredictors: [2 4 6 7 8 9 10 14]
               ClassNames: [<=50K    >50K]
           ScoreTransform: 'none'
          NumObservations: 32561


  Properties, Methods

C2 も、ResponseName'salary' に等しい完全な ClassificationTree モデルです。

5 x 2 のペア F 検定を実施して、学習セットを使用した場合の 2 つのモデルの精度を比較します。データセット内の応答変数名と ResponseName プロパティの応答変数名はすべて等しく、両方のセットの応答データが等しいので、応答データの指定を省略できます。

h = testckfold(C1,C2,adultdata,adultdata)
h = logical
   0

h = 0 なので、C1C2 は精度が等しいという帰無仮説を 5% の水準で棄却することはできません。

5 x 2 のペア F 検定を使用して、2 つのモデルの誤分類率を比較する統計検定を実行します。

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

load fisheriris;

既定のオプションを使用して、単純ベイズ テンプレートと分類木テンプレートを作成します。

C1 = templateNaiveBayes;
C2 = templateTree;

C1C2 は、それぞれ単純ベイズ アルゴリズムと分類木アルゴリズムに対応するテンプレート オブジェクトです。

2 つのモデルの予測精度が同じであるかどうかを検定します。各モデルに同じ予測子データを使用します。既定では testckfold は 5 x 2 の両側ペア F 検定を実行します。

rng(1); % For reproducibility
h = testckfold(C1,C2,meas,meas,species)
h = logical
   0

h = 0 なので、2 つのモデルの予測精度が等しいという帰無仮説は棄却できません。

10 x 10 の反復交差 t 検定を使用して、単純なモデルの精度が複雑なモデルより高いかどうかを評価する統計検定を実行します。

フィッシャーのアヤメのデータセットを読み込みます。setosa 種のアヤメを誤分類する場合、virginica 種のアヤメを versicolor 種として誤分類するコストの 2 倍をペナルティとするように、コスト行列を作成します。

load fisheriris;
tabulate(species)
       Value    Count   Percent
      setosa       50     33.33%
  versicolor       50     33.33%
   virginica       50     33.33%
Cost = [0 2 2;2 0 1;2 1 0];
ClassNames  = {'setosa' 'versicolor' 'virginica'};...
    % Specifies the order of the rows and columns in Cost

各クラスの経験的分布は一様で、分類コストはわずかに不均衡です。

2 つの ECOC テンプレートを作成します。一方のテンプレートでは線形 SVM バイナリ学習器を、もう一方のテンプレートでは RBF カーネルがある SVM バイナリ学習器を使用します。

tSVMLinear = templateSVM('Standardize',true); % Linear SVM by default
tSVMRBF = templateSVM('KernelFunction','RBF','Standardize',true);
C1 = templateECOC('Learners',tSVMLinear);
C2 = templateECOC('Learners',tSVMRBF);

C1C2 は ECOC テンプレート オブジェクトです。C1 は線形 SVM 用に、C2 は RBF カーネル学習がある SVM 用に準備されています。

分類コストに関して、単純なモデル (C1) の精度は複雑なモデル (C2) より高くないという帰無仮説を検定します。10 x 10 の反復交差検証を実行します。p 値と誤分類コストを返すように指定します。

rng(1); % For reproducibility
[h,p,e1,e2] = testckfold(C1,C2,meas,meas,species,...
    'Alternative','greater','Test','10x10t','Cost',Cost,...
    'ClassNames',ClassNames)
h = logical
   0

p = 0.1077
e1 = 10×10

         0         0         0    0.0667         0    0.0667    0.1333         0    0.1333         0
    0.0667    0.0667         0         0         0         0    0.0667         0    0.0667    0.0667
         0         0         0         0         0    0.0667    0.0667    0.0667    0.0667    0.0667
    0.0667    0.0667         0    0.0667         0    0.0667         0         0    0.0667         0
    0.0667    0.0667    0.0667         0    0.0667    0.0667         0         0         0         0
         0         0    0.1333         0         0    0.0667         0         0    0.0667    0.0667
    0.0667    0.0667         0         0    0.0667         0         0    0.0667         0    0.0667
    0.0667         0    0.0667    0.0667         0    0.1333         0    0.0667         0         0
         0    0.0667    0.1333    0.0667    0.0667         0         0         0         0         0
         0    0.0667    0.0667    0.0667    0.0667         0         0    0.0667         0         0

e2 = 10×10

         0         0         0    0.1333         0    0.0667    0.1333         0    0.2667         0
    0.0667    0.0667         0    0.1333         0         0         0    0.1333    0.1333    0.0667
    0.1333    0.1333         0         0         0    0.0667         0    0.0667    0.0667    0.0667
         0    0.1333         0    0.0667    0.1333    0.1333         0         0    0.0667         0
    0.0667    0.0667    0.0667         0    0.0667    0.1333    0.1333         0         0    0.0667
    0.0667         0    0.0667    0.0667         0    0.0667    0.1333         0    0.0667    0.0667
    0.2000    0.0667         0         0    0.0667         0         0    0.1333         0    0.0667
    0.2000         0         0    0.1333         0    0.1333         0    0.0667         0         0
         0    0.0667    0.0667    0.0667    0.1333         0    0.2000         0         0         0
    0.0667    0.0667         0    0.0667    0.1333         0         0    0.0667    0.1333    0.0667

p 値は、0.10 よりわずかに大きくなっています。これは、単純なモデルの精度が複雑なモデルと同程度であるという帰無仮説を棄却できないことを意味します。この結果は、最大 0.10 の有意水準 (Alpha) では変化しません。

e1e2 は、誤分類コストが含まれている 10 行 10 列の行列です。行 r は、反復交差検証の r 回目の実行に対応します。列 k は、特定の交差検証の実行におけるテスト セットの分割 k に対応します。たとえば、e2 の要素 (2,4) は 0.1333 です。この値は、交差検証の 2 回目の実行において、テスト セットが分割 4 のときに、テスト セットの推定誤分類コストが 0.1333 であることを意味します。

予測子変数 (特徴量) のサブセットをより大きいセットから選択して、分類モデルの複雑さを減らします。そして、2 つのモデルの精度を統計的に比較します。

ionosphere データセットを読み込みます。

load ionosphere;

AdaBoostM1 とすべての予測子セットを使用して、100 個のブースティングされた分類木があるアンサンブルを学習させます。各予測子について重要度を調べます。

t = templateTree('MaxNumSplits',1); % Weak-learner template tree object
C = fitcensemble(X,Y,'Method','AdaBoostM1','Learners',t);
predImp = predictorImportance(C);

figure;
bar(predImp);
h = gca;
h.XTick = 1:2:h.XLim(2);
title('Predictor Importances');
xlabel('Predictor');
ylabel('Importance measure');

重要度が上位 5 番目までの予測子を識別します。

[~,idxSort] = sort(predImp,'descend');
idx5 = idxSort(1:5);

2 つのモデルの予測精度が同じであるかどうかを検定します。縮小したデータセットを指定してから、完全な予測子データを指定します。計算を高速化するため、並列計算を使用します。

s = RandStream('mlfg6331_64');
Options = statset('UseParallel',true,'Streams',s,'UseSubstreams',true);

[h,p,e1,e2] = testckfold(C,C,X(:,idx5),X,Y,'Options',Options)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).
h = logical
   0

p = 0.4161
e1 = 5×2

    0.0686    0.0795
    0.0800    0.0625
    0.0914    0.0568
    0.0400    0.0739
    0.0914    0.0966

e2 = 5×2

    0.0914    0.0625
    0.1257    0.0682
    0.0971    0.0625
    0.0800    0.0909
    0.0914    0.1193

testckfold では学習済みの分類モデルをテンプレートとして扱うので、C の近似パラメーターはすべて無視されます。つまり、testckfold は、指定されたオプションと予測子データのみを使用して分割外の分類損失を推定することにより C の交差検証を実行します。

h = 0 なので、2 つのモデルの予測精度が等しいという帰無仮説は棄却できません。この結果から、単純なアンサンブルの方が有利であることがわかります。

入力引数

すべて折りたたむ

分類モデル テンプレートまたは学習済みの分類モデル。次の表で説明されている分類モデル テンプレート オブジェクトまたは学習済みの分類モデル オブジェクトのいずれかを指定します。

テンプレート タイプ生成元
分類木templateTree
判別分析templateDiscriminant
アンサンブル (ブースティング、バギングおよびランダム部分空間)templateEnsemble
誤り訂正出力符号 (ECOC) マルチクラス分類モデルtemplateECOC
kNNtemplateKNN
単純ベイズtemplateNaiveBayes
サポート ベクター マシン (SVM)templateSVM
学習済みモデルのタイプモデル オブジェクト生成元
分類木ClassificationTreefitctree
判別分析ClassificationDiscriminantfitcdiscr
バギングされた分類モデルのアンサンブルClassificationBaggedEnsemblefitcensemble
分類モデルのアンサンブルClassificationEnsemblefitcensemble
ECOC モデルClassificationECOCfitcecoc
kNNClassificationKNNfitcknn
単純ベイズClassificationNaiveBayesfitcnb
SVMClassificationSVMfitcsvm

効率を向上させるには、学習済みの分類モデル オブジェクトではなく分類モデル テンプレート オブジェクトを指定します。

分類モデル テンプレートまたは学習済みの分類モデル。次の表で説明されている分類モデル テンプレート オブジェクトまたは学習済みの分類モデル オブジェクトのいずれかを指定します。

テンプレート タイプ生成元
分類木templateTree
判別分析templateDiscriminant
アンサンブル (ブースティング、バギングおよびランダム部分空間)templateEnsemble
誤り訂正出力符号 (ECOC) マルチクラス分類モデルtemplateECOC
kNNtemplateKNN
単純ベイズtemplateNaiveBayes
サポート ベクター マシン (SVM)templateSVM
学習済みモデルのタイプモデル オブジェクト生成元
分類木ClassificationTreefitctree
判別分析ClassificationDiscriminantfitcdiscr
バギングされた分類モデルのアンサンブルClassificationBaggedEnsemblefitcensemble
分類モデルのアンサンブルClassificationEnsemblefitcensemble
ECOC モデルClassificationECOCfitcecoc
kNNClassificationKNNfitcknn
単純ベイズClassificationNaiveBayesfitcnb
SVMClassificationSVMfitcsvm

効率を向上させるには、学習済みの分類モデル オブジェクトではなく分類モデル テンプレート オブジェクトを指定します。

1 番目の完全な分類モデルまたはテンプレート C1 に適用するために使用するデータ。数値行列またはテーブルを指定します。

X1 の各行は 1 つの観測値に、各列は 1 つの変数に対応します。testckfold は、複数列の変数、および文字ベクトルの cell 配列以外の cell 配列をサポートしません。

X1X2 は同じデータ型でなければならず、X1X2Y には同じ個数の観測値が含まれていなければなりません。

Y に配列を指定した場合、testckfoldX1 のすべての列を独立した予測子変数として扱います。

データ型: double | single | テーブル

2 番目の完全な分類モデルまたはテンプレート C2 に適用するために使用するデータ。数値行列またはテーブルを指定します。

X2 の各行は 1 つの観測値に、各列は 1 つの変数に対応します。testckfold は、複数列の変数、および文字ベクトルの cell 配列以外の cell 配列をサポートしません。

X1X2 は同じデータ型でなければならず、X1X2Y には同じ個数の観測値が含まれていなければなりません。

Y に配列を指定した場合、testckfoldX2 のすべての列を独立した予測子変数として扱います。

データ型: double | single | テーブル

真のクラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、文字ベクトルの cell 配列、文字ベクトル、または string スカラーを指定します。

  • 文字ベクトルまたは string スカラーの場合、X1X2 は table でなければならず、これらの応答変数は名前および値が同じでなければならず、Y は共通する変数名でなければなりません。たとえば、X1.LabelsX2.Labels が応答変数である場合、Y'Labels' であり、X1.LabelsX2.Labels は等価でなければなりません。

  • サポートされている他のすべてのデータ型の場合、Y は真のクラス ラベルの配列です。

    • Y が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

    • X1X2Y は観測値の個数 (行数) が同じでなければなりません。

  • 次の両方が成り立つ場合、Y の指定を省略できます。

    • X1 および X2 が、(値および名前が) 同じ応答変数が含まれているテーブルである。

    • C1 および C2 が完全な分類モデルであり、X1 および X2 内の応答変数名を指定する ResponseName プロパティが含まれている。

    この場合、testckfold はテーブル内の共通する応答変数を使用します。たとえば、テーブル内の応答変数が X1.Labels および X2.Labels であり、C1.ResponseName および C2.ResponseName の値が 'Labels' である場合、Y を指定する必要はありません。

データ型: カテゴリカル | char | string | logical | single | double | cell

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'Alternative','greater','Test','10x10t','Options',statsset('UseParallel',true) は、1 番目の予測クラス ラベルに対する 1 番目のセットの精度が 2 番目のセットより高いかどうかを検定すること、10 x 10 の t 検定を実行すること、および交差検証に並列計算を使用することを指定します。

仮説検定の有意水準。'Alpha' と (0, 1) の範囲にあるスカラー値をコンマで区切って指定します。

例: 'Alpha',0.1

データ型: single | double

評価する対立仮説。'Alternative' と次の表に記載されている値のいずれかをコンマ区切りのペアとして指定します。

対立仮説の説明サポートされる検定
'unequal' (既定の設定)Y を予測する場合、X1C1 を適用して生成された予測と X2C2 を適用して生成された予測では精度が異なる。'5x2F''5x2t' および '10x10t'
'greater'Y を予測する場合、X1C1 を適用して生成された予測は X2C2 を適用して生成された予測より精度が高い。'5x2t' および '10x10t'
'less'Y を予測する場合、X1C1 を適用して生成された予測は X2C2 を適用して生成された予測より精度が低い。'5x2t' および '10x10t'

サポートされる検定についての詳細は、Test を参照してください。

例: 'Alternative','greater'

1 番目のテスト セット予測子データ (X1) におけるカテゴリカル予測子を特定するフラグ。'X1CategoricalPredictors' と次のいずれかをコンマ区切りのペアとして指定します。

  • 1 から p までのインデックスを使用する数値ベクトル。p は、X1 の列数を示します。

  • 長さ p の logical ベクトル。true のエントリは、対応する X1 の列がカテゴリカル変数であることを示します。

  • 'all'、すべての予測子がカテゴリカルであることを示します。

X1CategoricalPredictors の仕様は以下の場合適切です。

  • 少なくとも 1 つの予測子がカテゴリカルであり、C1 が分類木、分類木のアンサンブル、ECOC モデルまたは単純ベイズ分類モデルのいずれかである。

  • すべての予測子がカテゴリカルであり、C1 が kNN 分類モデルである。

他の場合に X1CategoricalPredictors を指定すると、testckfold でエラーがスローされます。たとえば、この関数ではカテゴリカル予測子を使用する SVM 学習器を学習させることはできません。

既定値は [] であり、カテゴリカル予測子がないことを示します。

例: 'X1CategoricalPredictors','all'

データ型: single | double | logical | char | string

2 番目のテスト セット予測子データ (X2) におけるカテゴリカル予測子を特定するフラグ。'X2CategoricalPredictors' と次のいずれかをコンマ区切りのペアとして指定します。

  • 1 から p までのインデックスを使用する数値ベクトル。p は、X2 の列数を示します。

  • 長さ p の logical ベクトル。true のエントリは、対応する X2 の列がカテゴリカル変数であることを示します。

  • 'all'、すべての予測子がカテゴリカルであることを示します。

X2CategoricalPredictors の仕様は以下の場合適切です。

  • 少なくとも 1 つの予測子がカテゴリカルであり、C2 が分類木、分類木のアンサンブル、ECOC モデルまたは単純ベイズ分類モデルのいずれかである。

  • すべての予測子がカテゴリカルであり、C2 が kNN 分類モデルである。

他の場合に X2CategoricalPredictors を指定すると、testckfold でエラーがスローされます。たとえば、この関数ではカテゴリカル予測子を使用する SVM 学習器を学習させることはできません。

既定値は [] であり、カテゴリカル予測子がないことを示します。

例: 'X2CategoricalPredictors','all'

データ型: single | double | logical | char | string

クラス名。'ClassNames' と categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。ClassNamesY のデータ型を使用して設定しなければなりません。

ClassNames が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

ClassNames の使用目的は次のとおりです。

  • クラスの順序に対応する入力引数の次元の順序を指定する。たとえば、Cost の次元の順序を指定するために ClassNames を使用します。

  • 検定用にクラスのサブセットを選択する。たとえば、Y に含まれているすべての異なるクラス名の集合が {'a','b','c'} であるとします。クラス 'a' および 'c' のみの観測値を使用してモデルの学習と検定を行うには、'ClassNames',{'a','c'} を指定します。

既定の設定は、Y に含まれているすべての異なるクラス名の集合です。

例: 'ClassNames',{'b','g'}

データ型: single | double | logical | char | string | cell | カテゴリカル

分類コスト。'Cost' と正方行列または構造体配列をコンマで区切って指定します。

  • 正方行列 Cost を指定する場合、Cost(i,j) は真のクラスが i の点をクラス j に分類するコストです。つまり、行は真のクラスに、列は予測するクラスに対応します。Cost の対応する行および列についてクラスの順序を指定するには、名前と値のペアの引数 ClassNames をさらに指定します。

  • 構造体 S を指定する場合、S には次の 2 つのフィールドが必要です。

    • S.ClassNamesY と同じデータ型の変数としてクラス名を格納します。このフィールドを使用してクラスの順序を指定できます。

    • S.ClassificationCostsS.ClassNames と同じ行および列の順序でコスト行列を格納します。

コストを考慮する検定の場合は testcholdout を使用してください。

分類モデルを学習させるために使用したものと同じコスト行列を渡すことをお勧めします。

既定値は、i ~= j の場合は Cost(i,j) = 1i = j の場合は Cost(i,j) = 0 です。

例: 'Cost',[0 1 2 ; 1 0 2; 2 2 0]

データ型: double | single | 構造体

損失関数。'LossFun''classiferror''binodeviance''exponential''hinge' または関数ハンドルから構成されるコンマ区切りのペアとして指定します。

  • 次の表は、使用可能な損失関数の一覧です。

    損失関数
    'binodeviance'二項分布からの逸脱度
    'classiferror'分類誤差
    'exponential'指数損失
    'hinge'ヒンジ損失

  • 関数ハンドル表記を使用して独自の関数を指定します。

    標本サイズが n = size(X,1) で、K 個の一意なクラスがあるとします。使用する関数ではシグネチャが lossvalue = lossfun(C,S,W,Cost) になっていなければなりません。ここで

    • 出力引数 lossvalue はスカラーです。

    • lossfun は、独自の関数の名前です。

    • CnK 列の logical 行列で、各行は対応する観測値がどのクラスに属するかを示します。列の順序は、名前と値のペアの引数 ClassNames におけるクラスの順序に対応します。

      C を作成するには、各行について観測値 p がクラス q に含まれている場合に C(p,q) = 1 を設定します。行 p の他のすべての要素を 0 に設定します。

    • S は、分類スコアの nK 列の行列です。列の順序は、名前と値のペアの引数 ClassNames におけるクラスの順序に対応します。S は、分類スコアの行列です。

    • W は、観測値の重みの n 行 1 列の数値ベクトルです。W を渡す場合、重みは合計が 1 になるように正規化されます。

    • Cost は、分類損失が含まれている KK 列の数値行列です。たとえば、Cost = ones(K) - eye(K) は正しい分類のコストとして 0 を、誤分類のコストとして 1 を指定します。

    'LossFun',@lossfun を使用して独自の関数を指定します。

並列計算。'Options'statset により返される構造体配列で構成されるコンマ区切りのペアとして指定します。これらのオプションには Parallel Computing Toolbox が必要です。testckfold はフィールド 'Streams''UseParallel' および 'UseSubtreams' を使用します。

次の表は、使用できるオプションの一覧です。

オプション説明
'Streams'

RandStream オブジェクトまたはそのようなオブジェクトの cell 配列。Streams を指定しない場合、既定のストリームが使用されます。Streams を指定する場合、以下が真である場合を除き、単一オブジェクトを使用します。

  • 開いている並列プールがある。

  • UseParalleltrue

  • UseSubstreamsfalse

これらが真の場合は、並列プールと同じサイズの cell 配列を使用します。並列プールが開いていない場合、1 つ (設定に依存) が開かれます。Streams は単一の乱数ストリームを提供しなければなりません。

'UseParallel'Parallel Computing Toolbox を保有している場合、'UseParallel',true を設定してワーカーのプールを呼び出すことができます。
'UseSubstreams'並列計算する場合は true に設定して 'Streams' で指定されたストリームを使用します。既定値は false です。たとえば、Streams'mlfg6331_64' または 'mrg32k3a' といったサブストリームを許可するタイプに設定します。

例: 'Options',statset('UseParallel',true)

データ型: 構造体

各クラスの事前確率。'Prior''empirical''uniform'、数値ベクトルまたは構造体から構成されるコンマ区切りのペアとして指定します。

次の表は、事前確率の設定に使用できるオプションの一覧です。

説明
'empirical'クラスの事前確率は、Y のクラスの相対的頻度です。
'uniform'クラスの事前確率はいずれも 1/K (K はクラス数) となります。
数値ベクトル各要素はクラスの事前確率です。名前と値のペアの引数 ClassNames を使用して順序を指定します。要素は合計が 1 になるように正規化されます。
構造体

構造体 S には 2 つのフィールドがあります。

  • S.ClassNames: Y と同じ型の変数のクラス名が格納されます。

  • S.ClassProbs: 対応する事前確率のベクトルが格納されます。要素は合計が 1 になるように正規化されます。

例: 'Prior',struct('ClassNames',{{'setosa','versicolor'}},'ClassProbs',[1,2])

データ型: char | string | single | double | 構造体

実行する検定。'Test' と次のいずれかのコンマ区切りのペアとして指定します。'5x2F''5x2t''10x10t'

説明サポートされる対立仮説
'5x2F' (既定の設定)5 x 2 のペア F 検定。両側検定のみに適しています。'unequal'
'5x2t'5 x 2 のペア t 検定'unequal''less''greater'
'10x10t'10 x 10 の反復交差 t 検定'unequal''less''greater'

実行可能な検定についての詳細は、反復交差検証を参照してください。サポートされる対立仮説についての詳細は、Alternative を参照してください。

例: 'Test','10x10t'

詳細レベル。'Verbose'01 または 2 をコンマ区切りのペアとして指定します。Verbose は、各交差検証分割の学習時にコマンド ウィンドウに表示される診断情報の量を制御します。

次の表は、使用できる詳細レベル オプションの一覧です。

説明
0診断情報は表示されません。
1新しい交差検証を実行するたびに診断メッセージが表示されます。
2新しい交差検証を実行するときと、特定の分割を学習させるときに診断メッセージが表示されます。

例: 'Verbose',1

データ型: double | single

観測値の重み。'Weights' と数値ベクトルで構成されるコンマ区切りのペアとして指定します。

Weights のサイズは X1 の行数と等しくなければなりません。X の各行の観測値では、Weights の対応する重みを使用して重み付けがされます。

合計が各クラスの事前確率の値と等しくなるように Weights が正規化されます。

データ型: double | single

メモ:

  • testckfold では、学習済みの分類モデルをテンプレートとして扱います。このため、モデル内の近似パラメーターはすべて無視されます。つまり、testckfold では、モデルで指定されたオプションと予測子データのみを使用して交差検証を実行します。

  • 反復交差検証は、帰無仮説において検定統計量が漸近的に正規分布になるという仮定に基づいています。非常に不均衡なコスト行列 (Cost = [0 100;1 0] など) や非常に離散的な応答分布 (つまり、ほとんどの観測値が少数のクラスに含まれている分布) の場合、漸近的な正規性の仮定に違反する可能性があります。コストを考慮する検定の場合は testcholdout を使用してください。

  • NaN<undefined> 値、空の文字ベクトル ('')、空の string ("")、および <missing> 値は、欠損データ値を示します。

    • X1 および X2 に含まれている欠損値の扱いについては、該当する分類モデル学習関数のリファレンス ページ fitctreefitcdiscrfitcensemblefitcecocfitcknnfitcnb、または fitcsvm を参照してください。

    • testckfold では、Y に含まれている欠損値と、対応する X1 および X2 の行が削除されます。

出力引数

すべて折りたたむ

論理値として返される仮説検定の結果。

h = 1 の場合、有意水準 Alpha で帰無仮説が棄却されます。

h = 0 の場合、有意水準 Alpha では帰無仮説を棄却できません。

データ型: logical

検定の p 値。[0,1] の範囲にあるスカラー値として返されます。p は、帰無仮説が真であると仮定した場合に、観測された検定統計量よりも無作為な検定統計量の方が極端な値になる確率です。

testckfold では、検定のタイプによって異なる検定統計量の分布を使用して p を推定します。検定統計量についての詳細は、反復交差検証を参照してください。

分類損失。数値行列として返されます。e1 の行は交差検証の実行に、列は検定の分割に対応します。

testckfold では、1 番目のテスト セット予測子データ (X1) を 1 番目の分類モデル (C1) に適用して、1 番目のクラス ラベルのセットを推定します。

e1 には、交差検証の実行と分割について、1 番目のクラス ラベルのセットで真のクラスラベル (Y) を予測する精度を要約した値が格納されます。e1 の要素の意味は、分類損失のタイプによって異なります。

分類損失。数値行列として返されます。e2 の各行は交差検証の実行に、各列は検定の分割に対応します。

testckfold では、2 番目のテスト セット予測子データ (X2) を 2 番目の分類モデル (C2) に適用して、2 番目のクラス ラベルのセットを推定します。

e2 には、交差検証の実行と分割について、2 番目のクラス ラベルのセットで真のクラス ラベル (Y) を予測する精度を要約した値が格納されます。e2 の要素の意味は、分類損失のタイプによって異なります。

詳細

すべて折りたたむ

反復交差検証

"反復交差検証" では、データに対して反復的に行った交差検証から生成される分類損失の差を結合することにより、2 つの分類モデルの精度を比較するための検定統計量を計算します。反復交差検証は、標本サイズが制限されている場合に有用です。

R x K の検定を実行するには、次のようにします。

  1. 予測子データのセットと真のクラス ラベルを無作為に K 個のセットに (クラス別に階層化して) 分離する操作を R 回繰り返します。各分離を "実行"、実行内の各セットを "分割" と呼びます。各実行にはデータ セット全体が含まれていますが、分離されています。

  2. r = 1 ~ R 回目の実行に対して、次のステップを k = 1 ~ K について繰り返します。

    1. 分割 k をテスト セットとして保持し、残りの K - 1 個の分割に対してそれぞれの予測子データセットを使用して 2 つの分類モデルを学習させます。

    2. 学習済みのモデルと、それぞれの分割 k の予測子データセットを使用して、クラス ラベルを予測します。

    3. 2 セットの推定ラベルを真のラベルと比較することにより、分類損失を推定します。検定セットが分類モデル c の実行 r における分割 k に対応する場合は、ecrk を分類損失として表します。

    4. 2 つのモデルの分類損失の差を計算します。

      δ^rk=e1rke2rk.

    1 回の実行が終わると、分類モデルごとに K 個の分類損失が得られます。

  3. ステップ 2 の結果を結合します。r = 1 ~ R について、以下を実行します。

    • 差の分割内平均とその平均を推定します。δ¯r=1Kk=1Kδ^kr.

    • 差の全体的な平均を推定します。δ¯=1KRr=1Rk=1Kδ^rk.

    • 差の分割内分散を推定します。sr2=1Kk=1K(δ^rkδ¯r)2.

    • 分割内の差の平均を推定します。s¯2=1Rr=1Rsr2.

    • 差の全体的な標本分散を推定します。S2=1KR1r=1Rk=1K(δ^rkδ¯)2.

    検定統計量を計算します。ここで説明されているサポート済みのすべての検定は、H0 の条件で推定した差は独立しており、平均が 0 で有限の共通標準偏差をもつほぼ正規分布になると仮定しています。しかし、これらの検定は独立性の仮定に違反しているので、検定統計量の分布はおおまかです。

    • R = 2 の場合は、ペア検定になります。このような検定として、t 検定と F 検定のペアがサポートされています。

      • ペア t 検定の検定統計量は次のようになります。

        tpaired=δ^11s¯2.

        tpaired は、帰無仮説では自由度 R の t 分布です。

        推定した差の間にある相関の影響を減らすため、δ¯ ではなく δ^11 を分子に使用しています。

        5 x 2 のペア t 検定は、わずかに保守的になる可能性があります [4]

      • ペア F 検定の検定統計量は次のようになります。

        Fpaired=1RKr=1Rk=1K(δ^rk)2s¯2.

        Fpaired は、自由度が RK および R の F 分布です。

        5 x 2 のペア F 検定の検出力は 5 x 2 のペア t 検定と同等ですが、より保守的です [1]

    • R > 2 の検定は、反復交差検証です。検定統計量は次のようになります。

      tCV=δ¯S/ν+1.

      tCV は、自由度が ν の t 分布に従います。差が真に独立している場合、ν = RK - 1 です。この場合、自由度パラメーターを最適化しなければなりません。

      10 x 10 の反復交差 t 検定の場合、最適な自由度は 8 ~ 11 です ([2] および [3])。testckfold では、ν = 10 を使用します。

ペア検定に対して反復交差検証が優れている点は、再現性が高いということです [3]。欠点は、多くの計算リソースが必要になることです。

分類損失

"分類損失" は、分類モデルまたは予測した一連のラベルの精度を示します。一般に、コスト行列が一定の場合、分類損失が大きくなると分類精度が低下します。

testckfold は、対立仮説における分類損失 (つまり、無制限な分類損失) を返します (e1 および e2 参照)。以下の定義では、次のようにします。

  • 1 番目の分類モデルの分類損失に重点を置きます。2 番目のモデルの分類損失は同様です。

  • ntest は、テスト セットの標本サイズです。

  • I(x) は、インジケーター関数です。x の記述が真の場合は I(x) = 1、それ以外の場合は I(x) = 0 です。

  • p^1j は、観測値 j に対する分類モデル 1 の予測クラスの割り当てです。

  • yj は、観測値 j の真のクラス ラベルです。

  • "二項分布からの逸脱度" は次のような形式になります。

    e1=j=1ntestwjlog(1+exp(2yjf(Xj)))j=1ntestwj

    ここで

    • yj は、陽性クラスの場合は 1、陰性クラスの場合は -1 です。

    • f(Xj) は分類スコアです。

    二項分布からの逸脱度は、二項分布尤度関数の最大化と関連しています。二項分布からの逸脱度についての詳細は、[5]を参照してください。

  • "指数損失" は二項分布からの逸脱度に似ており、次のような形式になります。

    e1=j=1ntestwjexp(yjf(Xj))j=1ntestwj.

    yjf(Xj) は、二項分布からの逸脱度の式の場合と同じ形式になります。

  • "ヒンジ損失" は次のような形式になります。

    e1=j=1nwjmax{0,1yjf(Xj)}j=1nwj,

    yjf(Xj) は、二項分布からの逸脱度の式の場合と同じ形式になります。

    ヒンジ損失は、誤分類観測値に対して直線的なペナルティを与えます。また、SVM の目的関数に関連しています。ヒンジ損失についての詳細は、[5]を参照してください。

  • "誤分類率" または分類誤差は [0,1] の範囲にあるスカラー値で、誤分類した観測の比率を表します。つまり、1 番目の分類モデルの誤分類率は次のようになります。

    e1=j=1ntestwjI(p^1jyj)j=1ntestwj.

ヒント

  • モデルを比較する方法の例には、次のようなものがあります。

    • 同じ予測子データのセットを渡して、単純な分類モデルと複雑なモデルの精度を比較する。

    • 2 つの異なる予測子のセットを使用して、2 つの異なるモデルの精度を比較する。

    • さまざまな特徴選択を実行する。たとえば、ある予測子のセットを使用して学習をさせたモデルの精度と、同じ予測子のサブセットまたは別の予測子のセットを使用して学習をさせたモデルの精度を比較できます。予測子のセットは自由に選択できます。また、PCA (pca 参照) や逐次特徴選択 (sequentialfs 参照) などの特徴選択手法を使用することもできます。

  • 次の両方が成り立つ場合、Y の指定を省略できます。

    • X1 および X2 が応答変数を含むテーブルで、同じ応答変数名を使用している。

    • C1 および C2 が完全な分類モデルであり、同じ ResponseName プロパティが含まれている (つまり、strcmp(C1.ResponseName,C2.ResponseName) = 1)。

    この場合、testckfold はテーブル内の共通する応答変数を使用します。

  • コストを考慮しない特徴選択を実行する方法の 1 つとして、次のようなものがあります。

    1. 1 番目の分類モデル (C1) の特性を示す分類モデル テンプレートを作成します。

    2. 2 番目の分類モデル (C2) の特性を示す分類モデル テンプレートを作成します。

    3. 2 つの予測子データのセットを指定します。たとえば、完全な予測子セットとして X1 を、縮小したセットとして X2 を指定します。

    4. testckfold(C1,C2,X1,X2,Y,'Alternative','less')」と入力します。testckfold1 を返した場合、少ない予測子を使用する分類モデルは完全な予測子セットを使用する分類モデルより性能が優れていることを示す十分な証拠があることになります。

    あるいは、2 つのモデルの精度に有意な差があるかどうかを評価することもできます。この評価を実行するには、手順 4 から 'Alternative','less' の指定を削除します。testckfold では両側検定が実行されます。h = 0 の場合、2 つのモデルの精度に差があることを示す十分な証拠がないことになります。

  • これらの検定は誤分類率の分類損失に適していますが、他の損失関数 (LossFun 参照) を指定することもできます。重要な仮定として、両側検定の帰無仮説において、推定した分類損失は独立しており、平均が 0 で有限の一般分散をもつ正規分布になっている必要があります。誤分類率以外の分類損失は、この仮定に違反する可能性があります。

  • 非常に離散的なデータ、不均衡なクラス、および非常に不均衡なコスト行列は、分類損失の差の計算における正規性の仮定に違反する可能性があります。

アルゴリズム

'Test','10x10t' を使用して 10 x 10 の反復交差 t 検定を実行するように指定した場合、testckfold は t 分布の自由度 10 を使用して棄却限界領域の検出と p 値を推定します。詳細は、[2]および[3]を参照してください。

代替方法

次の場合に testcholdout を使用します。

  • テスト セットの標本サイズが大きい。

  • マクネマー検定のバリアントを実装して 2 つの分類モデルの精度を比較する。

  • カイ二乗検定または尤度比検定による、コストを考慮する検定。カイ二乗検定では quadprog を使用しますが、これには Optimization Toolbox™ のライセンスが必要です。

参照

[1] Alpaydin, E. “Combined 5 x 2 CV F Test for Comparing Supervised Classification Learning Algorithms.” Neural Computation, Vol. 11, No. 8, 1999, pp. 1885–1992.

[2] Bouckaert. R. “Choosing Between Two Learning Algorithms Based on Calibrated Tests.” International Conference on Machine Learning, 2003, pp. 51–58.

[3] Bouckaert, R., and E. Frank. “Evaluating the Replicability of Significance Tests for Comparing Learning Algorithms.” Advances in Knowledge Discovery and Data Mining, 8th Pacific-Asia Conference, 2004, pp. 3–12.

[4] Dietterich, T. “Approximate statistical tests for comparing supervised classification learning algorithms.” Neural Computation, Vol. 10, No. 7, 1998, pp. 1895–1923.

[5] Hastie, T., R. Tibshirani, and J. Friedman. The Elements of Statistical Learning, 2nd Ed. New York: Springer, 2008.

拡張機能

R2015a で導入