Main Content

crossval

交差検証を使用した損失の推定

説明

err = crossval(criterion,X,y,'Predfun',predfun) は、指定された criterion、すなわち 'mse' (平均二乗誤差) または 'mcr' (誤分類率) のいずれかに基づいて、関数 predfun に対する 10 分割交差検証の誤差推定値を返します。Xy の行は観測値に、X の列は予測子変数に対応します。

詳細は、predfun の一般的な交差検証手順を参照してください。

err = crossval(criterion,X1,...,XN,y,'Predfun',predfun) は、予測子変数 X1XN および応答変数 y を使用して、predfun に対する 10 分割交差検証の誤差推定値を返します。

values = crossval(fun,X) は、関数 funX 内のデータに適用して 10 分割交差検証を実行します。X の行は観測値に、X の列は変数に対応します。

詳細は、fun の一般的な交差検証手順を参照してください。

values = crossval(fun,X1,...,XN) は、関数 funX1,...,XN 内のデータに適用して 10 分割交差検証を実行します。各データ セット (X1XN) の観測値の個数は同じでなければなりません。したがって、行数も同じでなければなりません。

___ = crossval(___,Name,Value) では、前の構文におけるいずれかの入力引数の組み合わせと出力引数に加えて、1 つ以上の名前と値のペアの引数を使用して交差検証のオプションを指定します。たとえば、'KFold',5 は 5 分割交差検証を実行するよう指定します。

すべて折りたたむ

10 分割交差検証を使用し、回帰モデルの平均二乗誤差を計算します。

carsmall データ セットを読み込みます。加速度、馬力、重量、ガロンあたりの走行マイル数 (MPG) の値を行列 data に格納します。NaN 値が含まれている行を削除します。

load carsmall
data = [Acceleration Horsepower Weight MPG];
data(any(isnan(data),2),:) = [];

data の最後の列 (MPG に対応) を y の応答変数として指定します。data のそれ以外の列を予測子データ X として指定します。回帰関数が regress を使用する場合、この例のように、値が 1 の列を X に追加します。

メモ: regress は、回帰モデルの係数推定値または残差が必要な場合に便利です。当てはめた回帰モデルをさらに調べる必要がある場合は、fitlm を使用して線形回帰モデル オブジェクトを作成します。fitlmcrossval を使用する例については、交差検証を使用した平均絶対誤差の計算を参照してください。

y = data(:,4);
X = [ones(length(y),1) data(:,1:3)];

カスタム関数 regf (この例の終わりに掲載) を作成します。この関数は、学習データに回帰モデルを当てはめ、テスト セットで予測値を計算します。

メモ: この例のライブ スクリプト ファイルを使用している場合、関数 regf は既にファイルの終わりに含まれています。それ以外の場合は、この関数を .m ファイルの終わりに作成するか、MATLAB® パス上のファイルとして追加する必要があります。

予測子データ X と応答変数 y を使用し、回帰モデルに対する既定の 10 分割交差検証の平均二乗誤差を計算します。

rng('default') % For reproducibility
cvMSE = crossval('mse',X,y,'Predfun',@regf)
cvMSE = 17.5399

次のコードは、関数 regf を作成します。

function yfit = regf(Xtrain,ytrain,Xtest)
b = regress(ytrain,Xtrain);
yfit = Xtest*b;
end

10 分割交差検証を使用して、数値データとカテゴリカル予測子データで学習させたロジスティック回帰モデルの分類誤差を計算します。

patients データ セットを読み込みます。予測子として、数値変数 DiastolicSystolic、およびカテゴリカル変数 Gender を指定し、応答変数として Smoker を指定します。

load patients
X1 = Diastolic;
X2 = categorical(Gender);
X3 = Systolic;
y = Smoker;

カスタム関数 classf (この例の終わりに掲載) を作成します。この関数は、学習データにロジスティック回帰モデルを当てはめ、テスト データを分類します。

メモ: この例のライブ スクリプト ファイルを使用している場合、関数 classf は既にファイルの終わりに含まれています。それ以外の場合は、この関数を .m ファイルの終わりに作成するか、MATLAB® パス上のファイルとして追加する必要があります。

