Main Content

分類用の自動特徴量エンジニアリング

関数 gencfeatures では、特徴量エンジニアリング プロセスを機械学習ワークフローのコンテキストで自動化できます。表形式の学習データを分類器に渡す前に、gencfeatures を使用してデータ内の予測子から新しい特徴量を作成できます。返されたデータを使用して分類器に学習させます。

新しい特徴量を機械学習ワークフローに基づいて生成します。

  • 解釈可能なバイナリ分類器用の特徴量を生成するには、gencfeatures の呼び出しで TargetLearner に既定値の "linear" を使用します。その後、返されたデータを使用してバイナリ線形分類器に学習させることができます。例については、生成された特徴量をもつ線形モデルの解釈を参照してください。

  • モデルの精度の向上につながるような特徴量を生成するには、gencfeatures の呼び出しで TargetLearner="bag" または TargetLearner="gaussian-svm" を指定します。その後、返されたデータを使用してバギング アンサンブル分類器またはガウス カーネルを使用したバイナリ サポート ベクター マシン (SVM) 分類器に学習させることができます。例については、新しい特徴量の生成によるバギング アンサンブルの精度の向上を参照してください。

生成された特徴量について詳しく確認するには、FeatureTransformer オブジェクトの関数 describe を使用します。学習セットと同じ特徴変換を検定セットや検証セットに適用するには、FeatureTransformer オブジェクトの関数 transform を使用します。

生成された特徴量をもつ線形モデルの解釈

自動特徴量エンジニアリングを使用して新しい特徴量を生成します。生成された特徴量を使用して線形分類器に学習させます。生成された特徴量と学習させたモデルの関係を解釈します。

patients データセットを読み込みます。変数のサブセットから table を作成します。テーブルの最初の数行を表示します。

load patients
Tbl = table(Age,Diastolic,Gender,Height,SelfAssessedHealthStatus, ...
    Systolic,Weight,Smoker);
head(Tbl)
    Age    Diastolic      Gender      Height    SelfAssessedHealthStatus    Systolic    Weight    Smoker
    ___    _________    __________    ______    ________________________    ________    ______    ______

    38        93        {'Male'  }      71           {'Excellent'}            124        176      true  
    43        77        {'Male'  }      69           {'Fair'     }            109        163      false 
    38        83        {'Female'}      64           {'Good'     }            125        131      false 
    40        75        {'Female'}      67           {'Fair'     }            117        133      false 
    49        80        {'Female'}      64           {'Good'     }            122        119      false 
    46        70        {'Female'}      68           {'Good'     }            121        142      false 
    33        88        {'Female'}      64           {'Good'     }            130        142      true  
    40        82        {'Male'  }      68           {'Good'     }            115        180      false 

Tbl の変数から新しい特徴量を 10 個生成します。応答として変数 Smoker を指定します。gencfeatures では、既定では新しい特徴量をバイナリ線形分類器の学習に使用すると見なします。

rng("default") % For reproducibility
[T,NewTbl] = gencfeatures(Tbl,"Smoker",10)
T = 
  FeatureTransformer with properties:

                     Type: 'classification'
            TargetLearner: 'linear'
    NumEngineeredFeatures: 10
      NumOriginalFeatures: 0
         TotalNumFeatures: 10

NewTbl=100×11 table
    zsc(Systolic.^2)    eb8(Diastolic)    q8(Systolic)    eb8(Systolic)    q8(Diastolic)    zsc(kmd9)    zsc(sin(Age))    zsc(sin(Weight))    zsc(Height-Systolic)    zsc(kmc1)    Smoker
    ________________    ______________    ____________    _____________    _____________    _________    _____________    ________________    ____________________    _________    ______

         0.15379              8                6                4                8           -1.7207        0.50027            0.19202               0.40418            0.76177    true  
         -1.9421              2                1                1                2          -0.22056        -1.1319            -0.4009                2.3431             1.1617    false 
         0.30311              4                6                5                5           0.57695        0.50027             -1.037              -0.78898            -1.4456    false 
        -0.85785              2                2                2                2           0.83391         1.1495             1.3039               0.85162          -0.010294    false 
        -0.14125              3                5                4                4             1.779        -1.3083           -0.42387              -0.34154            0.99368    false 
        -0.28697              1                4                3                1           0.67326         1.3761           -0.72529               0.40418             1.3755    false 
          1.0677              6                8                6                6          -0.42521         1.5181           -0.72529               -1.5347            -1.4456    true  
         -1.1361              4                2                2                5          -0.79995         1.1495            -1.0225                1.2991             1.1617    false 
         -1.1361              3                2                2                3          -0.80136        0.46343             1.0806                1.2991             -1.208    false 
        -0.71693              5                3                3                6           0.37961       -0.51304            0.16741               0.55333            -1.4456    false 
         -1.2734              2                1                1                2            1.2572         1.3025             1.0978                1.4482          -0.010294    false 
         -1.1361              1                2                2                1             1.001        -1.2545            -1.2194                1.0008          -0.010294    false 
         0.60534              1                6                5                1          -0.98493       -0.11998             -1.211             -0.043252             -1.208    false 
          1.0677              8                8                6                8          -0.27307         1.4659             1.2168              -0.34154            0.24706    true  
         -1.2734              3                1                1                4           0.93395        -1.3633           -0.17603                1.0008          -0.010294    false 
          1.0677              7                8                6                8          -0.91396          -1.04            -1.2109              -0.49069            0.24706    true  
      ⋮

