Main Content

ClassificationPartitionedGAM

分類用の交差検証済みの一般化加法モデル (GAM)

R2021a 以降

    説明

    ClassificationPartitionedGAM は、交差検証分割で学習を行った一般化加法モデルのセットです。kfold 関数 kfoldPredictkfoldLosskfoldMarginkfoldEdgekfoldfun を 1 つ以上使用して、交差検証分類の品質を評価します。

    すべての kfold オブジェクト関数では、学習分割 (分割内) 観測値で学習させたモデルを使用して検証分割 (分割外) 観測値に対する応答を予測します。たとえば、データを 5 つに分割して交差検証を行うとします。ほぼ等しいサイズの 5 つのグループに各観測値が無作為に割り当てられます。"学習分割" にはグループのうち 4 つ (データの約 4/5) が含まれ、"検証分割" には他のグループ (データの約 1/5) が含まれます。この場合、交差検証は次のように処理されます。

    1. (CVMdl.Trained{1} に格納されている) 1 番目のモデルの学習には最後の 4 つのグループの観測値が使用され、1 番目のグループの観測値は検証用に確保されます。

    2. (CVMdl.Trained{2} に格納されている) 2 番目のモデルの学習には、1 番目のグループと最後の 3 つのグループの観測値が使用されます。2 番目のグループの観測値は、検証用に予約されます。

    3. 3 番目、4 番目および 5 番目のモデルに対しても同様に続けられます。

    kfoldPredict を使用して検証する場合、i 番目のモデルを使用してグループ i の観測値について予測が計算されます。つまり、それぞれの観測値に対する応答は、その観測値を使用せずに学習させたモデルによって推定されます。

    作成

    ClassificationPartitionedGAM モデルは 2 つの方法で作成できます。

    • オブジェクト関数 crossval を使用して、GAM オブジェクト ClassificationGAM から交差検証済みモデルを作成する。

    • 関数 fitcgam を使用し、名前と値の引数 'CrossVal''CVPartition''Holdout''KFold''Leaveout' のいずれかを指定して、交差検証済みモデルを作成する。

    プロパティ

    すべて展開する

    交差検証のプロパティ

    この プロパティ は読み取り専用です。

    交差検証済みモデルの名前。'GAM' として指定されます。

    この プロパティ は読み取り専用です。

    交差検証された分割の数。正の整数で指定します。

    データ型: double

    この プロパティ は読み取り専用です。

    交差検証パラメーター値。オブジェクトを指定します。パラメーター値は、一般化加法モデルの交差検証に使用した名前と値の引数の値に対応します。推定されたパラメーターは ModelParameters に含まれません。

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

    この プロパティ は読み取り専用です。

    データを交差検証分割に分割する方法を含むデータ分割。cvpartition モデルとして指定します。

    この プロパティ は読み取り専用です。

    交差検証分割で学習させたコンパクトな分類器。CompactClassificationGAM モデル オブジェクトの cell 配列として指定されます。Trained には k 個のセルがあります。k は分割数です。

    データ型: cell

    他の分類のプロパティ

    この プロパティ は読み取り専用です。

    カテゴリカル予測子のインデックス。正の整数のベクトルとして指定します。CategoricalPredictors には、対応する予測子がカテゴリカルであることを示すインデックス値が格納されます。インデックス値の範囲は 1 ~ p です。p はモデルの学習に使用した予測子の数です。どの予測子もカテゴリカルではない場合、このプロパティは空 ([]) になります。

    データ型: double

    この プロパティ は読み取り専用です。

    学習で使用する一意なクラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。ClassNames のデータ型はクラス ラベル Y と同じです。(string 配列は文字ベクトルの cell 配列として扱われます)。ClassNames はクラスの順序も決定します。

    データ型: single | double | logical | char | cell | categorical

    誤分類コスト。2 行 2 列の数値行列として指定されます。

    Cost(i,j) は、真のクラスが i である点をクラス j に分類するコストです。Cost の行と列の順序は、ClassNames のクラスの順序に対応します。

    Cost の値は予測に使用されますが、学習には使用されません。値はドット表記を使用して変更できます。

    例: Mdl.Cost = C;

    データ型: double

    この プロパティ は読み取り専用です。

    X および Y に格納されている学習データ内の観測値の個数。数値スカラーを指定します。

    データ型: double

    この プロパティ は読み取り専用です。

    予測子変数の名前。文字ベクトルの cell 配列を指定します。PredictorNames の要素の順序は、予測子名が学習データに現れる順序に対応します。

    データ型: cell

    この プロパティ は読み取り専用です。

    クラスの事前確率。2 要素の数値ベクトルとして指定されます。要素の順序は ClassNames における要素の順序に対応します。

    データ型: double

    この プロパティ は読み取り専用です。

    応答変数名。文字ベクトルを指定します。

    データ型: char

    スコア変換。文字ベクトルまたは関数ハンドルを指定します。ScoreTransform は、組み込みの変換関数または予測した分類スコアを変換する関数のハンドルを表します。

    スコア変換関数を function などに変更するには、ドット表記を使用します。

    • 組み込み関数の場合は、文字ベクトルを入力します。

      Mdl.ScoreTransform = 'function';

      次の表は、使用可能な組み込み関数の一覧です。

      説明
      'doublelogit'1/(1 + e–2x)
      'invlogit'log(x / (1 – x))
      'ismax'最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを 0 に設定する
      'logit'1/(1 + e–x)
      'none' または 'identity'x (変換なし)
      'sign'x < 0 のとき –1
      x = 0 のとき 0
      x > 0 のとき 1
      'symmetric'2x – 1
      'symmetricismax'最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを –1 に設定する
      'symmetriclogit'2/(1 + e–x) – 1

    • MATLAB® 関数やユーザー定義関数の場合は、関数ハンドルを入力します。

      Mdl.ScoreTransform = @function;

      function は、行列 (元のスコア) を受け入れて同じサイズの行列 (変換したスコア) を返さなければなりません。

    このプロパティによって、kfoldPredictkfoldMarginkfoldEdge などのオブジェクト関数で使用する出力スコアの計算が決まります。事後確率の計算には 'logit'、事後確率のロジットの計算には 'none' を使用します。

    データ型: char | function_handle

    この プロパティ は読み取り専用です。

    モデルの学習に使用された観測値の重み。n 行 1 列の数値ベクトルとして指定されます。n は観測値の個数 (NumObservations) です。

    特定のクラスにおける W の要素の合計がそのクラスの事前確率になるように、名前と値の引数 'Weights' で指定された観測値の重みが正規化されます。

    データ型: double

    この プロパティ は読み取り専用です。

    モデルの交差検証に使用された予測子。数値行列または table として指定されます。

    X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。

    データ型: single | double | table

    この プロパティ は読み取り専用です。

    モデルの交差検証に使用されたクラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として指定されます。Y のデータ型はモデルの学習に使用された応答変数と同じです。(string 配列は文字ベクトルの cell 配列として扱われます)。

    Y の各行は、X の対応する行の観測された分類を表します。

    データ型: single | double | logical | char | cell | categorical

    オブジェクト関数

    kfoldPredict交差検証済み分類モデルの観測値の分類
    kfoldLoss交差検証済み分類モデルの分類損失
    kfoldMargin交差検証済み分類モデルの分類マージン
    kfoldEdge交差検証済み分類モデルの分類エッジ
    kfoldfun分類での関数の交差検証

    すべて折りたたむ

    fitcgam を使用して、交差検証済みの 10 分割 (既定の交差検証オプション) の GAM に学習させます。その後、kfoldPredict を使用し、学習分割観測値に対して学習させたモデルを使用して、検証分割観測値のクラス ラベルを予測します。

    ionosphere データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子と、不良 ('b') または良好 ('g') という 351 個の二項反応が含まれています。

    load ionosphere

    既定の交差検証オプションを使用して交差検証済み GAM を作成します。名前と値の引数 'CrossVal''on' として指定します。

    rng('default') % For reproducibility
    CVMdl = fitcgam(X,Y,'CrossVal','on')
    CVMdl = 
      ClassificationPartitionedGAM
        CrossValidatedModel: 'GAM'
             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]
          NumTrainedPerFold: [1x1 struct]
                 ClassNames: {'b'  'g'}
             ScoreTransform: 'logit'
    
    
    

    関数 fitcgam で 10 分割の ClassificationPartitionedGAM モデル オブジェクト CVMdl が作成されます。交差検証時は、以下の手順が実行されます。

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

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

    3. 10 個のコンパクトな学習済みモデルを交差検証済みモデル オブジェクト ClassificationPartitionedGAMTrained プロパティに 10 行 1 列の cell ベクトルとして格納する。

    既定の交差検証の設定は、名前と値の引数 'CVPartition''Holdout''KFold''Leaveout' を使用してオーバーライドできます。

    kfoldPredict を使用して X の観測値を分類します。それぞれの観測値に対するクラス ラベルが、その観測値を使用せずに学習させたモデルを使用して予測されます。

    label = kfoldPredict(CVMdl);

    混同行列を作成して、観測値の真のクラスを予測されたラベルと比較します。

    C = confusionchart(Y,label);

    Figure contains an object of type ConfusionMatrixChart.

    分類誤差を計算します。

    L = kfoldLoss(CVMdl)
    L = 0.0712
    

    10 個の分割の平均誤分類率は約 7%です。

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

    census1994.mat に保存されている 1994 年の国勢調査データを読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。この分類タスクでは、年齢、労働階級、教育レベル、婚姻区分、人種などが与えられた人の給与カテゴリを予測するモデルを当てはめます。

    load census1994

    census1994 には学習データ セット adultdata およびテスト データ セット adulttest が含まれています。この例では、実行時間を短縮するために、関数datasampleを使用して adultdata から 500 の学習観測値をサブサンプリングします。

    rng('default')
    NumSamples = 5e2;
    adultdata = datasample(adultdata,NumSamples,'Replace',false);

    予測子の線形項と交互作用項の両方が格納されている GAM に学習させます。p 値が 0.05 以下である利用可能な交互作用項をすべて含めるように指定します。

    Mdl = fitcgam(adultdata,'salary','Interactions','all','MaxPValue',0.05);

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

    30% のホールドアウト標本を指定して、モデルを交差検証します。

    CVMdl = crossval(Mdl,'Holdout',0.3)
    CVMdl = 
      ClassificationPartitionedGAM
          CrossValidatedModel: 'GAM'
               PredictorNames: {'age'  'workClass'  'fnlwgt'  'education'  'education_num'  'marital_status'  'occupation'  'relationship'  'race'  'sex'  'capital_gain'  'capital_loss'  'hours_per_week'  'native_country'}
        CategoricalPredictors: [2 4 6 7 8 9 10 14]
                 ResponseName: 'salary'
              NumObservations: 500
                        KFold: 1
                    Partition: [1x1 cvpartition]
            NumTrainedPerFold: [1x1 struct]
                   ClassNames: [<=50K    >50K]
               ScoreTransform: 'logit'
    
    
    

    関数 crossval は、ホールドアウト オプションを使用して ClassificationPartitionedGAM モデル オブジェクトの CVMdl を作成します。交差検証時は、以下の手順が実行されます。

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

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

    名前と値の引数 'CrossVal''CVPartition''KFold' または 'Leaveout' を使用すると、別の交差検証の設定を選択できます。

    kfoldPredict を使用して検証分割観測値を分類します。この関数は、学習分割観測値に対して学習させたモデルを使用して、検証分割観測値のクラス ラベルを予測します。この関数では、最も頻繁に予測されたラベルが学習分割観測値に割り当てられます。

    [labels,scores] = kfoldPredict(CVMdl);

    検証分割観測値を検出します。kfoldPredict は、学習分割観測値の両方のクラスに対してスコア 0 を返します。したがって、スコアがいずれもゼロである観測値を調べれば検証分割観測値を特定できます。

    idx = find(sum(abs(scores),2)~=0);

    混同行列を作成して、観測値の真のクラスを予測されたラベルと比較し、検証分割観測値の分類誤差を計算します。

    C = confusionchart(adultdata.salary(idx),labels(idx));

    Figure contains an object of type ConfusionMatrixChart.

    L = kfoldLoss(CVMdl)
    L = 0.1800
    

    交差検証済みの 10 分割の一般化加法モデル (GAM) に学習させます。その後、kfoldLoss を使用して交差検証の累積分類誤差 (10 進数の誤分類率) を計算します。誤差を使用して、予測子 (予測子の線形項) あたりの最適な木の数と交互作用項あたりの最適な木の数を特定します。

    代わりに、名前と値の引数OptimizeHyperparametersを使用して fitcgam の名前と値の引数の最適な値を特定することもできます。例については、OptimizeHyperparameters を使用した GAM の最適化を参照してください。

    ionosphere データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子と、不良 ('b') または良好 ('g') という 351 個の二項反応が含まれています。

    load ionosphere

    既定の交差検証オプションを使用して交差検証済み GAM を作成します。名前と値の引数 'CrossVal''on' として指定します。p 値が 0.05 以下である利用可能な交互作用項をすべて含めるように指定します。

    rng('default') % For reproducibility
    CVMdl = fitcgam(X,Y,'CrossVal','on','Interactions','all','MaxPValue',0.05);

    'Mode''cumulative' として指定すると、関数 kfoldLoss は累積誤差を返します。これは、各分割に同じ数の木を使用して取得したすべての分割の平均誤差です。各分割の木の数を表示します。

    CVMdl.NumTrainedPerFold 
    ans = struct with fields:
          PredictorTrees: [65 64 59 61 60 66 65 62 64 61]
        InteractionTrees: [1 2 2 2 2 1 2 2 2 2]
    
    

    kfoldLoss では、最大で 59 個の予測子木と 1 個の交互作用木を使用して累積誤差を計算できます。

    10 分割交差検証を行った累積分類誤差 (10 進数の誤分類率) をプロットします。'IncludeInteractions'false として指定して、計算から交互作用項を除外します。

    L_noInteractions = kfoldLoss(CVMdl,'Mode','cumulative','IncludeInteractions',false);
    figure
    plot(0:min(CVMdl.NumTrainedPerFold.PredictorTrees),L_noInteractions)

    Figure contains an axes object. The axes object contains an object of type line.

    L_noInteractions の最初の要素は、切片 (定数) 項のみを使用して取得したすべての分割の平均誤差です。L_noInteractions の (J+1) 番目の要素は、切片項と各線形項の最初の J 個の予測子木を使用して取得した平均誤差です。累積損失をプロットすると、GAM の予測子木の数が増えるにつれて誤差がどのように変化するかを観察できます。

    最小誤差とその最小誤差の達成時に使用された予測子木の数を調べます。

    [M,I] = min(L_noInteractions)
    M = 0.0655
    
    I = 23
    

    GAM に 22 個の予測子木が含まれるときに誤差が最小になっています。

    線形項と交互作用項の両方を使用して累積分類誤差を計算します。

    L = kfoldLoss(CVMdl,'Mode','cumulative')
    L = 2×1
    
        0.0712
        0.0712
    
    

    L の最初の要素は、切片 (定数) 項と各線形項のすべての予測子木を使用して取得したすべての分割の平均誤差です。L の 2 番目の要素は、切片項、各線形項のすべての予測子木、および各交互作用項の 1 つの交互作用木を使用して取得した平均誤差です。交互作用項を追加しても誤差は小さくなっていません。

    予測子木の数が 22 個のときの誤差で問題がなければ、一変量の GAM にもう一度学習させ、交差検証を使用せずに 'NumTreesPerPredictor',22 と指定して予測モデルを作成できます。

    バージョン履歴

    R2021a で導入