予測子データ X1X2X3、および応答変数 y を使用して、このモデルに対する 10 分割交差検証の分類誤差を計算します。学習セットとテスト セットで必ず喫煙者の比率がほぼ同じになるように、'Stratify',y を指定します。

rng('default') % For reproducibility
err = crossval('mcr',X1,X2,X3,y,'Predfun',@classf,'Stratify',y)
err = 0.1100

次のコードは、関数 classf を作成します。

function pred = classf(X1train,X2train,X3train,ytrain,X1test,X2test,X3test)
Xtrain = table(X1train,X2train,X3train,ytrain, ...
    'VariableNames',{'Diastolic','Gender','Systolic','Smoker'});
Xtest = table(X1test,X2test,X3test, ...
    'VariableNames',{'Diastolic','Gender','Systolic'});
modelspec = 'Smoker ~ Diastolic + Gender + Systolic';
mdl = fitglm(Xtrain,modelspec,'Distribution','binomial');
yfit = predict(mdl,Xtest);
pred = (yfit > 0.5);
end

与えられた数のクラスターについて、観測値とそれに最も近いクラスターの中心との間の、交差検証された距離の二乗和を計算します。1 ~ 10 個のクラスターについて、結果を比較します。

fisheriris データ セットを読み込みます。X は、150 種類の花についての花の測定値が格納された行列 meas です。

load fisheriris
X = meas;

カスタム関数 clustf (この例の終わりに掲載) を作成します。この関数は以下の手順を実行します。

  1. 学習データを標準化します。

  2. 学習データを k 個のクラスターに分割します。

  3. 学習データの平均と標準偏差を使用して、テスト データを変換します。

  4. 各テスト データ点とそれに最も近いクラスターの中心 (重心) との距離を計算します。

  5. 距離の二乗和を計算します。

メモ: この例のライブ スクリプト ファイルを使用している場合、関数 clustf は既にファイルの終わりに含まれています。それ以外の場合は、この関数を .m ファイルの終わりに作成するか、MATLAB® パス上のファイルとして追加する必要があります。

各反復でクラスター数 k を指定する for ループを作成します。決められた各クラスター数について、対応する関数 clustfcrossval に渡します。crossval は、既定で 10 分割交差検証を実行するため、ソフトウェアは 10 個の距離の二乗和を計算します (各平方和は学習データとテスト データの各分割に対応します)。これらの値を合計します。これが、所定の数のクラスターについての交差検証された距離の二乗和です。

rng('default') % For reproducibility
cvdist = zeros(5,1);
for k = 1:10
    fun = @(Xtrain,Xtest)clustf(Xtrain,Xtest,k);
    distances = crossval(fun,X);
    cvdist(k) = sum(distances);
end

各クラスター数について、交差検証された距離の二乗和をプロットします。

plot(cvdist)
xlabel('Number of Clusters')
ylabel('CV Sum of Squared Distances')

通常は、使用するクラスターの数を決定する場合、交差検証された距離の二乗和が大幅な減少を示すクラスター数のうち最も数が大きいものを使用することを検討してください。この例の場合、2 つか 3 つのクラスターの使用が適切と考えられますが、3 つを超えるクラスターの使用は適切と考えられません。

次のコードは、関数 clustf を作成します。

function distances = clustf(Xtrain,Xtest,k)
[Ztrain,Zmean,Zstd] = zscore(Xtrain);
[~,C] = kmeans(Ztrain,k); % Creates k clusters
Ztest = (Xtest-Zmean)./Zstd;
d = pdist2(C,Ztest,'euclidean','Smallest',1);
distances = sum(d.^2);
end

10 分割交差検証を使用して、回帰モデルの平均絶対誤差を計算します。

carsmall データ セットを読み込みます。予測子として変数 AccelerationDisplacement を指定し、応答として変数 Weight を指定します。

load carsmall
X1 = Acceleration;
X2 = Displacement;
y = Weight;

カスタム関数 regf (この例の終わりに掲載) を作成します。この関数は、学習データに回帰モデルを当てはめ、テスト セットで車両の重量を計算します。この関数は、車両の予測重量と真の値を比較して、平均絶対誤差 (MAE) と、テスト セットの車両の重量の範囲に調整された MAE を計算します。