T は新しいデータの変換に使用できる FeatureTransformer オブジェクトで、newTbl には Tbl のデータから生成された新しい特徴量が格納されます。

生成された特徴量について詳しく確認するには、FeatureTransformer オブジェクトのオブジェクト関数 describe を使用します。たとえば、生成された最初の 2 つの特徴量を調べます。

describe(T,1:2)
                           Type        IsOriginal    InputVariables                            Transformations
                        ___________    __________    ______________    _______________________________________________________________

    zsc(Systolic.^2)    Numeric          false         Systolic        power(  ,2)
                                                                       Standardization with z-score (mean = 15119.54, std = 1667.5858)
    eb8(Diastolic)      Categorical      false         Diastolic       Equal-width binning (number of bins = 8)

newTbl の 1 つ目の特徴量は数値変数で、変数 Systolic の値を二乗してから、その結果を z スコアに変換して作成されています。newTbl の 2 つ目の特徴量はカテゴリカル変数で、変数 Diastolic の値を 8 個の同じ幅のビンにビン化して作成されています。

生成された特徴量を使用して、正則化なしで線形分類器を当てはめます。

Mdl = fitclinear(NewTbl,"Smoker",Lambda=0);

Mdl の学習に使用された予測子の係数をプロットします。fitclinear では、モデルを当てはめる前にカテゴリカル予測子が展開されることに注意してください。

p = length(Mdl.Beta);
[sortedCoefs,expandedIndex] = sort(Mdl.Beta,ComparisonMethod="abs");
sortedExpandedPreds = Mdl.ExpandedPredictorNames(expandedIndex);
bar(sortedCoefs,Horizontal="on")
yticks(1:2:p)
yticklabels(sortedExpandedPreds(1:2:end))
xlabel("Coefficient")
ylabel("Expanded Predictors")
title("Coefficients for Expanded Predictors")

Figure contains an axes object. The axes object with title Coefficients for Expanded Predictors contains an object of type bar.

係数の絶対値が大きい予測子を特定します。

bigCoefs = abs(sortedCoefs) >= 4;
flip(sortedExpandedPreds(bigCoefs))
ans = 1x7 cell
  Columns 1 through 3

    {'zsc(Systolic.^2)'}    {'eb8(Systolic) ...'}    {'q8(Diastolic) ...'}

  Columns 4 through 6

    {'eb8(Diastolic)...'}    {'q8(Systolic) >= 6'}    {'q8(Diastolic) ...'}

  Column 7

    {'zsc(Height-Sys...'}

部分依存プロットを使用して、絶対値に関して大きな係数をもつレベルのカテゴリカル特徴量を解析できます。たとえば、q8(Diastolic) >= 3q8(Diastolic) >= 6 のレベルで係数の絶対値が大きくなっている変数 q8(Diastolic) の部分依存プロットを調べます。これらの 2 つのレベルは、予測スコアの目立った変化に対応します。

plotPartialDependence(Mdl,"q8(Diastolic)",Mdl.ClassNames,NewTbl);

Figure contains an axes object. The axes object with title Partial Dependence Plot contains 2 objects of type line. These objects represent 0, 1.

新しい特徴量の生成によるバギング アンサンブルの精度の向上

バギング アンサンブル分類器に学習させる前に、gencfeatures を使用して新しい特徴量を設計します。新しいデータの予測の前に同じ特徴変換を新しいデータ セットに適用します。設計した特徴量を使用するアンサンブルの検定セット性能と元の特徴量を使用するアンサンブルの検定セット性能を比較します。

