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: {1x34 cell}
               ResponseName: 'Y'
            NumObservations: 351
                      KFold: 10
                  Partition: [1x1 cvpartition]
                 ClassNames: {'b'  'g'}
             ScoreTransform: 'none'
    
    
      Properties, Methods
    
    

    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: [1x34 double]
                        Sigma: [1x34 double]
               SupportVectors: [78x34 double]
          SupportVectorLabels: [78x1 double]
    
    
      Properties, Methods
    
    

    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: {1x32 cell}
               ResponseName: 'Y'
            NumObservations: 351
                      KFold: 1
                  Partition: [1x1 cvpartition]
                 ClassNames: {'b'  'g'}
             ScoreTransform: 'none'
    
    
      Properties, Methods
    
    

    CVMdl は、交差検証した単純ベイズ分類器 ClassificationPartitionedModel です。

    70% のデータを使用して学習させた分類器のプロパティを表示します。

    TrainedModel = CVMdl.Trained{1}
    TrainedModel = 
      CompactClassificationNaiveBayes
                  ResponseName: 'Y'
         CategoricalPredictors: []
                    ClassNames: {'b'  'g'}
                ScoreTransform: 'none'
             DistributionNames: {1x32 cell}
        DistributionParameters: {2x32 cell}
    
    
      Properties, Methods
    
    

    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: {1x6 cell}
        CategoricalPredictors: [3 5 6]
                 ResponseName: 'Systolic'
              NumObservations: 100
                        KFold: 1
                    Partition: [1x1 cvpartition]
            NumTrainedPerFold: [1x1 struct]
            ResponseTransform: 'none'
    
    
      Properties, Methods
    
    

    関数 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)
    ans=8×3 table
        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
    

    入力引数

    すべて折りたたむ

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

    回帰モデル オブジェクト

    モデル完全な回帰モデル オブジェクト
    一般化加法モデルRegressionGAM
    ニューラル ネットワーク モデルRegressionNeuralNetwork

    分類モデル オブジェクト

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

    名前と値のペアの引数

    オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

    例: 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)交差検証済みモデル (CompactMdl)
    一般化加法モデルRegressionGAMRegressionPartitionedGAM
    ニューラル ネットワーク モデルRegressionNeuralNetworkRegressionPartitionedModel

    分類モデル オブジェクト

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

    ヒント

    • 関数 kfold と、kfoldPredictkfoldLoss などの CVMdl のプロパティを使用して、交差検証データに対する Mdl の予測性能を評価します。

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

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

    代替機能

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

    拡張機能

    R2012a で導入