メモ: この例のライブ スクリプト ファイルを使用している場合、関数 regf は既にファイルの終わりに含まれています。それ以外の場合は、この関数を .m ファイルの終わりに作成するか、MATLAB® パス上のファイルとして追加する必要があります。

既定では、crossval は 10 分割交差検証を実行します。X1X2、および y に含まれるデータから得られた学習セットとテスト セットの 10 個の分割のそれぞれについて、関数 regf を使用して MAE と調整済み MAE の値を計算します。MAE の平均値と調整済み MAE の平均値を求めます。

rng('default') % For reproducibility
values = crossval(@regf,X1,X2,y)
values = 10×2

  319.2261    0.1132
  342.3722    0.1240
  214.3735    0.0902
  174.7247    0.1128
  189.4835    0.0832
  249.4359    0.1003
  194.4210    0.0845
  348.7437    0.1700
  283.1761    0.1187
  210.7444    0.1325

mean(values)
ans = 1×2

  252.6701    0.1129

次のコードは、関数 regf を作成します。

function errors = regf(X1train,X2train,ytrain,X1test,X2test,ytest)
tbltrain = table(X1train,X2train,ytrain, ...
    'VariableNames',{'Acceleration','Displacement','Weight'});
tbltest = table(X1test,X2test,ytest, ...
    'VariableNames',{'Acceleration','Displacement','Weight'});
mdl = fitlm(tbltrain,'Weight ~ Acceleration + Displacement');
yfit = predict(mdl,tbltest);
MAE = mean(abs(yfit-tbltest.Weight));
adjMAE = MAE/range(tbltest.Weight);
errors = [MAE adjMAE];
end

主成分分析 (PCA) と 5 分割交差検証を使用して、分類木の分類誤差を計算します。

fisheriris データ セットを読み込みます。meas には、150 種類の花についての花の測定値が格納されています。変数 species には、それぞれの花の種類がリストされています。

load fisheriris

カスタム関数 classf (この例の終わりに掲載) を作成します。この関数は、学習データに分類木を当てはめ、テスト データを分類します。関数の内部では PCA を使用し、ツリー モデルの作成に使用する予測子の数を減らします。

メモ: この例のライブ スクリプト ファイルを使用している場合、関数 classf は既にファイルの終わりに含まれています。それ以外の場合は、この関数を .m ファイルの終わりに作成するか、MATLAB® パス上のファイルとして追加する必要があります。

層化 5 分割交差検証用に、cvpartition オブジェクトを作成します。既定では、cvpartition により、学習セットとテスト セットで花の種類の比率がほぼ同じになることが保証されます。

rng('default') % For reproducibility
cvp = cvpartition(species,'KFold',5);

予測子データ meas および応答変数 species を使用して、この分類木に対する 5 分割交差検証の分類誤差を計算します。

cvError = crossval('mcr',meas,species,'Predfun',@classf,'Partition',cvp)
cvError = 0.1067

次のコードは、関数 classf を作成します。

function yfit = classf(Xtrain,ytrain,Xtest)

% Standardize the training predictor data. Then, find the 
% principal components for the standardized training predictor
% data.
[Ztrain,Zmean,Zstd] = zscore(Xtrain);
[coeff,scoreTrain,~,~,explained,mu] = pca(Ztrain);

% Find the lowest number of principal components that account
% for at least 95% of the variability.
n = find(cumsum(explained)>=95,1);

% Find the n principal component scores for the standardized
% training predictor data. Train a classification tree model
% using only these scores.
scoreTrain95 = scoreTrain(:,1:n);
mdl = fitctree(scoreTrain95,ytrain);

% Find the n principal component scores for the transformed
% test data. Classify the test data.
Ztest = (Xtest-Zmean)./Zstd;
scoreTest95 = (Ztest-mu)*coeff(:,1:n);
yfit = predict(mdl,scoreTest95);

end

判別分析モデルの 10 分割交差検証結果から、混同行列を作成します。

メモ: 学習速度が重要となる場合は classify を使用します。そうでない場合は fitcdiscr を使用して判別分析モデルを作成します。この例と同じワークフローで fitcdiscr を使用する例については、交差検証予測を使用した混同行列の作成を参照してください。