標本ファイル CreditRating_Historical.dat を table に読み取ります。予測子データは、法人顧客リストの財務比率と業種の情報で構成されます。応答変数は、格付機関が割り当てた格付けから構成されます。データセットの最初の数行をプレビューします。

creditrating = readtable("CreditRating_Historical.dat");
head(creditrating)
     ID      WC_TA     RE_TA     EBIT_TA    MVE_BVTD    S_TA     Industry    Rating 
    _____    ______    ______    _______    ________    _____    ________    _______

    62394     0.013     0.104     0.036      0.447      0.142        3       {'BB' }
    48608     0.232     0.335     0.062      1.969      0.281        8       {'A'  }
    42444     0.311     0.367     0.074      1.935      0.366        1       {'A'  }
    48631     0.194     0.263     0.062      1.017      0.228        4       {'BBB'}
    43768     0.121     0.413     0.057      3.647      0.466       12       {'AAA'}
    39255    -0.117    -0.799      0.01      0.179      0.082        4       {'CCC'}
    62236     0.087     0.158     0.049      0.816      0.324        2       {'BBB'}
    39354     0.005     0.181     0.034      2.597      0.388        7       {'AA' }

変数 ID の各値は一意の顧客 ID であるため (つまり、length(unique(creditrating.ID))creditrating に含まれる観測値の数に等しい)、変数 ID は予測子としては適切ではありません。変数 ID を table から削除し、変数 Industrycategorical 変数に変換します。

creditrating = removevars(creditrating,"ID");
creditrating.Industry = categorical(creditrating.Industry);

応答変数 Rating を順序 categorical 変数に変換します。

creditrating.Rating = categorical(creditrating.Rating, ...
    ["AAA","AA","A","BBB","BB","B","CCC"],Ordinal=true);

データを学習セットと検定セットに分割します。観測値の約 75% を学習データとして使用し、観測値の約 25% を検定データとして使用します。データの分割には cvpartition を使用します。

rng("default") % For reproducibility of the partition
c = cvpartition(creditrating.Rating,Holdout=0.25);
trainingIndices = training(c); % Indices for the training set
testIndices = test(c); % Indices for the test set
creditTrain = creditrating(trainingIndices,:);
creditTest = creditrating(testIndices,:);

学習データを使用して、バギング アンサンブルの当てはめに使用する新しい特徴量を 40 個生成します。既定では、40 個の特徴量の中にバギング アンサンブルで予測子として使用できる元の特徴量が含まれます。

[T,newCreditTrain] = gencfeatures(creditTrain,"Rating",40, ...
    TargetLearner="bag");
T
T = 
  FeatureTransformer with properties:

                     Type: 'classification'
            TargetLearner: 'bag'
    NumEngineeredFeatures: 34
      NumOriginalFeatures: 6
         TotalNumFeatures: 40

オブジェクト T に格納された変換を検定データに適用して newCreditTest を作成します。

newCreditTest = transform(T,creditTest);

元の特徴量で学習させたバギング アンサンブルと新しい特徴量で学習させたバギング アンサンブルの検定セットの性能を比較します。

元の学習セット creditTrain を使用してバギング アンサンブルに学習させます。元の検定セット creditTest でモデルの精度を計算します。混同行列を使用して結果を可視化します。

originalMdl = fitcensemble(creditTrain,"Rating",Method="Bag");
originalTestAccuracy = 1 - loss(originalMdl,creditTest, ...
    "Rating",LossFun="classiferror")
originalTestAccuracy = 0.7604
predictedTestLabels = predict(originalMdl,creditTest);
confusionchart(creditTest.Rating,predictedTestLabels);

Figure contains an object of type ConfusionMatrixChart.

変換後の学習セット newCreditTrain を使用してバギング アンサンブルに学習させます。変換後の検定セット newCreditTest でモデルの精度を計算します。混同行列を使用して結果を可視化します。

newMdl = fitcensemble(newCreditTrain,"Rating",Method="Bag");
newTestAccuracy = 1 - loss(newMdl,newCreditTest, ...
    "Rating",LossFun="classiferror")
newTestAccuracy = 0.7501
newPredictedTestLabels = predict(newMdl,newCreditTest);
confusionchart(newCreditTest.Rating,newPredictedTestLabels)

Figure contains an object of type ConfusionMatrixChart.

変換後のデータで学習させたバギング アンサンブルの方が元のデータで学習させたバギング アンサンブルよりも性能が高くなっていることがわかります。

参考

| | | | | | | |