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
    

    入力引数

    すべて折りたたむ

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

    回帰モデル オブジェクト

    モデル完全な回帰モデル オブジェクト
    ガウス過程回帰 (GPR) モデルRegressionGP (fitrgp の呼び出しでカスタムの 'ActiveSet' を指定した場合は GPR モデルの交差検証は実行できない)
    一般化加法モデル (GAM)RegressionGAM
    ニューラル ネットワーク モデルRegressionNeuralNetwork

    分類モデル オブジェクト

    モデル完全な分類モデル オブジェクト
    一般化加法モデルClassificationGAM
    k 最近傍モデルClassificationKNN
    単純ベイズ モデルClassificationNaiveBayes
    ニューラル ネットワーク モデルClassificationNeuralNetwork
    1 クラスおよびバイナリ分類用のサポート ベクター マシンClassificationSVM

    名前と値の引数

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

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

    例: crossval(Mdl,'KFold',3) は、3 つの分割を交差検証済みモデルで使用することを指定します。

    交差検証分割。cvpartition で作成した cvpartition 分割オブジェクトとして指定します。分割オブジェクトは、交差検証のタイプと、学習セットおよび検証セットのインデックス付けを指定します。

    指定できる名前と値の引数は、'CVPartition''Holdout''KFold''Leaveout' の 4 つのうちのいずれかのみです。

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

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

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

    2. コンパクトな学習済みモデルを交差検証済みモデルの Trained プロパティに格納する。Mdl に対応するコンパクトなオブジェクトがない場合、Trained には完全なオブジェクトが格納される。

    指定できる名前と値の引数は、'CVPartition''Holdout''KFold''Leaveout' の 4 つのうちのいずれかのみです。

    例: 'Holdout',0.1

    データ型: double | single

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

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

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

    3. k 個のコンパクトな学習済みモデルを、交差検証済みモデルの Trained プロパティに含まれている k 行 1 列の cell ベクトルに格納する。Mdl に対応するコンパクトなオブジェクトがない場合、Trained には完全なオブジェクトが格納される。

    指定できる名前と値の引数は、'CVPartition''Holdout''KFold''Leaveout' の 4 つのうちのいずれかのみです。

    例: 'KFold',5

    データ型: single | double

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

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

    2. n 個のコンパクトな学習済みモデルを、交差検証済みモデルの Trained プロパティに含まれている n 行 1 列の cell ベクトルに格納する。Mdl に対応するコンパクトなオブジェクトがない場合、Trained には完全なオブジェクトが格納される。

    指定できる名前と値の引数は、'CVPartition''Holdout''KFold''Leaveout' の 4 つのうちのいずれかのみです。

    例: 'Leaveout','on'

    出力引数

    すべて折りたたむ

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

    回帰モデル オブジェクト

    モデル回帰モデル (Mdl)交差検証済みモデル (CVMdl)
    ガウス過程回帰モデルRegressionGPRegressionPartitionedGP
    一般化加法モデルRegressionGAMRegressionPartitionedGAM
    ニューラル ネットワーク モデルRegressionNeuralNetworkRegressionPartitionedNeuralNetwork

    分類モデル オブジェクト

    モデル分類モデル (Mdl)交差検証済みモデル (CVMdl)
    一般化加法モデルClassificationGAMClassificationPartitionedGAM
    k 最近傍モデルClassificationKNNClassificationPartitionedModel
    単純ベイズ モデルClassificationNaiveBayesClassificationPartitionedModel
    ニューラル ネットワーク モデルClassificationNeuralNetworkClassificationPartitionedModel
    1 クラスおよびバイナリ分類用のサポート ベクター マシンClassificationSVMClassificationPartitionedModel

    ヒント

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

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

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

    代替機能

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

    拡張機能

    バージョン履歴

    R2012a で導入

    すべて展開する