fisheriris データ セットを読み込みます。X は 150 種類の花についての花の測定値を格納し、y はそれぞれの花の種類をリストします。花の種類の順序を指定する変数 order を作成します。

load fisheriris
X = meas;
y = species;
order = unique(y)
order = 3x1 cell
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

以下の手順を実行する関数用に、func という名前の関数ハンドルを作成します。

  • 学習データ (Xtrain および ytrain) とテスト データ (Xtest および ytest) を取り込む。

  • 学習データを使用して、新しいデータ (Xtest) を分類する判別分析モデルを作成する。このモデルを作成し、関数 classify を使用して新しいデータを分類する。

  • 真のテスト データ クラス (ytest) と予測されたテスト データ値を比較し、関数 confusionmat を使用してこの比較結果の混同行列を作成する。'Order',order を使用してクラスの順序を指定する。

func = @(Xtrain,ytrain,Xtest,ytest)confusionmat(ytest, ...
    classify(Xtest,Xtrain,ytrain),'Order',order);

層化 10 分割交差検証用に、cvpartition オブジェクトを作成します。既定では、cvpartition により、学習セットとテスト セットで花の種類の比率がほぼ同じになることが保証されます。

rng('default') % For reproducibility
cvp = cvpartition(y,'Kfold',10);

予測子データ X と応答変数 y の各分割について、10 個のテスト セットの混同行列を計算します。confMat の各行は、1 つのテスト セットから得られた混同行列に対応します。結果を集計し、最終結果の混同行列 cvMat を作成します。

confMat = crossval(func,X,y,'Partition',cvp);
cvMat = reshape(sum(confMat),3,3)
cvMat = 3×3

    50     0     0
     0    48     2
     0     1    49

confusionchart を使用して、混同行列を混同行列チャートとしてプロットします。

confusionchart(cvMat,order)

入力引数

すべて折りたたむ

誤差推定値のタイプ。'mse' または 'mcr' のいずれかとして指定します。

説明
'mse'平均二乗誤差 (MSE) — 回帰アルゴリズムにのみ適しています。
'mcr'誤分類率 (誤分類された観測値の比率) — 分類アルゴリズムにのみ適しています。

データ セット。列ベクトル、行列、または配列として指定します。X の行は観測値に対応し、X の列は一般に変数と対応します。複数のデータ セット X1,...,XNcrossval に渡す場合、すべてのデータ セットの行数は同じでなければなりません。

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

応答データ。列ベクトルまたは文字配列として指定します。y の行は観測値に対応します。y の行数は、予測子データ X または X1,...,XN と同じでなければなりません。

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

予測関数。関数ハンドルとして指定します。この関数は、無名関数、残りのコードが格納されている .m ファイルまたは .mlx ファイルの末尾で定義される関数、または MATLAB® パス上のファイルとして作成しなければなりません。

次の表は、crossval に渡される予測子データのタイプごとに必要とされる関数の構文について説明しています。

予測子データ関数の構文
@myfunctionX

function yfit = myfunction(Xtrain,ytrain,Xtest)
% Calculate predicted response
...
end

  • Xtrain — 学習の予測子データとして使用される、X の観測値のサブセット。関数は、Xtrainytrain を使用して分類モデルまたは回帰モデルを構築します。

  • ytrain — 学習の応答データとして使用される、y の応答のサブセット。ytrain の行は、Xtrain の行の同じ観測値に対応します。関数は、Xtrainytrain を使用して分類モデルまたは回帰モデルを構築します。

  • Xtest — テストの予測子データとして使用される、X の観測値のサブセット。関数は、Xtest と、Xtrain および ytrain で学習させたモデルを使用して、予測値 yfit を計算します。

  • yfitXtest の観測値に対する予測値のセット。yfit の値は、Xtest と同じ行数をもつ列ベクトルを形成します。

@myfunctionX1,...,XN

