Main Content

crossval

機械学習モデルの交差検証

    説明

    CVMdl = crossval(Mdl) は、学習済みモデル (Mdl) から、交差検証された (分割された) 機械学習モデル (CVMdl) を返します。既定では、crossval は学習データに対して 10 分割交差検証を使用します。

    CVMdl = crossval(Mdl,Name=Value) では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、ホールドアウト検証の対象データの比率や交差検証済みモデルで使用する分割数を指定できます。

    すべて折りたたむ

    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'
    
    
    

    CVSVMModelClassificationPartitionedModel 交差検証分類器です。交差検証時は、以下の手順が実行されます。

    1. データを同じサイズの 10 個のセットに無作為に分割する。

    2. 9 個のセットに対して SVM 分類器に学習をさせる。

    3. 手順 1 および 2 を k = 10 回繰り返す。毎回、1 個の分割が除外され、残りの 9 個について学習が行われます。

    4. 各分割について汎化統計量を結合する。

    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 分類器です。

    CVSVMModelkfoldLoss に渡すと、汎化誤差を推定できます。

    交差検証のホールドアウト標本比率を指定します。既定では、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}
    
    
    

    TrainedModelCompactClassificationNaiveBayes 分類器です。

    CVMdlkfoldloss に渡して、汎化誤差を推定します。

    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% まで減っています。

    fitrgam を使用して回帰一般化加法モデル (GAM) に学習させ、crossval とホールドアウト オプションを使用して交差検証済み GAM を作成します。その後、kfoldPredict を使用し、学習分割観測値に対して学習をさせたモデルを使用して、検証分割観測値の応答を予測します。

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

    load patients

    予測子変数 (AgeDiastolicSmokerWeightGenderSelfAssessedHealthStatus) と応答変数 (Systolic) を格納する table を作成します。

    tbl = table(Age,Diastolic,Smoker,Weight,Gender,SelfAssessedHealthStatus,Systolic);

    予測子の線形項が格納されている GAM に学習させます。

    Mdl = fitrgam(tbl,'Systolic');

    MdlRegressionGAM モデル オブジェクトです。

    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 を作成します。交差検証時は、以下の手順が実行されます。

    1. 30% のデータを無作為に選択して検証データとして確保し、残りのデータを使用してモデルに学習をさせる。

    2. コンパクトな学習済みモデルを交差検証済みモデル オブジェクト RegressionPartitionedGAMTrained プロパティに格納する。

    名前と値の引数 '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
    

    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'});

    MdlClassificationECOC 分類器です。ドット表記を使用してプロパティにアクセスできます。

    10 分割交差検証を使用して Mdl を交差検証します。

    CVMdl = crossval(Mdl);

    CVMdlClassificationPartitionedECOC 交差検証 ECOC 分類器です。

    一般化分類誤差を推定します。

    genError = kfoldLoss(CVMdl)
    genError = 0.0400
    

    一般化分類誤差が 4% なので、ECOC 分類器がかなり良好に一般化を行うことがわかります。

    入力引数

    すべて折りたたむ

    機械学習モデル。完全な回帰または分類モデル オブジェクトとして指定します。サポートされるモデルは次の表に記載されています。

    回帰モデル オブジェクト

    モデル完全な回帰モデル オブジェクト
    ガウス過程回帰 (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 オブジェクトとして指定します。

    交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartitionHoldoutKFoldLeaveout の 4 つのうちのいずれかのみです。

    例: cvp = cvpartition(500,KFold=5) を使用して、500 個の観測値に対する 5 分割交差検証について無作為な分割を作成するとします。この場合、CVPartition=cvp を設定して交差検証分割を指定できます。

    ホールドアウト検証に使用するデータの比率。範囲 [0,1] のスカラー値として指定します。Holdout=p を指定した場合、以下の手順が実行されます。

    1. p*100% のデータを無作為に選択して検証データとして確保し、残りのデータを使用してモデルに学習をさせる。

    2. コンパクトな学習済みモデルを交差検証済みモデルの Trained プロパティに格納する。

    交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartitionHoldoutKFoldLeaveout の 4 つのうちのいずれかのみです。

    例: Holdout=0.1

    データ型: double | single

    交差検証済みモデルで使用する分割の数。1 より大きい正の整数値として指定します。KFold=k を指定した場合、以下の手順が実行されます。

    1. データを無作為に k 個のセットに分割する。

    2. 各セットについて、そのセットを検証データとして確保し、他の k – 1 個のセットを使用してモデルに学習をさせる。

    3. k 個のコンパクトな学習済みモデルを、交差検証済みモデルの Trained プロパティに含まれている k 行 1 列の cell ベクトルに格納する。

    交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartitionHoldoutKFoldLeaveout の 4 つのうちのいずれかのみです。

    例: KFold=5

    データ型: single | double

    Leave-one-out 法の交差検証のフラグ。"on" または "off" として指定します。Leaveout="on" を指定した場合、n 個の観測値 (n は、モデルの NumObservations プロパティで指定される、欠損観測値を除外した観測値の個数) のそれぞれについて以下の手順が実行されます。

    1. いずれかの観測値を検証データとして確保し、他の n - 1 個の観測値を使用してモデルに学習をさせる。

    2. n 個のコンパクトな学習済みモデルを、交差検証済みモデルの Trained プロパティに含まれている n 行 1 列の cell ベクトルに格納する。

    交差検証済みモデルの作成で指定できる名前と値の引数は、CVPartitionHoldoutKFoldLeaveout の 4 つのうちのいずれかのみです。

    例: Leaveout="on"

    データ型: char | string

    出力頻度。正の整数または "off" として指定します。

    これまでに学習させた分割の数を追跡するには、正の整数 m を指定します。m 個の分割の学習が完了するたびにコマンド ラインにメッセージが表示されます。

    "off" を指定した場合、分割の学習が完了してもメッセージは表示されません。

    メモ

    NprintMdlClassificationEnsemble モデル オブジェクトまたは RegressionEnsemble モデル オブジェクトの場合のみ指定できます。

    例: NPrint=5

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

    並列計算のオプション。構造体として指定します。statset を使用して Options 構造体を作成します。

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

    OptionsMdlClassificationECOC モデル オブジェクトの場合のみ指定できます。

    例: Options=statset(UseParallel=true)

    データ型: struct

    出力引数

    すべて折りたたむ

    交差検証された機械学習モデル。入力モデル Mdl に応じて、次の表の交差検証された (分割された) モデル オブジェクトのいずれかとして返されます。

    回帰モデル オブジェクト

    モデル回帰モデル (Mdl)交差検証済みモデル (CVMdl)
    ガウス過程回帰モデルRegressionGPRegressionPartitionedGP
    一般化加法モデルRegressionGAMRegressionPartitionedGAM
    ニューラル ネットワーク モデルRegressionNeuralNetworkRegressionPartitionedNeuralNetwork
    アンサンブル回帰モデルRegressionEnsembleRegressionPartitionedEnsemble
    サポート ベクター マシン回帰モデルRegressionSVMRegressionPartitionedSVM
    回帰木モデルRegressionTreeRegressionPartitionedModel

    分類モデル オブジェクト

    モデル分類モデル (Mdl)交差検証済みモデル (CVMdl)
    一般化加法モデルClassificationGAMClassificationPartitionedGAM
    k 最近傍モデルClassificationKNNClassificationPartitionedModel
    単純ベイズ モデルClassificationNaiveBayesClassificationPartitionedModel
    ニューラル ネットワーク モデルClassificationNeuralNetworkClassificationPartitionedModel
    1 クラスおよびバイナリ分類用のサポート ベクター マシンClassificationSVMClassificationPartitionedModel
    判別分析分類器ClassificationDiscriminantClassificationPartitionedModel
    マルチクラス誤り訂正出力符号 (ECOC) モデルClassificationECOCClassificationPartitionedECOC
    アンサンブル分類器ClassificationEnsembleClassificationPartitionedEnsemble
    マルチクラス分類用の二分決定木ClassificationTreeClassificationPartitionedModel

    ヒント

    • 交差検証データに対する Mdl の予測性能を評価するには、CVMdl の "kfold" の関数とプロパティを使用します。分類の場合は kfoldPredictkfoldLosskfoldMarginkfoldEdge、回帰の場合は kfoldPredictkfoldLoss などを使用できます。

    • 名前と値の引数 'KFold' または 'Holdout' を使用して、層化区分で分割した分類器を返します。

    • cvpartition オブジェクト cvp を作成するには、cvp = cvpartition(n,KFold=k) を使用します。名前と値の引数 'CVPartition',cvp を使用して、非層化区分で分割した分類器を返します。

    代替機能

    モデルに学習させてから交差検証を行う代わりに、近似関数を使用して名前と値のペアの引数 CVPartitionHoldoutKFoldLeaveout のいずれかを指定することにより、交差検証済みモデルを直接作成できます。

    拡張機能

    バージョン履歴

    R2012a で導入

    すべて展開する