このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
crossval
機械学習モデルの交差検証
説明
例
SVM 分類器の交差検証
ionosphere
データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子と、不良 ('b'
) または良好 ('g'
) という 351 個の二項反応が含まれています。
load ionosphere rng(1); % For reproducibility
サポート ベクター マシン (SVM) 分類器に学習させます。予測子データを標準化し、クラスの順序を指定します。
SVMModel = fitcsvm(X,Y,'Standardize',true,'ClassNames',{'b','g'});
SVMModel
は学習させた ClassificationSVM
分類器です。'b'
は陰性のクラス、'g'
は陽性のクラスです。
10 分割交差検証を使用して分類器を交差検証します。
CVSVMModel = crossval(SVMModel)
CVSVMModel = ClassificationPartitionedModel CrossValidatedModel: 'SVM' PredictorNames: {'x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'x7' 'x8' 'x9' 'x10' 'x11' 'x12' 'x13' 'x14' 'x15' 'x16' 'x17' 'x18' 'x19' 'x20' 'x21' 'x22' 'x23' 'x24' 'x25' 'x26' 'x27' 'x28' 'x29' 'x30' 'x31' 'x32' 'x33' 'x34'} ResponseName: 'Y' NumObservations: 351 KFold: 10 Partition: [1x1 cvpartition] ClassNames: {'b' 'g'} ScoreTransform: 'none'
CVSVMModel
は ClassificationPartitionedModel
交差検証分類器です。交差検証時は、以下の手順が実行されます。
データを同じサイズの 10 個のセットに無作為に分割する。
9 個のセットに対して SVM 分類器に学習をさせる。
手順 1 および 2 を k = 10 回繰り返す。毎回、1 個の分割が除外され、残りの 9 個について学習が行われます。
各分割について汎化統計量を結合する。
CVSVMModel.Trained
内の最初のモデルを表示します。
FirstModel = CVSVMModel.Trained{1}
FirstModel = CompactClassificationSVM ResponseName: 'Y' CategoricalPredictors: [] ClassNames: {'b' 'g'} ScoreTransform: 'none' Alpha: [78x1 double] Bias: -0.2209 KernelParameters: [1x1 struct] Mu: [0.8888 0 0.6320 0.0406 0.5931 0.1205 0.5361 0.1286 0.5083 0.1879 0.4779 0.1567 0.3924 0.0875 0.3360 0.0789 0.3839 9.6066e-05 0.3562 -0.0308 0.3398 -0.0073 0.3590 -0.0628 0.4064 -0.0664 0.5535 -0.0749 0.3835 ... ] (1x34 double) Sigma: [0.3149 0 0.5033 0.4441 0.5255 0.4663 0.4987 0.5205 0.5040 0.4780 0.5649 0.4896 0.6293 0.4924 0.6606 0.4535 0.6133 0.4878 0.6250 0.5140 0.6075 0.5150 0.6068 0.5222 0.5729 0.5103 0.5061 0.5478 0.5712 0.5032 ... ] (1x34 double) SupportVectors: [78x34 double] SupportVectorLabels: [78x1 double]
FirstModel
は 10 個の学習させた分類器のうち最初のものです。これは CompactClassificationSVM
分類器です。
CVSVMModel
を kfoldLoss
に渡すと、汎化誤差を推定できます。
単純ベイズ交差検証のホールドアウト標本比率の指定
交差検証のホールドアウト標本比率を指定します。既定では、crossval
は 10 分割交差検証を使用して単純ベイズ分類器を交差検証します。しかし、交差検証には他のいくつかのオプションがあります。たとえば、異なる分割数またはホールドアウト標本比率を指定できます。
ionosphere
データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子と、不良 ('b'
) または良好 ('g'
) という 351 個の二項反応が含まれています。
load ionosphere
安定させるため、最初の 2 つの予測子を削除します。
X = X(:,3:end); rng('default'); % For reproducibility
予測子 X
とクラス ラベル Y
を使用して、単純ベイズ分類器に学習させます。クラス名を指定することが推奨されます。'b'
は陰性クラスで、'g'
は陽性クラスです。fitcnb
は、各予測子が条件付き正規分布に従うと仮定しています。
Mdl = fitcnb(X,Y,'ClassNames',{'b','g'});
Mdl
は学習させた ClassificationNaiveBayes
分類器です。
30% のホールドアウト標本を指定して、分類器を交差検証します。
CVMdl = crossval(Mdl,'Holdout',0.3)
CVMdl = ClassificationPartitionedModel CrossValidatedModel: 'NaiveBayes' PredictorNames: {'x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'x7' 'x8' 'x9' 'x10' 'x11' 'x12' 'x13' 'x14' 'x15' 'x16' 'x17' 'x18' 'x19' 'x20' 'x21' 'x22' 'x23' 'x24' 'x25' 'x26' 'x27' 'x28' 'x29' 'x30' 'x31' 'x32'} ResponseName: 'Y' NumObservations: 351 KFold: 1 Partition: [1x1 cvpartition] ClassNames: {'b' 'g'} ScoreTransform: 'none'
CVMdl
は、交差検証した単純ベイズ分類器 ClassificationPartitionedModel
です。
70% のデータを使用して学習させた分類器のプロパティを表示します。
TrainedModel = CVMdl.Trained{1}
TrainedModel = CompactClassificationNaiveBayes ResponseName: 'Y' CategoricalPredictors: [] ClassNames: {'b' 'g'} ScoreTransform: 'none' DistributionNames: {1x32 cell} DistributionParameters: {2x32 cell}
TrainedModel
は CompactClassificationNaiveBayes
分類器です。
CVMdl
を kfoldloss
に渡して、汎化誤差を推定します。
kfoldLoss(CVMdl)
ans = 0.2095
標本外の誤分類誤差は約 21% です。
上位 5 つの重要な予測子を選択して、汎化誤差を減らします。
idx = fscmrmr(X,Y); Xnew = X(:,idx(1:5));
新しい予測子向けに単純ベイズ分類器の学習を行います。
Mdlnew = fitcnb(Xnew,Y,'ClassNames',{'b','g'});
30% のホールドアウト標本を指定して新しい分類器を交差検証し、汎化誤差を推定します。
CVMdlnew = crossval(Mdlnew,'Holdout',0.3);
kfoldLoss(CVMdlnew)
ans = 0.1429
標本外の誤分類誤差が約 21% から約 14% まで減っています。
crossval
を使用した交差検証済みの回帰 GAM の作成
fitrgam
を使用して回帰一般化加法モデル (GAM) に学習させ、crossval
とホールドアウト オプションを使用して交差検証済み GAM を作成します。その後、kfoldPredict
を使用し、学習分割観測値に対して学習をさせたモデルを使用して、検証分割観測値の応答を予測します。
patients
データ セットを読み込みます。
load patients
予測子変数 (Age
、Diastolic
、Smoker
、Weight
、Gender
、SelfAssessedHealthStatus
) と応答変数 (Systolic
) を格納する table を作成します。
tbl = table(Age,Diastolic,Smoker,Weight,Gender,SelfAssessedHealthStatus,Systolic);
予測子の線形項が格納されている GAM に学習させます。
Mdl = fitrgam(tbl,'Systolic');
Mdl
は RegressionGAM
モデル オブジェクトです。
30% のホールドアウト標本を指定して、モデルを交差検証します。
rng('default') % For reproducibility CVMdl = crossval(Mdl,'Holdout',0.3)
CVMdl = RegressionPartitionedGAM CrossValidatedModel: 'GAM' PredictorNames: {'Age' 'Diastolic' 'Smoker' 'Weight' 'Gender' 'SelfAssessedHealthStatus'} CategoricalPredictors: [3 5 6] ResponseName: 'Systolic' NumObservations: 100 KFold: 1 Partition: [1x1 cvpartition] NumTrainedPerFold: [1x1 struct] ResponseTransform: 'none' IsStandardDeviationFit: 0
関数 crossval
は、ホールドアウト オプションを使用して RegressionPartitionedGAM
モデル オブジェクトの CVMdl
を作成します。交差検証時は、以下の手順が実行されます。
30% のデータを無作為に選択して検証データとして確保し、残りのデータを使用してモデルに学習をさせる。
コンパクトな学習済みモデルを交差検証済みモデル オブジェクト
RegressionPartitionedGAM
のTrained
プロパティに格納する。
名前と値の引数 'CrossVal'
、'CVPartition'
、'KFold'
または 'Leaveout'
を使用すると、別の交差検証の設定を選択できます。
kfoldPredict
を使用して検証分割観測値の応答を予測します。この関数は、学習分割観測値に対して学習をさせたモデルを使用して、検証分割観測値の応答を予測します。この関数では、学習分割観測値に NaN
が割り当てられます。
yFit = kfoldPredict(CVMdl);
検証分割観測値のインデックスを検出して、観測値のインデックス、観測された応答値および予測された応答値が格納されている table を作成します。table の最初の 8 行を表示します。
idx = find(~isnan(yFit)); t = table(idx,tbl.Systolic(idx),yFit(idx), ... 'VariableNames',{'Obseraction Index','Observed Value','Predicted Value'}); head(t)
Obseraction Index Observed Value Predicted Value _________________ ______________ _______________ 1 124 130.22 6 121 124.38 7 130 125.26 12 115 117.05 20 125 121.82 22 123 116.99 23 114 107 24 128 122.52
検証分割観測値の回帰誤差 (平均二乗誤差) を計算します。
L = kfoldLoss(CVMdl)
L = 43.8715
ECOC 分類器の交差検証
SVM バイナリ学習器による ECOC 分類器を交差検証し、一般化分類誤差を推定します。
フィッシャーのアヤメのデータ セットを読み込みます。予測子データ X
と応答データ Y
を指定します。
load fisheriris X = meas; Y = species; rng(1); % For reproducibility
SVM テンプレートを作成し、予測子を標準化します。
t = templateSVM('Standardize',true)
t = Fit template for SVM. Standardize: 1
t
は SVM テンプレートです。テンプレート オブジェクトのプロパティは、ほとんとが空です。ECOC 分類器に学習をさせると、該当するプロパティが既定値に設定されます。
ECOC 分類器に学習をさせ、クラスの順序を指定します。
Mdl = fitcecoc(X,Y,'Learners',t,... 'ClassNames',{'setosa','versicolor','virginica'});
Mdl
は ClassificationECOC
分類器です。ドット表記を使用してプロパティにアクセスできます。
10 分割交差検証を使用して Mdl
を交差検証します。
CVMdl = crossval(Mdl);
CVMdl
は ClassificationPartitionedECOC
交差検証 ECOC 分類器です。
一般化分類誤差を推定します。
genError = kfoldLoss(CVMdl)
genError = 0.0400
一般化分類誤差が 4% なので、ECOC 分類器がかなり良好に一般化を行うことがわかります。
入力引数
Mdl
— 機械学習モデル
完全な回帰モデル オブジェクト | 完全な分類モデル オブジェクト
機械学習モデル。完全な回帰または分類モデル オブジェクトとして指定します。サポートされるモデルは次の表に記載されています。
回帰モデル オブジェクト
モデル | 完全な回帰モデル オブジェクト |
---|---|
ガウス過程回帰 (GPR) モデル | RegressionGP (fitrgp の呼び出しでカスタムの ActiveSet 値を指定した場合は GPR モデルの交差検証は実行できない) |
一般化加法モデル (GAM) | RegressionGAM |
ニューラル ネットワーク モデル | RegressionNeuralNetwork |
アンサンブル回帰モデル | RegressionEnsemble |
サポート ベクター マシン回帰モデル | RegressionSVM |
回帰木モデル | RegressionTree |
分類モデル オブジェクト
モデル | 完全な分類モデル オブジェクト |
---|---|
一般化加法モデル | ClassificationGAM |
k 最近傍モデル | ClassificationKNN |
単純ベイズ モデル | ClassificationNaiveBayes |
ニューラル ネットワーク モデル | ClassificationNeuralNetwork |
1 クラスおよびバイナリ分類用のサポート ベクター マシン | ClassificationSVM |
判別分析分類器 | ClassificationDiscriminant |
マルチクラス誤り訂正出力符号 (ECOC) モデル | ClassificationECOC |
アンサンブル分類器 | ClassificationEnsemble |
マルチクラス分類用の二分決定木 | ClassificationTree |
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: crossval(Mdl,KFold=3)
は、交差検証済みモデルで 3 個の分割を使用するように指定します。
CVPartition
— 交差検証分割
[]
(既定値) | cvpartition
オブジェクト
交差検証分割。交差検証のタイプと学習セットおよび検証セットのインデックス付けを指定する cvpartition
オブジェクトとして指定します。
交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartition
、Holdout
、KFold
、Leaveout
の 4 つのうちのいずれかのみです。
例: cvp = cvpartition(500,KFold=5)
を使用して、500 個の観測値に対する 5 分割交差検証について無作為な分割を作成するとします。この場合、CVPartition=cvp
を設定して交差検証分割を指定できます。
Holdout
— ホールドアウト検証の対象データの比率
(0,1) の範囲のスカラー値
ホールドアウト検証に使用するデータの比率。範囲 [0,1] のスカラー値として指定します。Holdout=p
を指定した場合、以下の手順が実行されます。
p*100
% のデータを無作為に選択して検証データとして確保し、残りのデータを使用してモデルに学習をさせる。コンパクトな学習済みモデルを交差検証済みモデルの
Trained
プロパティに格納する。
交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartition
、Holdout
、KFold
、Leaveout
の 4 つのうちのいずれかのみです。
例: Holdout=0.1
データ型: double
| single
KFold
— 分割の数
10
(既定値) | 1 より大きい正の整数値
交差検証済みモデルで使用する分割の数。1 より大きい正の整数値として指定します。KFold=k
を指定した場合、以下の手順が実行されます。
データを無作為に
k
個のセットに分割する。各セットについて、そのセットを検証データとして確保し、他の
k
– 1 個のセットを使用してモデルに学習をさせる。k
個のコンパクトな学習済みモデルを、交差検証済みモデルのTrained
プロパティに含まれているk
行 1 列の cell ベクトルに格納する。
交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartition
、Holdout
、KFold
、Leaveout
の 4 つのうちのいずれかのみです。
例: KFold=5
データ型: single
| double
Leaveout
— Leave-one-out 法の交差検証のフラグ
"off"
(既定値) | "on"
Leave-one-out 法の交差検証のフラグ。"on"
または "off"
として指定します。Leaveout="on"
を指定した場合、n 個の観測値 (n は、モデルの NumObservations
プロパティで指定される、欠損観測値を除外した観測値の個数) のそれぞれについて以下の手順が実行されます。
いずれかの観測値を検証データとして確保し、他の n - 1 個の観測値を使用してモデルに学習をさせる。
n 個のコンパクトな学習済みモデルを、交差検証済みモデルの
Trained
プロパティに含まれている n 行 1 列の cell ベクトルに格納する。
交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartition
、Holdout
、KFold
、Leaveout
の 4 つのうちのいずれかのみです。
例: Leaveout="on"
データ型: char
| string
NPrint
— 出力頻度
"off"
(既定値) | 正の整数
出力頻度。正の整数または "off"
として指定します。
これまでに学習させた分割の数を追跡するには、正の整数 m を指定します。m 個の分割の学習が完了するたびにコマンド ラインにメッセージが表示されます。
"off"
を指定した場合、分割の学習が完了してもメッセージは表示されません。
メモ
Nprint
は Mdl
が ClassificationEnsemble
モデル オブジェクトまたは RegressionEnsemble
モデル オブジェクトの場合のみ指定できます。
例: NPrint=5
データ型: single
| double
| char
| string
Options
— 並列計算のオプション
構造体
並列計算のオプション。構造体として指定します。statset
を使用して Options
構造体を作成します。
並列計算を行うには、Parallel Computing Toolbox™ が必要です。
Options
は Mdl
が ClassificationECOC
モデル オブジェクトの場合のみ指定できます。
例: Options=statset(UseParallel=true)
データ型: struct
出力引数
CVMdl
— 交差検証された機械学習モデル
交差検証された (分割された) モデル オブジェクト
交差検証された機械学習モデル。入力モデル Mdl
に応じて、次の表の交差検証された (分割された) モデル オブジェクトのいずれかとして返されます。
回帰モデル オブジェクト
モデル | 回帰モデル (Mdl ) | 交差検証済みモデル (CVMdl ) |
---|---|---|
ガウス過程回帰モデル | RegressionGP | RegressionPartitionedGP |
一般化加法モデル | RegressionGAM | RegressionPartitionedGAM |
ニューラル ネットワーク モデル | RegressionNeuralNetwork | RegressionPartitionedNeuralNetwork |
アンサンブル回帰モデル | RegressionEnsemble | RegressionPartitionedEnsemble |
サポート ベクター マシン回帰モデル | RegressionSVM | RegressionPartitionedSVM |
回帰木モデル | RegressionTree | RegressionPartitionedModel |
分類モデル オブジェクト
モデル | 分類モデル (Mdl ) | 交差検証済みモデル (CVMdl ) |
---|---|---|
一般化加法モデル | ClassificationGAM | ClassificationPartitionedGAM |
k 最近傍モデル | ClassificationKNN | ClassificationPartitionedModel |
単純ベイズ モデル | ClassificationNaiveBayes | ClassificationPartitionedModel |
ニューラル ネットワーク モデル | ClassificationNeuralNetwork | ClassificationPartitionedModel |
1 クラスおよびバイナリ分類用のサポート ベクター マシン | ClassificationSVM | ClassificationPartitionedModel |
判別分析分類器 | ClassificationDiscriminant | ClassificationPartitionedModel |
マルチクラス誤り訂正出力符号 (ECOC) モデル | ClassificationECOC | ClassificationPartitionedECOC |
アンサンブル分類器 | ClassificationEnsemble | ClassificationPartitionedEnsemble |
マルチクラス分類用の二分決定木 | ClassificationTree | ClassificationPartitionedModel |
ヒント
交差検証データに対する
Mdl
の予測性能を評価するには、CVMdl
の "kfold" の関数とプロパティを使用します。分類の場合はkfoldPredict
、kfoldLoss
、kfoldMargin
、kfoldEdge
、回帰の場合はkfoldPredict
、kfoldLoss
などを使用できます。名前と値の引数
'KFold'
または'Holdout'
を使用して、層化区分で分割した分類器を返します。cvpartition
オブジェクトcvp
を作成するには、cvp =
cvpartition
(n,KFold=k)
を使用します。名前と値の引数'CVPartition',cvp
を使用して、非層化区分で分割した分類器を返します。
代替機能
モデルに学習させてから交差検証を行う代わりに、近似関数を使用して名前と値のペアの引数 CVPartition
、Holdout
、KFold
、Leaveout
のいずれかを指定することにより、交差検証済みモデルを直接作成できます。
拡張機能
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
この関数は、
ClassificationKNN
またはClassificationSVM
オブジェクトとして指定した学習済み分類モデルの GPU 配列を完全にサポートします。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2012a で導入R2023b: 交差検証回帰ニューラル ネットワーク モデルは RegressionPartitionedNeuralNetwork
オブジェクト
R2023b 以降では、交差検証回帰ニューラル ネットワーク モデルは RegressionPartitionedNeuralNetwork
オブジェクトです。以前のリリースでは、交差検証回帰ニューラル ネットワーク モデルは RegressionPartitionedModel
オブジェクトでした。
RegressionPartitionedNeuralNetwork
オブジェクトは 2 つの方法で作成できます。
オブジェクト関数
crossval
を使用して、回帰ニューラル ネットワーク モデル オブジェクトRegressionNeuralNetwork
から交差検証済みモデルを作成する。関数
fitrnet
を使用し、名前と値の引数CrossVal
、CVPartition
、Holdout
、KFold
、Leaveout
のいずれかを指定して、交差検証済みモデルを作成する。
R2022b: 交差検証ガウス過程回帰モデルは RegressionPartitionedGP
オブジェクト
R2022b 以降では、交差検証ガウス過程回帰 (GPR) モデルは RegressionPartitionedGP
オブジェクトです。以前のリリースでは、交差検証 GPR モデルは RegressionPartitionedModel
オブジェクトでした。
RegressionPartitionedGP
オブジェクトは 2 つの方法で作成できます。
オブジェクト関数
crossval
を使用して、GPR モデル オブジェクトRegressionGP
から交差検証済みモデルを作成する。関数
fitrgp
を使用し、名前と値の引数CrossVal
、CVPartition
、Holdout
、KFold
、Leaveout
のいずれかを指定して、交差検証済みモデルを作成する。
最初に GPR モデルの完全なモデルと交差検証済みモデルのどちらに学習させるかに関係なく、fitrgp
の呼び出しで ActiveSet
の値を指定することはできません。
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)