function yfit = myfunction(X1train,...,XNtrain,ytrain,X1test,...,XNtest)
% Calculate predicted response
...
end

  • X1train,...,XNtrain — 学習の予測子データとして使用される、X1,...,XN の予測子データの各サブセット。X1train,...,XNtrain の行は、同じ観測値に対応します。関数は、X1train,...,XNtrainytrain を使用して分類モデルまたは回帰モデルを構築します。

  • ytrain — 学習の応答データとして使用される、y の応答のサブセット。ytrain の行は、X1train,...,XNtrain の行の同じ観測値に対応します。関数は、X1train,...,XNtrainytrain を使用して分類モデルまたは回帰モデルを構築します。

  • X1test,...,XNtest — テストの予測子データとして使用される、X1,...,XN の観測値の各サブセット。X1test,...,XNtest の行は、同じ観測値に対応します。関数は、X1test,...,XNtest と、X1train,...,XNtrain および ytrain で学習させたモデルを使用して、予測値 yfit を計算します。

  • yfitX1test,...,XNtest の観測値に対する予測値のセット。yfit の値は、X1test,...,XNtest と同じ行数をもつ列ベクトルを形成します。

例: @(Xtrain,ytrain,Xtest)(Xtest*regress(ytrain,Xtrain));

データ型: function_handle

交差検証する関数。関数ハンドルとして指定します。この関数は、無名関数、残りのコードが格納されている .m ファイルまたは .mlx ファイルの末尾で定義される関数、または MATLAB パス上のファイルとして作成しなければなりません。

次の表は、crossval に渡されるデータのタイプごとに必要とされる関数の構文について説明しています。

データ関数の構文
@myfunctionX

function value = myfunction(Xtrain,Xtest)
% Calculation of value
...
end

  • Xtrain — 学習データとして使用される、X の観測値のサブセット。関数は、Xtrain を使用してモデルを構築します。

  • Xtest — テスト データとして使用される、X の観測値のサブセット。関数は、Xtest と、Xtrain で学習させたモデルを使用して、value を計算します。

  • value — 量または変数。ほとんどの場合、value は推定損失を表す数値スカラーです。学習データとテスト データの各分割の配列サイズが同じ場合は、value が配列となります。データの分割に応じてサイズ変更可能な変数 output を返したい場合は、value の代わりに cell スカラー {output} を設定します。

@myfunctionX1,...,XN

function value = myfunction(X1train,...,XNtrain,X1test,...,XNtest)
% Calculation of value
...
end

  • X1train,...,XNtrain — 学習データとして使用される、X1,...,XN のデータの各サブセット。X1train,...,XNtrain の行は、同じ観測値に対応します。関数は、X1train,...,XNtrain を使用してモデルを構築します。

  • X1test,...,XNtest — テスト データとして使用される、X1,...,XN のデータの各サブセット。X1test,...,XNtest の行は、同じ観測値に対応します。関数は、X1test,...,XNtest と、X1train,...,XNtrain で学習させたモデルを使用して、value を計算します。

  • value — 量または変数。ほとんどの場合、value は推定損失を表す数値スカラーです。学習データとテスト データの各分割の配列サイズが同じ場合は、value が配列となります。データの分割に応じてサイズ変更可能な変数 output を返したい場合は、value の代わりに cell スカラー {output} を設定します。

データ型: function_handle

名前と値の引数

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

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

例: crossval('mcr',meas,species,'Predfun',@classf,'KFold',5,'Stratify',species) は、予測子データ meas と応答変数 species を使用して関数 classf の層化 5 分割交差検証の誤分類率を計算するよう指定します。

ホールドアウト検証に使用される観測値の比率または数。'Holdout' と範囲 (0,1) のスカラー値 (または正の整数スカラー値) から構成されるコンマ区切りのペアとして指定します。

  • Holdout の値 p が範囲 (0,1) のスカラー値である場合、crossval は、観測値の約 p*100% を無作為に選択してテスト データとして確保します。

  • Holdout の値 p が正の整数スカラー値である場合、crossval は、p 個の観測値を無作為に選択してテスト データとして確保します。

どちらの場合も、crossval は、残りのデータを使用して fun または predfun で指定されたモデルに学習させます。最終的に、この関数は、テスト データと学習済みのモデルを使用して、values または err を計算します。

名前と値のペアの 4 つの引数 (HoldoutKFoldLeaveout、および Partition) のうち、いずれか 1 つだけを使用できます。

例: 'Holdout',0.3

