メインコンテンツ

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: [1×1 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: [78×1 double]
                         Bias: -0.2209
             KernelParameters: [1×1 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 … ] (1×34 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 … ] (1×34 double)
               SupportVectors: [78×34 double]
          SupportVectorLabels: [78×1 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: {'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: [1×1 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: {1×32 cell}
        DistributionParameters: {2×32 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: {'Age'  'Diastolic'  'Smoker'  'Weight'  'Gender'  'SelfAssessedHealthStatus'}
         CategoricalPredictors: [3 5 6]
                  ResponseName: 'Systolic'
               NumObservations: 100
                         KFold: 1
                     Partition: [1×1 cvpartition]
             NumTrainedPerFold: [1×1 struct]
             ResponseTransform: 'none'
        IsStandardDeviationFit: 0
    
    
      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)
        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 分類器がかなり良好に一般化を行うことがわかります。

    最初にホールドアウト検証を使用して分割し、次に 5 分割交差検証を使用して分割した分位点ニューラル ネットワーク回帰モデルについて、それぞれの分位点損失を計算します。2 つの損失を比較します。

    carbig データ セットを読み込みます。このデータ セットには、1970 年代と 1980 年代初期に製造された自動車の測定値が格納されています。AccelerationCylindersDisplacement などの予測子変数と応答変数 MPG が格納された table を作成します。最初の 8 つの観測値を表示します。

    load carbig
    cars = table(Acceleration,Cylinders,Displacement, ...
        Horsepower,Model_Year,Origin,Weight,MPG);
    head(cars)
        Acceleration    Cylinders    Displacement    Horsepower    Model_Year    Origin     Weight    MPG
        ____________    _________    ____________    __________    __________    _______    ______    ___
    
              12            8            307            130            70        USA         3504     18 
            11.5            8            350            165            70        USA         3693     15 
              11            8            318            150            70        USA         3436     18 
              12            8            304            150            70        USA         3433     16 
            10.5            8            302            140            70        USA         3449     17 
              10            8            429            198            70        USA         4341     15 
               9            8            454            220            70        USA         4354     14 
             8.5            8            440            215            70        USA         4312     14 
    

    cars から table に欠損値がある行を削除します。

    cars = rmmissing(cars);

    米国製かどうかに基づいて、自動車を分類します。

    cars.Origin = categorical(cellstr(cars.Origin));
    cars.Origin = mergecats(cars.Origin,["France","Japan",...
        "Germany","Sweden","Italy","England"],"NotUSA");

    データの分割には cvpartition を使用します。まず、観測値の約 80% を学習データ、約 20% をテスト データに使用して、ホールドアウト検証用の分割を作成します。次に、5 分割交差検証用の分割を作成します。

    rng(0,"twister") % For reproducibility
    holdoutPartition = cvpartition(height(cars),Holdout=0.20);
    kfoldPartition = cvpartition(height(cars),KFold=5);

    cars のデータを使用して分位点ニューラル ネットワーク回帰モデルに学習させます。MPG を応答変数として指定し、数値予測子を標準化します。既定の 0.5 分位数 (中央値) を使用します。

    Mdl = fitrqnet(cars,"MPG",Standardize=true);

    crossval を使用して、分割された分位点回帰モデルを作成します。

    holdoutMdl = crossval(Mdl,CVPartition=holdoutPartition)
    holdoutMdl = 
      RegressionPartitionedQuantileModel
          CrossValidatedModel: 'QuantileNeuralNetwork'
               PredictorNames: {'Acceleration'  'Cylinders'  'Displacement'  'Horsepower'  'Model_Year'  'Origin'  'Weight'}
        CategoricalPredictors: 6
                 ResponseName: 'MPG'
              NumObservations: 392
                        KFold: 1
                    Partition: [1×1 cvpartition]
            ResponseTransform: 'none'
                    Quantiles: 0.5000
    
    
      Properties, Methods
    
    
    kfoldMdl = crossval(Mdl,CVPartition=kfoldPartition)
    kfoldMdl = 
      RegressionPartitionedQuantileModel
          CrossValidatedModel: 'QuantileNeuralNetwork'
               PredictorNames: {'Acceleration'  'Cylinders'  'Displacement'  'Horsepower'  'Model_Year'  'Origin'  'Weight'}
        CategoricalPredictors: 6
                 ResponseName: 'MPG'
              NumObservations: 392
                        KFold: 5
                    Partition: [1×1 cvpartition]
            ResponseTransform: 'none'
                    Quantiles: 0.5000
    
    
      Properties, Methods
    
    

    kfoldLoss オブジェクト関数を使用して、holdoutMdlkfoldMdl の分位点損失を計算します。

    holdoutL = kfoldLoss(holdoutMdl)
    holdoutL = 
    0.9488
    
    kfoldL = kfoldLoss(kfoldMdl)
    kfoldL = 
    0.9628
    

    holdoutL は 1 つのホールドアウト セットを使用して計算された分位点損失で、kfoldL は 5 つのホールドアウト セットを使用して計算された平均分位点損失です。未観測データに対するモデルの性能については、交差検証のメトリクスの方が優れた指標となる傾向があります。

    入力引数

    すべて折りたたむ

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

    分類モデル オブジェクト

    モデル完全な分類モデル オブジェクト
    判別分析分類器ClassificationDiscriminant
    マルチクラス誤り訂正出力符号 (ECOC) モデルClassificationECOC
    アンサンブル分類器ClassificationEnsemble, ClassificationBaggedEnsemble
    一般化加法モデルClassificationGAM
    k 最近傍モデルClassificationKNN
    単純ベイズ モデルClassificationNaiveBayes
    ニューラル ネットワーク モデルClassificationNeuralNetwork
    1 クラスおよびバイナリ分類用のサポート ベクター マシンClassificationSVM
    マルチクラス分類用の二分決定木ClassificationTree

    回帰モデル オブジェクト

    モデル完全な回帰モデル オブジェクト
    アンサンブル回帰モデルRegressionEnsemble, RegressionBaggedEnsemble
    ガウス過程回帰 (GPR) モデルRegressionGP (fitrgp の呼び出しでカスタムの ActiveSet 値を指定した場合は GPR モデルの交差検証は実行できない)
    一般化加法モデル (GAM)RegressionGAM
    ニューラル ネットワーク モデルRegressionNeuralNetwork (fitrnet の呼び出しで複数の応答変数を使用した場合はニューラル ネットワーク モデルの交差検証は実行できない)
    サポート ベクター マシン回帰モデルRegressionSVM
    回帰木モデルRegressionTree

    分位点回帰モデル オブジェクト

    モデル完全な分位点回帰モデル オブジェクト

    分位点線形回帰モデル (R2025a 以降)

    RegressionQuantileLinear

    回帰用の分位点ニューラル ネットワーク モデル (R2025a 以降)

    RegressionQuantileNeuralNetwork

    名前と値の引数

    すべて折りたたむ

    オプションの引数のペアを 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)
    判別分析分類器ClassificationDiscriminantClassificationPartitionedModel
    マルチクラス誤り訂正出力符号 (ECOC) モデルClassificationECOCClassificationPartitionedECOC
    アンサンブル分類器ClassificationEnsemble, ClassificationBaggedEnsembleClassificationPartitionedEnsemble
    一般化加法モデルClassificationGAMClassificationPartitionedGAM
    k 最近傍モデルClassificationKNNClassificationPartitionedModel
    単純ベイズ モデルClassificationNaiveBayesClassificationPartitionedModel
    ニューラル ネットワーク モデルClassificationNeuralNetworkClassificationPartitionedModel
    1 クラスおよびバイナリ分類用のサポート ベクター マシンClassificationSVMClassificationPartitionedModel
    マルチクラス分類用の二分決定木ClassificationTreeClassificationPartitionedModel

    回帰モデル オブジェクト

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

    分位点回帰モデル オブジェクト

    モデル分位点回帰モデル (Mdl)交差検証済みモデル (CVMdl)

    分位点線形回帰モデル (R2025a 以降)

    RegressionQuantileLinearRegressionPartitionedQuantileModel

    回帰用の分位点ニューラル ネットワーク モデル (R2025a 以降)

    RegressionQuantileNeuralNetworkRegressionPartitionedQuantileModel

    ヒント

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

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

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

    代替機能

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

    拡張機能

    すべて展開する

    バージョン履歴

    R2012a で導入

    すべて展開する