このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
testckfold
交差検証の反復により 2 つの分類モデルの精度を比較
構文
説明
testckfold
は、反復的に 2 つの分類モデルの交差検証を行うことにより 2 つのモデルの精度を統計的に評価し、分類損失の差を求め、分類損失の差を結合して検定統計量を計算します。このタイプの検定は、標本サイズが制限されている場合に特に適しています。
複数の分類モデルの精度が異なるかどうかや、ある分類モデルの性能が別のモデルより優れているかどうかを評価できます。実行できる検定には、5 x 2 のペア t 検定、5 x 2 のペア F 検定、10 x 10 の反復交差 t 検定があります。詳細は、反復交差検証を参照してください。計算を高速化するため、testckfold
は並列計算をサポートしています (Parallel Computing Toolbox™ のライセンスが必要)。
は、5 x 2 のペア F 交差検証を実施することにより得られた検定の判定を返します。帰無仮説は、「テーブル h
= testckfold(C1
,C2
,X1
,X2
)X1
および X2
内の予測子および応答データを使用する真のクラス ラベルの予測において、分類モデル C1
および C2
の精度は等しい」です。h
= 1
の場合、帰無仮説は 5% の有意水準で棄却されます。
testckfold
は、C1
および C2
をそれぞれ X1
および X2
内のすべての予測子変数に適用することにより交差検証を実施します。X1
および X2
内の真のクラス ラベルは同じでなければなりません。X1
、X2
、C1.ResponseName
および C2.ResponseName
内の応答変数名は同じでなければなりません。
モデルを比較する方法の例については、ヒントを参照してください。
は、前の構文の入力引数のいずれかと、1 つ以上の h
= testckfold(___,Name,Value
)Name,Value
ペア引数で指定された追加オプションを使用します。たとえば、対立仮説のタイプ、検定のタイプ、並列計算の使用を指定できます。
例
分類木の予測子選択アルゴリズムの比較
fitctree
の既定設定では、網羅的探索を使用して、各ノードで分割に最適な予測子が選択されます。また、曲率検定を実施すると、応答が独立していないと考えられる予測子を分割することもできます。この例では、網羅的探索による最適分割によって成長させた分類木と、交互作用がある曲率検定の実施により成長させた分類木とを統計的に比較します。
census1994
データセットを読み込みます。
load census1994.mat rng(1) % For reproducibility
学習セットのテーブル adultdata
を使用して、既定の分類木を成長させます。応答変数名は 'salary'
です。
C1 = fitctree(adultdata,'salary')
C1 = ClassificationTree PredictorNames: {'age' 'workClass' 'fnlwgt' 'education' 'education_num' 'marital_status' 'occupation' 'relationship' 'race' 'sex' 'capital_gain' 'capital_loss' 'hours_per_week' 'native_country'} ResponseName: 'salary' CategoricalPredictors: [2 4 6 7 8 9 10 14] ClassNames: [<=50K >50K] ScoreTransform: 'none' NumObservations: 32561
C1
は完全な ClassificationTree
モデルです。このモデルの ResponseName
プロパティは 'salary'
です。C1
は、網羅的探索を使用し、最大の分割ゲインに基づいて分割に最適な予測子を求めます。
同じデータセットを使用して、別の分類木を成長させます。この分類木では、交互作用がある曲率検定を使用して分割に最適な予測子を求めるよう指定します。
C2 = fitctree(adultdata,'salary','PredictorSelection','interaction-curvature')
C2 = ClassificationTree PredictorNames: {'age' 'workClass' 'fnlwgt' 'education' 'education_num' 'marital_status' 'occupation' 'relationship' 'race' 'sex' 'capital_gain' 'capital_loss' 'hours_per_week' 'native_country'} ResponseName: 'salary' CategoricalPredictors: [2 4 6 7 8 9 10 14] ClassNames: [<=50K >50K] ScoreTransform: 'none' NumObservations: 32561
C2
も、ResponseName
が 'salary'
に等しい完全な ClassificationTree
モデルです。
5 x 2 のペア F 検定を実施して、学習セットを使用した場合の 2 つのモデルの精度を比較します。データセット内の応答変数名と ResponseName
プロパティの応答変数名はすべて等しく、両方のセットの応答データが等しいので、応答データの指定を省略できます。
h = testckfold(C1,C2,adultdata,adultdata)
h = logical
0
h = 0
なので、C1
と C2
は精度が等しいという帰無仮説を 5% の水準で棄却することはできません。
2 つの異なる分類モデルの精度を比較する
5 x 2 のペア F 検定を使用して、2 つのモデルの誤分類率を比較する統計検定を実行します。
フィッシャーのアヤメのデータセットを読み込みます。
load fisheriris;
既定のオプションを使用して、単純ベイズ テンプレートと分類木テンプレートを作成します。
C1 = templateNaiveBayes; C2 = templateTree;
C1
と C2
は、それぞれ単純ベイズ アルゴリズムと分類木アルゴリズムに対応するテンプレート オブジェクトです。
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);
C1
と C2
は 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
) では変化しません。
e1
と e2
は、誤分類コストが含まれている 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); 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: 6).
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 つのモデルの予測精度が等しいという帰無仮説は棄却できません。この結果から、単純なアンサンブルの方が有利であることがわかります。
入力引数
C1
— 分類モデル テンプレートまたは学習済みの分類モデル
分類モデル テンプレート オブジェクト | 学習済みの分類モデル オブジェクト
分類モデル テンプレートまたは学習済みの分類モデル。次の表で説明されている分類モデル テンプレート オブジェクトまたは学習済みの分類モデル オブジェクトのいずれかを指定します。
テンプレート タイプ | 生成元 |
---|---|
分類木 | templateTree |
判別分析 | templateDiscriminant |
アンサンブル (ブースティング、バギングおよびランダム部分空間) | templateEnsemble |
誤り訂正出力符号 (ECOC) マルチクラス分類モデル | templateECOC |
一般化加法モデル | templateGAM |
サポート ベクター マシン (SVM) 回帰またはロジスティック回帰の学習器によるガウス カーネル分類 | templateKernel |
kNN | templateKNN |
SVM 回帰またはロジスティック回帰の学習器による線形分類 | templateLinear |
単純ベイズ | templateNaiveBayes |
SVM | templateSVM |
学習済みモデルのタイプ | モデル オブジェクト | 生成元 |
---|---|---|
分類木 | ClassificationTree | fitctree |
判別分析 | ClassificationDiscriminant | fitcdiscr |
バギングされた分類モデルのアンサンブル | ClassificationBaggedEnsemble | fitcensemble |
分類モデルのアンサンブル | ClassificationEnsemble | fitcensemble |
ECOC モデル | ClassificationECOC | fitcecoc |
一般化加法モデル (GAM) | ClassificationGAM | fitcgam |
kNN | ClassificationKNN | fitcknn |
単純ベイズ | ClassificationNaiveBayes | fitcnb |
ニューラル ネットワーク | ClassificationNeuralNetwork (行に観測値が含まれる) | fitcnet |
SVM | ClassificationSVM | fitcsvm |
効率を向上させるには、学習済みの分類モデル オブジェクトではなく分類モデル テンプレート オブジェクトを指定します。
C2
— 分類モデル テンプレートまたは学習済みのモデル
分類モデル テンプレート オブジェクト | 学習済みの分類モデル オブジェクト
分類モデル テンプレートまたは学習済みの分類モデル。次の表で説明されている分類モデル テンプレート オブジェクトまたは学習済みの分類モデル オブジェクトのいずれかを指定します。
テンプレート タイプ | 生成元 |
---|---|
分類木 | templateTree |
判別分析 | templateDiscriminant |
アンサンブル (ブースティング、バギングおよびランダム部分空間) | templateEnsemble |
誤り訂正出力符号 (ECOC) マルチクラス分類モデル | templateECOC |
一般化加法モデル | templateGAM |
サポート ベクター マシン (SVM) 回帰またはロジスティック回帰の学習器によるガウス カーネル分類 | templateKernel |
kNN | templateKNN |
SVM 回帰またはロジスティック回帰の学習器による線形分類 | templateLinear |
単純ベイズ | templateNaiveBayes |
SVM | templateSVM |
学習済みモデルのタイプ | モデル オブジェクト | 生成元 |
---|---|---|
分類木 | ClassificationTree | fitctree |
判別分析 | ClassificationDiscriminant | fitcdiscr |
バギングされた分類モデルのアンサンブル | ClassificationBaggedEnsemble | fitcensemble |
分類モデルのアンサンブル | ClassificationEnsemble | fitcensemble |
ECOC モデル | ClassificationECOC | fitcecoc |
一般化加法モデル (GAM) | ClassificationGAM | fitcgam |
kNN | ClassificationKNN | fitcknn |
単純ベイズ | ClassificationNaiveBayes | fitcnb |
ニューラル ネットワーク | ClassificationNeuralNetwork (行に観測値が含まれる) | fitcnet |
SVM | ClassificationSVM | fitcsvm |
効率を向上させるには、学習済みの分類モデル オブジェクトではなく分類モデル テンプレート オブジェクトを指定します。
X1
— 1 番目の完全な分類モデルまたはテンプレートに適用するために使用するデータ
数値行列 | テーブル
X2
— 2 番目の完全な分類モデルまたはテンプレートに適用するために使用するデータ
数値行列 | テーブル
Y
— 真のクラス ラベル
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列 | 文字ベクトル | string スカラー
真のクラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、文字ベクトルの cell 配列、文字ベクトル、または string スカラーを指定します。
文字ベクトルまたは string スカラーの場合、
X1
とX2
は table でなければならず、これらの応答変数は名前および値が同じでなければならず、Y
は共通する変数名でなければなりません。たとえば、X1.Labels
とX2.Labels
が応答変数である場合、Y
は'Labels'
であり、X1.Labels
とX2.Labels
は等価でなければなりません。サポートされている他のすべてのデータ型の場合、
Y
は真のクラス ラベルの配列です。Y
が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。X1
、X2
、Y
は観測値の個数 (行数) が同じでなければなりません。
次の両方が成り立つ場合、
Y
の指定を省略できます。この場合、
testckfold
はテーブル内の共通する応答変数を使用します。たとえば、テーブル内の応答変数がX1.Labels
およびX2.Labels
であり、C1.ResponseName
およびC2.ResponseName
の値が'Labels'
である場合、Y
を指定する必要はありません。
データ型: categorical
| char
| string
| logical
| single
| double
| cell
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: 'Alternative','greater','Test','10x10t','Options',statsset('UseParallel',true)
は、1 番目の予測クラス ラベルに対する 1 番目のセットの精度が 2 番目のセットより高いかどうかを検定し、10 x 10 の t 検定を実行し、交差検証に並列計算を使用することを指定します。
Alpha
— 仮説検定の有意水準
0.05
(既定値) | (0, 1) の範囲にあるスカラー値
仮説検定の有意水準。'Alpha'
と (0, 1) の範囲にあるスカラー値をコンマで区切って指定します。
例: 'Alpha',0.1
データ型: single
| double
Alternative
— 評価する対立仮説
'unequal'
(既定値) | 'greater'
| 'less'
評価する対立仮説。'Alternative'
と次の表に記載されている値のいずれかをコンマ区切りのペアとして指定します。
値 | 対立仮説の説明 | サポートされる検定 |
---|---|---|
'unequal' (既定の設定) | Y を予測する場合、X1 に C1 を適用して生成された予測と X2 に C2 を適用して生成された予測では精度が異なる。 | '5x2F' 、'5x2t' および '10x10t' |
'greater' | Y を予測する場合、X1 に C1 を適用して生成された予測は X2 に C2 を適用して生成された予測より精度が高い。 | '5x2t' および '10x10t' |
'less' | Y を予測する場合、X1 に C1 を適用して生成された予測は X2 に C2 を適用して生成された予測より精度が低い。 | '5x2t' および '10x10t' |
サポートされる検定についての詳細は、Test
を参照してください。
例: 'Alternative','greater'
X1CategoricalPredictors
— カテゴリカル予測子を特定するフラグ
[]
(既定値) | logical ベクトル | 数値ベクトル | 'all'
1 番目の検定セット予測子データ (X1
) におけるカテゴリカル予測子を特定するフラグ。'X1CategoricalPredictors'
と次のいずれかをコンマ区切りのペアとして指定します。
1
からp
までのインデックスを使用する数値ベクトル。p
は、X1
の列数を示します。長さ
p
の logical ベクトル。true
のエントリは、対応するX1
の列がカテゴリカル変数であることを示します。'all'
、すべての予測子がカテゴリカルであることを示します。
既定値は []
であり、データにカテゴリカル予測子が含まれていないことを示します。
kNN 分類モデルの場合、有効なオプションは []
および 'all'
です。
X1
が行列でカテゴリカル予測子を含む場合は、X1CategoricalPredictors
を指定する必要があります。C1
が学習済み分類モデルである場合、testckfold
は C1
の CategoricalPredictors
プロパティを使用しません。C1
がカテゴリカル予測子をもつ学習済みモデルである場合は、'X1CategoricalPredictors',C1.CategoricalPredictors
を指定します。
例: 'X1CategoricalPredictors','all'
データ型: single
| double
| logical
| char
| string
X2CategoricalPredictors
— カテゴリカル予測子を特定するフラグ
[]
(既定値) | logical ベクトル | 数値ベクトル | 'all'
2 番目の検定セット予測子データ (X2
) におけるカテゴリカル予測子を特定するフラグ。'X2CategoricalPredictors'
と次のいずれかをコンマ区切りのペアとして指定します。
1
からp
までのインデックスを使用する数値ベクトル。p
は、X2
の列数を示します。長さ
p
の logical ベクトル。true
のエントリは、対応するX2
の列がカテゴリカル変数であることを示します。'all'
、すべての予測子がカテゴリカルであることを示します。
既定値は []
であり、データにカテゴリカル予測子が含まれていないことを示します。
kNN 分類モデルの場合、有効なオプションは []
および 'all'
です。
X2
が行列でカテゴリカル予測子を含む場合は、X2CategoricalPredictors
を指定する必要があります。C2
が学習済み分類モデルである場合、testckfold
は C2
の CategoricalPredictors
プロパティを使用しません。C2
がカテゴリカル予測子をもつ学習済みモデルである場合は、'X2CategoricalPredictors',C2.CategoricalPredictors
を指定します。
例: 'X2CategoricalPredictors','all'
データ型: single
| double
| logical
| char
| string
ClassNames
— クラス名
categorical 配列 | 文字配列 | string 配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
クラス名。'ClassNames'
と categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。ClassNames
は Y
のデータ型を使用して設定しなければなりません。
ClassNames
が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。
ClassNames
の使用目的は次のとおりです。
クラスの順序に対応する入力引数の次元の順序を指定する。たとえば、
Cost
の次元の順序を指定するためにClassNames
を使用します。検定用にクラスのサブセットを選択する。たとえば、
Y
に含まれているすべての異なるクラス名の集合が{'a','b','c'}
であるとします。クラス'a'
および'c'
のみの観測値を使用してモデルの学習と検定を行うには、'ClassNames',{'a','c'}
を指定します。
既定の設定は、Y
に含まれているすべての異なるクラス名の集合です。
例: 'ClassNames',{'b','g'}
データ型: single
| double
| logical
| char
| string
| cell
| categorical
Cost
— 分類コスト
正方行列 | 構造体配列
分類コスト。'Cost'
と正方行列または構造体配列をコンマで区切って指定します。
正方行列
Cost
を指定する場合、Cost(i,j)
は真のクラスがi
の点をクラスj
に分類するコストです。つまり、行は真のクラスに、列は予測するクラスに対応します。Cost
の対応する行および列についてクラスの順序を指定するには、名前と値のペアの引数ClassNames
をさらに指定します。構造体
S
を指定する場合、S
には次の 2 つのフィールドが必要です。S.ClassNames
。Y
と同じデータ型の変数としてクラス名を格納します。このフィールドを使用してクラスの順序を指定できます。S.ClassificationCosts
。S.ClassNames
と同じ行および列の順序でコスト行列を格納します。
コストを考慮する検定の場合は testcholdout
を使用してください。
分類モデルを学習させるために使用したものと同じコスト行列を渡すことをお勧めします。
既定値は、i ~= j
の場合は Cost(i,j) = 1
、i = j
の場合は Cost(i,j) = 0
です。
例: 'Cost',[0 1 2 ; 1 0 2; 2 2 0]
データ型: double
| single
| struct
LossFun
— 損失関数
'classiferror'
(既定値) | 'binodeviance'
| 'exponential'
| 'hinge'
| 関数ハンドル
損失関数。'LossFun'
と 'classiferror'
、'binodeviance'
、'exponential'
、'hinge'
または関数ハンドルから構成されるコンマ区切りのペアとして指定します。
次の表は、使用可能な損失関数の一覧です。
値 損失関数 'binodeviance'
二項分布からの逸脱度 'classiferror'
分類誤差 'exponential'
指数損失 'hinge'
ヒンジ損失 関数ハンドル表記を使用して独自の関数を指定します。
標本サイズが
n = size(X,1)
で、K
個の一意なクラスがあるとします。使用する関数ではシグネチャがlossvalue =
になっていなければなりません。ここでlossfun
(C,S,W,Cost)出力引数
lossvalue
はスカラーです。lossfun
は、独自の関数の名前です。C
はn
行K
列の logical 行列で、各行は対応する観測値がどのクラスに属するかを示します。列の順序は、名前と値のペアの引数ClassNames
におけるクラスの順序に対応します。C
を作成するには、各行について観測値p
がクラスq
に含まれている場合にC(p,q) = 1
を設定します。行p
の他のすべての要素を0
に設定します。S
は、分類スコアのn
行K
列の行列です。列の順序は、名前と値のペアの引数ClassNames
におけるクラスの順序に対応します。S
は、分類スコアの行列です。W
は、観測値の重みのn
行 1 列の数値ベクトルです。W
を渡す場合、重みは合計が1
になるように正規化されます。Cost
は、分類損失が含まれているK
行K
列の数値行列です。たとえば、Cost = ones(K) - eye(K)
は正しい分類のコストとして0
を、誤分類のコストとして1
を指定します。
'LossFun',@
を使用して独自の関数を指定します。lossfun
Options
— 並列計算オプション
[]
(既定値) | statset
によって返される構造体配列
並列計算。'Options'
と statset
により返される構造体配列で構成されるコンマ区切りのペアとして指定します。これらのオプションには Parallel Computing Toolbox が必要です。testckfold
はフィールド 'Streams'
、'UseParallel'
および 'UseSubtreams'
を使用します。
次の表は、使用できるオプションの一覧です。
オプション | 説明 |
---|---|
'Streams' |
これらが真の場合は、並列プールと同じサイズの cell 配列を使用します。並列プールが開いていない場合、1 つ (基本設定に依存) が開かれます。 |
'UseParallel' | Parallel Computing Toolbox を保有している場合、'UseParallel',true を設定してワーカーのプールを呼び出すことができます。 |
'UseSubstreams' | 並列計算する場合は true に設定して 'Streams' で指定されたストリームを使用します。既定値は false です。たとえば、Streams を'mlfg6331_64' または 'mrg32k3a' といったサブストリームを許可するタイプに設定します。 |
例: 'Options',statset('UseParallel',true)
データ型: struct
Prior
— 事前確率
'empirical'
(既定値) | 'uniform'
| 数値ベクトル | 構造体
各クラスの事前確率。'Prior'
と 'empirical'
、'uniform'
、数値ベクトルまたは構造体から構成されるコンマ区切りのペアとして指定します。
次の表は、事前確率の設定に使用できるオプションの一覧です。
値 | 説明 |
---|---|
'empirical' | クラスの事前確率は、Y のクラスの相対的頻度です。 |
'uniform' | クラスの事前確率はいずれも 1/K (K はクラス数) となります。 |
数値ベクトル | 各要素はクラスの事前確率です。名前と値のペアの引数 ClassNames を使用して順序を指定します。要素は合計が 1 になるように正規化されます。 |
構造体 | 構造体
|
例: 'Prior',struct('ClassNames',{{'setosa','versicolor'}},'ClassProbs',[1,2])
データ型: char
| string
| single
| double
| struct
Test
— 実行する検定
'5x2F'
(既定値) | '5x2t'
| '10x10t'
実行する検定。'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
— 詳細レベル
0
(既定値) | 1
| 2
詳細レベル。'Verbose'
と 0
、1
または 2
をコンマ区切りのペアとして指定します。Verbose
は、各交差検証分割の学習時にコマンド ウィンドウに表示される診断情報の量を制御します。
次の表は、使用できる詳細レベル オプションの一覧です。
値 | 説明 |
---|---|
0 | 診断情報は表示されません。 |
1 | 新しい交差検証を実行するたびに診断メッセージが表示されます。 |
2 | 新しい交差検証を実行するときと、特定の分割を学習させるときに診断メッセージが表示されます。 |
例: 'Verbose',1
データ型: double
| single
Weights
— 観測値の重み
ones(size(X,1),1)
(既定値) | 数値ベクトル
観測値の重み。'Weights'
と数値ベクトルで構成されるコンマ区切りのペアとして指定します。
Weights
のサイズは X1
の行数と等しくなければなりません。X
の各行の観測値では、Weights
の対応する重みを使用して重み付けがされます。
合計が各クラスの事前確率の値と等しくなるように Weights
が正規化されます。
データ型: double
| single
メモ:
testckfold
では、学習済みの分類モデルをテンプレートとして扱います。このため、モデル内の近似パラメーターはすべて無視されます。つまり、testckfold
では、モデルで指定されたオプションと予測子データのみを使用して交差検証を実行します。反復交差検証は、帰無仮説において検定統計量が漸近的に正規分布になるという仮定に基づいています。非常に不均衡なコスト行列 (
Cost
=[0 100;1 0]
など) や非常に離散的な応答分布 (つまり、ほとんどの観測値が少数のクラスに含まれている分布) の場合、漸近的な正規性の仮定に違反する可能性があります。コストを考慮する検定の場合はtestcholdout
を使用してください。NaN
、<undefined>
値、空の文字ベクトル (''
)、空の string (""
)、および<missing>
値は、欠損データ値を示します。
出力引数
h
— 仮説検定の結果
1
| 0
論理値として返される仮説検定の結果。
h = 1
の場合、有意水準 Alpha
で帰無仮説が棄却されます。
h = 0
の場合、有意水準 Alpha
では帰無仮説を棄却できません。
データ型: logical
p
— p 値
[0,1] の範囲にあるスカラー値
検定の p 値。[0,1] の範囲にあるスカラー値として返されます。p
は、帰無仮説が真であると仮定した場合に、観測された検定統計量よりも無作為な検定統計量の方が極端な値になる確率です。
testckfold
では、検定のタイプによって異なる検定統計量の分布を使用して p
を推定します。検定統計量についての詳細は、反復交差検証を参照してください。
詳細
反復交差検証
"反復交差検証" では、データに対して反復的に行った交差検証から生成される分類損失の差を結合することにより、2 つの分類モデルの精度を比較するための検定統計量を計算します。反復交差検証は、標本サイズが制限されている場合に有用です。
R x K の検定を実行するには、次のようにします。
予測子データのセットと真のクラス ラベルを無作為に K 個のセットに (クラス別に階層化して) 分離する操作を R 回繰り返します。各分離を "実行"、実行内の各セットを "分割" と呼びます。各実行にはデータ セット全体が含まれていますが、分離されています。
r = 1 ~ R 回目の実行に対して、次のステップを k = 1 ~ K について繰り返します。
分割 k をテスト セットとして保持し、残りの K - 1 個の分割に対してそれぞれの予測子データセットを使用して 2 つの分類モデルを学習させます。
学習済みのモデルと、それぞれの分割 k の予測子データセットを使用して、クラス ラベルを予測します。
2 セットの推定ラベルを真のラベルと比較することにより、分類損失を推定します。テスト セットが分類モデル c の実行 r における分割 k に対応する場合は、 を分類損失として表します。
2 つのモデルの分類損失の差を計算します。
1 回の実行が終わると、分類モデルごとに K 個の分類損失が得られます。
ステップ 2 の結果を結合します。r = 1 ~ R について、以下を実行します。
差の分割内平均とその平均を推定します。
差の全体的な平均を推定します。
差の分割内分散を推定します。
分割内の差の平均を推定します。
差の全体的な標本分散を推定します。
検定統計量を計算します。ここで説明されているサポート済みのすべての検定は、H0 の条件で推定した差は独立しており、平均が 0 で有限の共通標準偏差をもつほぼ正規分布になると仮定しています。しかし、これらの検定は独立性の仮定に違反しているので、検定統計量の分布はおおまかです。
ペア検定に対して反復交差検証が優れている点は、再現性が高いということです [3]。欠点は、多くの計算リソースが必要になることです。
分類損失
"分類損失" は、分類モデルまたは予測した一連のラベルの精度を示します。一般に、コスト行列が一定の場合、分類損失が大きくなると分類精度が低下します。
testckfold
は、対立仮説における分類損失 (つまり、無制限な分類損失) を返します (e1
および e2
参照)。以下の定義では、次のようにします。
1 番目の分類モデルの分類損失に重点を置きます。2 番目のモデルの分類損失は同様です。
ntest は、テストセットの標本サイズです。
I(x) は、インジケーター関数です。x の記述が真の場合は I(x) = 1 です。それ以外の場合は I(x) = 0 です。
は、観測値 j に対する分類モデル 1 の予測クラスの割り当てです。
yj は、観測値 j の真のクラス ラベルです。
"二項分布からの逸脱度" は次のような形式になります。
ここで
yj は、陽性クラスの場合は 1、陰性クラスの場合は -1 です。
は分類スコアです。
二項分布からの逸脱度は、二項分布尤度関数の最大化と関連しています。二項分布からの逸脱度についての詳細は、[5]を参照してください。
"指数損失" は二項分布からの逸脱度に似ており、次のような形式になります。
yj と は、二項分布からの逸脱度の式の場合と同じ形式になります。
"ヒンジ損失" は次のような形式になります。
yj と は、二項分布からの逸脱度の式の場合と同じ形式になります。
ヒンジ損失は、誤分類観測値に対して直線的なペナルティを与えます。また、SVM の目的関数に関連しています。ヒンジ損失についての詳細は、[5]を参照してください。
"誤分類率" または分類誤差は [0,1] の範囲にあるスカラー値で、誤分類した観測の比率を表します。つまり、1 番目の分類モデルの誤分類率は次のようになります。
ヒント
モデルを比較する方法の例には、次のようなものがあります。
同じ予測子データのセットを渡して、単純な分類モデルと複雑なモデルの精度を比較する。
2 つの異なる予測子のセットを使用して、2 つの異なるモデルの精度を比較する。
さまざまな特徴選択を実行する。たとえば、ある予測子のセットを使用して学習をさせたモデルの精度と、同じ予測子のサブセットまたは別の予測子のセットを使用して学習をさせたモデルの精度を比較できます。予測子のセットは自由に選択できます。また、PCA (
pca
参照) や逐次特徴選択 (sequentialfs
参照) などの特徴選択手法を使用することもできます。
次の両方が成り立つ場合、
Y
の指定を省略できます。この場合、
testckfold
はテーブル内の共通する応答変数を使用します。コストを考慮しない特徴選択を実行する方法の 1 つとして、次のようなものがあります。
1 番目の分類モデル (
C1
) の特性を示す分類モデル テンプレートを作成します。2 番目の分類モデル (
C2
) の特性を示す分類モデル テンプレートを作成します。2 つの予測子データのセットを指定します。たとえば、完全な予測子セットとして
X1
を、縮小したセットとしてX2
を指定します。「
testckfold(C1,C2,X1,X2,Y,'Alternative','less')
」と入力します。testckfold
が1
を返した場合、少ない予測子を使用する分類モデルは完全な予測子セットを使用する分類モデルより性能が優れていることを示す十分な証拠があることになります。
あるいは、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) を使用しますが、これには 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.
拡張機能
自動並列サポート
Parallel Computing Toolbox™ を使用して自動的に並列計算を実行することで、コードを高速化します。
並列実行するには、この関数を呼び出すときに名前と値の引数 Options
を指定し、statset
を使用してオプション構造体の UseParallel
フィールドを true
に設定します。
"Options",statset("UseParallel",true)
並列計算の詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2015a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)