例: 'Holdout',50

データ型: single | double

k 分割交差検証の分割数。'KFold' および 1 より大きい正の整数スカラーから構成されるコンマ区切りのペアとして指定します。

'KFold',k を指定した場合、crossval はデータを無作為に k 個のセットに分割します。関数は、各セットについて、そのセットをテスト データとして確保し、それ以外の k – 1 個のセットを使用して fun または predfun で指定されたモデルに学習させます。その後、crossval は、テスト データと学習済みモデルを使用して、values または err を計算します。

名前と値のペアの 4 つの引数 (HoldoutKFoldLeaveout、および Partition) のうち、いずれか 1 つだけを使用できます。

例: 'KFold',5

データ型: single | double

Leave-one-out 交差検証。'Leaveout' および 1 から構成されるコンマ区切りのペアとして指定します。

'Leaveout',1 を指定した場合、各観測値について、crossval はその観測値をテスト データとして確保し、それ以外の観測値を使用して fun または predfun で指定されたモデルに学習させます。その後、この関数は、テスト観測値と学習済みのモデルを使用して、values または err を計算します。

名前と値のペアの 4 つの引数 (HoldoutKFoldLeaveout、および Partition) のうち、いずれか 1 つだけを使用できます。

例: 'Leaveout',1

データ型: single | double

検証用のモンテカルロ反復回数。'MCReps' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。crossval の最初の入力が 'mse' または 'mcr' である場合 (criterion を参照)、crossval はすべてのモンテカルロ反復における MSE または誤分類率の平均を返します。それ以外の場合、crossval は、1 番目の次元に沿ったすべてのモンテカルロ反復の値を連結します。

PartitionMCReps の両方を指定した場合、最初のモンテカルロ反復では、cvpartition オブジェクト内に含まれる分割情報が使用され、残りのモンテカルロ反復のそれぞれで新しい分割を作成するときに、ソフトウェアによってオブジェクト関数 repartition が呼び出されます。

Leaveout の値が 1Partition の値が 'leaveout' または 'resubstitution' タイプの cvpartition オブジェクト、または Partition の値がカスタム cvpartition オブジェクト (つまり、IsCustom プロパティが 1 に設定されたオブジェクト) の場合、MCReps の値は 1 に設定されます。

例: 'MCReps',5

データ型: single | double

交差検証分割。'Partition' と、cvpartition で作成した cvpartition 分割オブジェクトから構成されるコンマ区切りのペアとして指定します。分割オブジェクトは、交差検証のタイプと、学習セットおよびテスト セットのインデックス付けを指定します。

crossval を使用する場合、PartitionStratify の両方を指定することはできません。cvpartition 分割オブジェクトを作成する場合は、代わりに層化区分を直接指定します。

名前と値のペアの 4 つの引数 (HoldoutKFoldLeaveout、および Partition) のうち、いずれか 1 つだけを使用できます。

階層化に使用するグループを指定する変数。'Stratify' と、データ X または X1,...,XN と同じ行数の列ベクトルから構成されるコンマ区切りのペアとして指定します。

Stratify を指定した場合、学習セットとテスト セットはどちらも、クラスの比率が Stratify とほぼ同じになります。Stratify 内の NaN、空の文字ベクトル、空の string、<missing> 値、および <undefined> 値はソフトウェアによって欠損データとして扱われ、データの対応する行は無視されます。

分類アルゴリズムを使用して交差検証を行う場合は、階層化を使用することをお勧めします。それ以外の場合、テスト セットによってはクラスの観測値がすべて含まれないことがあります。

crossval を使用する場合、PartitionStratify の両方を指定することはできません。cvpartition 分割オブジェクトを作成する場合は、代わりに層化区分を直接指定します。

データ型: single | double | logical | string | cell | categorical

並列計算と乱数ストリーム設定のオプション。構造体として指定します。statset を使用して Options 構造体を作成します。次の表は、オプションのフィールドとその値の一覧です。

フィールド名既定の設定
UseParallel並列計算を行う場合は、この値を true に設定します。false
UseSubstreams

再現可能な方法で計算する場合は、この値を true に設定します。

再現性のある計算を行うには、Streams をサブストリームを許可する型 ("mlfg6331_64" または "mrg32k3a") に設定します。

