Main Content

ClassificationGAM

バイナリ分類用の一般化加法モデル (GAM)

R2021a 以降

    説明

    ClassificationGAM オブジェクトは、バイナリ分類用の一般化加法モデル (GAM) オブジェクトです。これは、一変量および二変量の形状関数の和を使用してクラス スコア (クラス確率のロジット) を説明する解釈可能なモデルです。

    関数 predict を使用して新しい観測値を分類し、関数 plotLocalEffects を使用して観測値の予測 (分類スコア) に対する各形状関数の効果をプロットできます。ClassificationGAM のオブジェクト関数の完全な一覧については、オブジェクト関数を参照してください。

    作成

    ClassificationGAM オブジェクトの作成には fitcgam を使用します。予測子の線形項と交互作用項の両方を指定して、学習済みモデルに一変量の形状関数 (予測子木) と二変量の形状関数 (交互作用木) をそれぞれ含めることができます。

    学習済みモデルは resume または addInteractions を使用して更新できます。

    • 関数 resume は、モデル内の既存の項の学習を再開します。

    • 関数 addInteractions は、線形項のみを含むモデルに交互作用項を追加します。

    プロパティ

    すべて展開する

    GAM のプロパティ

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

    数値予測子のビンのエッジ。p 個の数値ベクトルが含まれている cell 配列を指定します。p は予測子の個数です。各ベクトルには、数値予測子のビンのエッジを含めます。カテゴリカル予測子はビン化されないので、カテゴリカル予測子の場合は、この cell 配列の要素を空にします。

    数値予測子がビン化されるのは、木学習器を使用してモデルに学習をさせるときに名前と値の引数 'NumBins' として正の整数スカラーを指定した場合だけです。'NumBins' の値が空 (既定) である場合、BinEdges プロパティは空になります。

    学習済みモデル mdlBinEdges プロパティを使用することにより、ビン化された予測子データ Xbinned を再現できます。

    X = mdl.X; % Predictor data
    Xbinned = zeros(size(X));
    edges = mdl.BinEdges;
    % Find indices of binned predictors.
    idxNumeric = find(~cellfun(@isempty,edges));
    if iscolumn(idxNumeric)
        idxNumeric = idxNumeric';
    end
    for j = idxNumeric 
        x = X(:,j);
        % Convert x to array if x is a table.
        if istable(x) 
            x = table2array(x);
        end
        % Group x into bins by using the discretize function.
        xbinned = discretize(x,[-inf; edges{j}; inf]); 
        Xbinned(:,j) = xbinned;
    end
    数値予測子の場合、1 からビンの個数までの範囲にあるビンのインデックスが Xbinned に格納されます。カテゴリカル予測子の場合、Xbinned の値は 0 になります。XNaN が含まれている場合、対応する Xbinned の値は NaN になります。

    データ型: cell

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

    交互作用項のインデックス。正の整数の t 行 2 列の行列を指定します。ここで、t はモデル内の交互作用項の数です。行列の各行は 1 つの交互作用項を表し、交互作用項の予測子データ X の列インデックスを格納します。モデルに交互作用項が含まれない場合、このプロパティは空 ([]) になります。

    交互作用項は、p 値に基づく重要度の順序でモデルに追加されます。交互作用項がモデルに追加される順序を確認するには、このプロパティを使用します。

    データ型: double

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

    モデルの切片 (定数) 項。予測子木と交互作用木における切片項の和です。数値スカラーを指定します。

    データ型: single | double

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

    モデルの学習に使用されたパラメーター。モデル パラメーター オブジェクトとして指定されます。ModelParameters には、モデルの学習に使用された名前と値の引数の値などのパラメーター値が格納されます。推定パラメーターは ModelParameters に格納されません。

    ModelParameters のフィールドにアクセスするには、ドット表記を使用します。たとえば、交互作用木あたりの決定分岐の最大数にアクセスするには Mdl.ModelParameters.MaxNumSplitsPerInteraction を使用します。

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

    数値予測子の交互作用項を検出するためのビンのエッジ。p 個の数値ベクトルの cell 配列として指定されます。p は予測子の個数です。各ベクトルには、数値予測子のビンのエッジを含めます。カテゴリカル予測子はビン化されないので、カテゴリカル予測子の場合は、この cell 配列の要素を空にします。

    交互作用項の検出プロセスを高速化するために、最大 8 個の同確率のビンに数値予測子がビン化されます。予測子に含まれる一意の値が 8 より少なければ、ビンの数を 8 より少なくすることができます。

    データ型: cell

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

    モデルの学習が停止した理由。PredictorTreesInteractionTrees の 2 つのフィールドをもつ構造体として指定されます。

    このプロパティは、指定した数の木がモデルに含まれているかどうかを線形項 ('NumTreesPerPredictor') と交互作用項 ('NumTreesPerInteraction') のそれぞれについて確認する場合に使用します。関数 fitcgam で指定した数の木を追加する前に学習が終了した場合、このプロパティに終了理由が格納されます。

    データ型: struct

    他の分類のプロパティ

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

    カテゴリカル予測子のインデックス。正の整数のベクトルとして指定します。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

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

    展開された予測子名。文字ベクトルの cell 配列を指定します。

    ExpandedPredictorNames は、一般化加法モデルの PredictorNames と同じです。

    データ型: cell

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

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

    データ型: double

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

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

    データ型: cell

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

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

    データ型: double

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

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

    データ型: char

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

    ClassificationGAM モデルの当てはめに使用した元の学習データの行。logical ベクトルを指定します。すべての行を使用した場合、このプロパティは空になります。

    データ型: logical

    スコア変換。文字ベクトルまたは関数ハンドルを指定します。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 は、行列 (元のスコア) を受け入れて同じサイズの行列 (変換したスコア) を返さなければなりません。

    このプロパティによって、predictmarginedge などのオブジェクト関数で使用する出力スコアの計算が決まります。事後確率の計算には '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

    ハイパーパラメーター最適化のプロパティ

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

    ハイパーパラメーターの交差検証最適化の説明。BayesianOptimization オブジェクト、またはハイパーパラメーターおよび関連する値が含まれているテーブルを指定します。オブジェクトの作成時に fitcgam の名前と値の引数 'OptimizeHyperparameters''none' (既定値) 以外であった場合、このプロパティは空以外になります。HyperparameterOptimizationResults の値は、オブジェクト作成時の fitcgam の構造体 HyperparameterOptimizationOptions における Optimizer フィールドの設定によって変化します。

    Optimizer フィールドの値HyperparameterOptimizationResults の値
    'bayesopt' (既定の設定)BayesianOptimization クラスのオブジェクト
    'gridsearch' または 'randomsearch'使用したハイパーパラメーター、観測された目的関数の値 (交差検証損失)、および最低 (最良) から最高 (最悪) までの観測値の順位が格納されているテーブル

    オブジェクト関数

    すべて展開する

    compact機械学習モデルのサイズの縮小
    crossval機械学習モデルの交差検証
    addInteractions一変量の一般化加法モデル (GAM) への交互作用項の追加
    resume一般化加法モデル (GAM) の学習の再開
    limeLocal Interpretable Model-agnostic Explanations (LIME)
    partialDependence部分依存の計算
    plotLocalEffects一般化加法モデル (GAM) 内の項の局所的効果のプロット
    plotPartialDependence部分依存プロット (PDP) および個別条件付き期待値 (ICE) プロットの作成
    shapleyシャープレイ値
    predict一般化加法モデル (GAM) を使用した観測値の分類
    loss一般化加法モデル (GAM) の分類損失
    margin一般化加法モデル (GAM) の分類マージン
    edge一般化加法モデル (GAM) の分類エッジ
    resubPredict学習済み分類器を使用した学習データの分類
    resubLoss再代入分類損失
    resubMargin再代入分類マージン
    resubEdge再代入分類エッジ
    compareHoldout新しいデータを使用して 2 つの分類モデルの精度を比較
    testckfold交差検証の反復により 2 つの分類モデルの精度を比較

    すべて折りたたむ

    予測子の線形項が格納されている一変量の一般化加法モデルに学習させます。その後、関数plotLocalEffectsを使用して指定のデータ インスタンスについての予測を解釈します。

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

    load ionosphere

    レーダー反射が不良 ('b') と良好 ('g') のどちらであるかを識別する一変量の GAM に学習させます。

    Mdl = fitcgam(X,Y)
    Mdl = 
      ClassificationGAM
                 ResponseName: 'Y'
        CategoricalPredictors: []
                   ClassNames: {'b'  'g'}
               ScoreTransform: 'logit'
                    Intercept: 2.2715
              NumObservations: 351
    
    
    

    MdlClassificationGAM モデル オブジェクトです。モデル表示には、モデルのプロパティの一部のみが表示されます。プロパティの完全な一覧を表示するには、ワークスペースで変数名 Mdl をダブルクリックします。Mdl の変数エディターが開きます。あるいは、コマンド ウィンドウでドット表記を使用してプロパティを表示できます。たとえば、Mdl のクラスの順序を表示します。

    classOrder = Mdl.ClassNames
    classOrder = 2x1 cell
        {'b'}
        {'g'}
    
    

    学習データの最初の観測値を分類し、予測に対する Mdl 内の項の局所的効果をプロットします。

    label = predict(Mdl,X(1,:))
    label = 1x1 cell array
        {'g'}
    
    
    plotLocalEffects(Mdl,X(1,:))

    Figure contains an axes object. The axes object with title Local Effects Plot, xlabel Local Effect, ylabel Term contains an object of type bar.

    関数predictで、最初の観測値 X(1,:)'g' として分類します。関数plotLocalEffectsで、予測に対する上位 10 個の重要な項の局所的効果を示す横棒グラフを作成します。局所的効果の各値は、'g' の分類スコアへの各項の寄与を示します。これは、観測値の分類が 'g' となる事後確率のロジットです。

    3 つの異なる方法で、予測子の線形項と交互作用項が格納された一般化加法モデルに学習させます。

    • 入力引数 formula を使用して交互作用項を指定します。

    • 名前と値の引数 'Interactions' を指定します。

    • 線形項をもつモデルを構築してから、そのモデルに関数 addInteractions を使用して交互作用項を追加します。

    フィッシャーのアヤメのデータ セットを読み込みます。versicolor と virginica の観測値を格納する table を作成します。

    load fisheriris
    inds = strcmp(species,'versicolor') | strcmp(species,'virginica');
    tbl = array2table(meas(inds,:),'VariableNames',["x1","x2","x3","x4"]);
    tbl.Y = species(inds,:);

    formula の指定

    4 つの線形項 (x1x2x3、および x4) と 2 つの交互作用項 (x1*x2 および x2*x3) が格納された GAM に学習させます。'Y ~ terms' という形式の式を使用して項を指定します。

    Mdl1 = fitcgam(tbl,'Y ~ x1 + x2 + x3 + x4 + x1:x2 + x2:x3');

    交互作用項は重要度の順序でモデルに追加されます。Interactions プロパティを使用して、モデル内の交互作用項とそれらが fitcgam でモデルに追加された順序を確認できます。Interactions プロパティを表示します。

    Mdl1.Interactions
    ans = 2×2
    
         2     3
         1     2
    
    

    Interactions の各行は 1 つの交互作用項を表し、交互作用項の予測子変数の列インデックスを格納します。

    'Interactions' の指定

    学習データ (tbl) と tbl 内の応答変数の名前を fitcgam に渡し、それ以外のすべての変数の線形項が予測子として含まれるようにします。logical 行列を使用して名前と値の引数 'Interactions' を指定して、2 つの交互作用項 x1*x2x2*x3 を含めます。

    Mdl2 = fitcgam(tbl,'Y','Interactions',logical([1 1 0 0; 0 1 1 0]));
    Mdl2.Interactions
    ans = 2×2
    
         2     3
         1     2
    
    

    'Interactions' では、交互作用項の数を指定したり、'all' を指定して利用可能なすべての交互作用項を含めることもできます。fitcgam は、指定された交互作用項の中から p 値が 'MaxPValue' の値以下であるものを特定し、それらをモデルに追加します。'MaxPValue' の既定値は 1 であり、指定したすべての交互作用項がモデルに追加されます。

    'Interactions','all' を指定し、名前と値の引数 'MaxPValue' を 0.01 に設定します。

    Mdl3 = fitcgam(tbl,'Y','Interactions','all','MaxPValue',0.01);
    Mdl3.Interactions
    ans = 5×2
    
         3     4
         2     4
         1     4
         2     3
         1     3
    
    

    Mdl3 には、利用可能な 6 組の交互作用項のペアのうち 5 組が含まれます。

    関数 addInteractions の使用

    予測子の線形項が格納されている一変量の GAM に学習させ、学習済みのモデルに関数addInteractionsを使用して交互作用項を追加します。addInteractions の 2 番目の入力引数を fitcgam の名前と値の引数 'Interactions' と同じ方法で指定します。交互作用項のリスト (logical 行列を使用)、交互作用項の数、または 'all' を指定できます。

    交互作用項の数を 5 と指定して、学習済みのモデルに上位 5 つの重要な交互作用項を追加します。

    Mdl4 = fitcgam(tbl,'Y');
    UpdatedMdl4 = addInteractions(Mdl4,5);
    UpdatedMdl4.Interactions
    ans = 5×2
    
         3     4
         2     4
         1     4
         2     3
         1     3
    
    

    Mdl4 は一変量の GAM、UpdatedMdl4Mdl4 のすべての項と 5 つの追加の交互作用項を格納する更新された GAM です。

    反復回数を少なくして一変量の分類の GAM (線形項のみを格納) に学習させます。反復回数を増やしてモデルに追加で学習させてから、再代入損失を比較します。

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

    load ionosphere

    レーダー反射が不良 ('b') と良好 ('g') のどちらであるかを識別する一変量の GAM に学習させます。線形項あたりの木の数を 2 と指定します。fitcgam は、反復回数の指定に従ってブースティング アルゴリズムを反復します。それぞれのブースティング反復において、線形項ごとに 1 つの木が追加されます。'Verbose' を 2 と指定して、1 回の反復ごとに診断メッセージを表示します。

    Mdl = fitcgam(X,Y,'NumTreesPerPredictor',2,'Verbose',2);
    |========================================================|
    | Type | NumTrees |  Deviance  |   RelTol   | LearnRate  |
    |========================================================|
    |    1D|         0|      486.59|      -     |      -     |
    |    1D|         1|      166.71|         Inf|           1|
    |    1D|         2|      78.336|     0.58205|           1|
    

    fitcgam で指定した数の木の学習が実行されたかどうかを確認するには、学習済みモデルの ReasonForTermination プロパティを表示し、表示されるメッセージを確認します。

    Mdl.ReasonForTermination
    ans = struct with fields:
          PredictorTrees: 'Terminated after training the requested number of trees.'
        InteractionTrees: ''
    
    

    学習データの分類損失を計算します。

    resubLoss(Mdl)
    ans = 0.0142
    

    モデルの学習を再開し、100 回の反復を追加で実行します。Mdl には線形項のみが格納されているため、関数 resume は線形項の学習を再開し、それらについての木 (予測子木) を追加します。'Verbose''NumPrint' を指定して、10 回の反復ごとに診断メッセージを表示します。

    UpdatedMdl = resume(Mdl,100,'Verbose',1,'NumPrint',10);
    |========================================================|
    | Type | NumTrees |  Deviance  |   RelTol   | LearnRate  |
    |========================================================|
    |    1D|         0|      78.336|      -     |      -     |
    |    1D|         1|      38.364|     0.17429|           1|
    |    1D|        10|     0.16311|    0.011894|           1|
    |    1D|        20|  0.00035693|   0.0025178|           1|
    |    1D|        30|  8.1191e-07|   0.0011006|           1|
    |    1D|        40|  1.7978e-09|  0.00074607|           1|
    |    1D|        50|  3.6113e-12|  0.00034404|           1|
    |    1D|        60|  1.7497e-13|  0.00016541|           1|
    
    UpdatedMdl.ReasonForTermination
    ans = struct with fields:
          PredictorTrees: 'Unable to improve the model fit.'
        InteractionTrees: ''
    
    

    resume は、木を追加してもモデルの当てはめの逸脱度が改善されなくなると学習を終了します。

    更新されたモデルを使用して分類損失を計算します。

    resubLoss(UpdatedMdl)
    ans = 0
    

    反復回数を増やして resume でモデルを更新すると、分類損失が減少します。

    詳細

    すべて展開する

    参照

    [1] Lou, Yin, Rich Caruana, and Johannes Gehrke. "Intelligible Models for Classification and Regression." Proceedings of the 18th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD ’12). Beijing, China: ACM Press, 2012, pp. 150–158.

    [2] Lou, Yin, Rich Caruana, Johannes Gehrke, and Giles Hooker. "Accurate Intelligible Models with Pairwise Interactions." Proceedings of the 19th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD ’13) Chicago, Illinois, USA: ACM Press, 2013, pp. 623–631.

    バージョン履歴

    R2021a で導入