false
StreamsRandStream オブジェクトまたはそのようなオブジェクトの cell 配列としてこの値を指定します。UseParallel の値が true でなく、UseSubstreams の値も false でない場合、単一オブジェクトを使用します。この場合は、並列プールと同じサイズの cell 配列を使用します。Streams を指定しなかった場合、crossval は既定のストリームを使用します。

メモ

並列計算を行うには、Parallel Computing Toolbox™ が必要です。

例: Options=statset(UseParallel=true,UseSubstreams=true,Streams=RandStream("mlfg6331_64"))

データ型: struct

出力引数

すべて折りたたむ

平均二乗誤差または誤分類率。数値スカラーとして返されます。誤差のタイプは criterion の値によって異なります。

損失値。列ベクトルまたは行列として返されます。values の各行は、学習データとテスト データの 1 つの分割に対する fun の出力に対応します。

fun によって返される出力が多次元の場合、crossval は、values の 1 つの行に収まるように出力の形状を変更します。たとえば、交差検証を使用した混同行列の作成を参照してください。

ヒント

  • 分類アルゴリズムを使用して交差検証を行う場合は、階層化 (Stratify を参照) を使用することをお勧めします。それ以外の場合、テスト セットによってはクラスの観測値がすべて含まれないことがあります。

アルゴリズム

すべて折りたたむ

predfun の一般的な交差検証手順

predfun を使用する場合、関数 crossval は、通常、次のように 10 分割交差検証を実行します。

  1. 予測子データ X と応答変数 y に含まれる観測値を、各グループの観測値の数がほぼ同じになるように 10 個のグループに分割します。

  2. 最後の 9 つの観測値グループを使用し、predfun の指定に従ってモデルの学習を実行します。最初の観測値グループをテスト データとして使用します。このテストの予測子データを学習済みのモデルに渡し、predfun の指定に従って予測値を計算します。criterion で指定された誤差を計算します。

  3. 最初の観測値グループと最後の 8 つの観測値グループを使用し、predfun の指定に従ってモデルの学習を実行します。2 番目の観測値グループをテスト データとして使用します。このテスト データを学習済みのモデルに渡し、predfun の指定に従って予測値を計算します。criterion で指定された誤差を計算します。

  4. すべての観測値グループがテスト データとして 1 回のみ使用されるように、同様の方法で処理を行います。

  5. スカラーの err として平均誤差推定値を返します。

fun の一般的な交差検証手順

fun を使用する場合、関数 crossval は、通常、次のように 10 分割交差検証を実行します。

  1. X に含まれるデータを、各グループの観測値の数がほぼ同じになるように 10 個のグループに分割します。

  2. 最後の 9 つのデータ グループを使用し、fun の指定に従ってモデルの学習を実行します。最初のデータ グループをテスト セットとして使用します。このテスト セットを学習済みのモデルに渡し、fun の指定に従って値 (損失など) を計算します。

  3. 最初のデータ グループと最後の 8 つのデータ グループを使用し、fun の指定に従ってモデルの学習を実行します。2 番目のデータ グループをテスト セットとして使用します。このテスト セットを学習済みのモデルに渡し、fun の指定に従って同じ値を計算します。

  4. すべてのデータ グループがテスト セットとして 1 回のみ使用されるように、同様の方法で処理を行います。

  5. 計算された 10 個の値をベクトル values として返します。

代替機能

多くの分類関数や回帰関数では、交差検証を直接実行できます。

  • fitcsvmfitctree、および fitrtree などの近似関数を使用する場合、名前と値のペアの引数を使用して交差検証のオプションを指定できます。または、これらの近似関数を使用してモデルをまず作成した後、オブジェクト関数 crossval を使用して、分割オブジェクトを作成することもできます。オブジェクト関数 kfoldLosskfoldPredict を使用して、分割オブジェクトの損失値と予測値を計算します。詳細については、ClassificationPartitionedModelRegressionPartitionedModel を参照してください。

  • lassolassoglm を使用して LASSO または Elastic Net 正則化を実行するときに、交差検証オプションを指定することもできます。

拡張機能

バージョン履歴

R2008a で導入