Main Content

回帰用の自動特徴量エンジニアリング

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

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

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

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

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

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

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

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

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

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

Tbl の変数から新しい特徴量を 10 個生成します。応答として変数 Systolic を指定します。genrfeatures では、既定では新しい特徴量を線形回帰モデルの学習に使用すると見なします。

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

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

NewTbl=100×11 table
    zsc(d(Smoker))    q8(Age)    eb8(Age)    zsc(sin(Height))    zsc(kmd8)    q6(Height)    eb8(Diastolic)    q8(Diastolic)    zsc(fenc(c(SelfAssessedHealthStatus)))    q10(Weight)    Systolic
    ______________    _______    ________    ________________    _________    __________    ______________    _____________    ______________________________________    ___________    ________

         1.3863          4          5              1.1483         -0.56842        6               8                 8                         0.27312                        7            124   
       -0.71414          6          6             -0.3877          -2.0772        5               2                 2                         -1.4682                        6            109   
       -0.71414          4          5              1.1036         -0.21519        2               4                 5                         0.82302                        3            125   
       -0.71414          5          6             -1.4552         -0.32389        4               2                 2                         -1.4682                        4            117   
       -0.71414          8          8              1.1036           1.2302        2               3                 4                         0.82302                        1            122   
       -0.71414          7          7             -1.5163         -0.88497        4               1                 1                         0.82302                        5            121   
         1.3863          3          3              1.1036          -1.1434        2               6                 6                         0.82302                        5            130   
       -0.71414          5          6             -1.5163          -0.3907        4               4                 5                         0.82302                        8            115   
       -0.71414          1          2             -1.5163           0.4278        4               3                 3                         0.27312                        9            115   
       -0.71414          2          3            -0.26055        -0.092621        3               5                 6                         0.27312                        3            118   
       -0.71414          7          7             -1.5163          0.16737        4               2                 2                         0.27312                        2            114   
       -0.71414          6          6            -0.26055         -0.32104        3               1                 1                         -1.8348                        5            115   
       -0.71414          1          1              1.1483        -0.051074        6               1                 1                         -1.8348                        7            127   
         1.3863          5          5             0.14351           2.3695        6               8                 8                         0.27312                        10           130   
       -0.71414          3          4             0.96929         0.092962        2               3                 4                         0.82302                        3            114   
         1.3863          8          8              1.1483        -0.049336        6               7                 8                         0.82302                        8            130   
      ⋮

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

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

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

    zsc(d(Smoker))    Numeric          false           Smoker        Variable of type double converted from an integer data type
                                                                     Standardization with z-score (mean = 0.34, std = 0.4761)
    q8(Age)           Categorical      false           Age           Equiprobable binning (number of bins = 8)

newTbl の 1 つ目の特徴量は数値変数で、最初に変数 Smoker の値を double 型の数値変数に変換してから、その結果を z スコアに変換して作成されています。newTbl の 2 つ目の特徴量はカテゴリカル変数で、変数 Age の値を 8 個の同確率のビンにビン化して作成されています。

生成された特徴量を使用して、正則化なしで線形回帰モデルを当てはめます。

Mdl = fitrlinear(NewTbl,"Systolic",Lambda=0);

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

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 = 1x6 cell
  Columns 1 through 3

    {'eb8(Diastolic)...'}    {'zsc(d(Smoker))'}    {'q8(Age) >= 2'}

  Columns 4 through 6

    {'q10(Weight) >= 9'}    {'q6(Height) >= 5'}    {'eb8(Diastolic)...'}

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

plotPartialDependence(Mdl,"eb8(Diastolic)",NewTbl);

Figure contains an axes object. The axes object with title Partial Dependence Plot contains an object of type line.

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

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

停電のデータをワークスペースに table として読み込みます。欠損値がある観測値を削除し、table の最初の数行を表示します。

outages = readtable("outages.csv");
Tbl = rmmissing(outages);
head(Tbl)
       Region           OutageTime        Loss     Customers     RestorationTime            Cause       
    _____________    ________________    ______    __________    ________________    ___________________

    {'SouthWest'}    2002-02-01 12:18    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }
    {'SouthEast'}    2003-02-07 21:15     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }
    {'West'     }    2004-04-06 05:44    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}
    {'MidWest'  }    2002-03-16 06:18    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }
    {'West'     }    2003-06-18 02:49         0             0    2003-06-18 10:54    {'attack'         }
    {'NorthEast'}    2003-07-16 16:23    239.93         49434    2003-07-17 01:12    {'fire'           }
    {'MidWest'  }    2004-09-27 11:09    286.72         66104    2004-09-27 16:37    {'equipment fault'}
    {'SouthEast'}    2004-09-05 17:48    73.387         36073    2004-09-05 20:46    {'equipment fault'}

変数の中には、OutageTimeRestorationTime など、fitrensemble のような回帰モデル学習関数でサポートされないデータ型の変数も含まれています。

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

rng("default") % For reproducibility of the partition
c = cvpartition(size(Tbl,1),Holdout=0.30);
TrainTbl = Tbl(training(c),:);
TestTbl = Tbl(test(c),:);

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

[Transformer,NewTrainTbl] = genrfeatures(TrainTbl,"Loss",30, ...
    TargetLearner="bag");
Transformer
Transformer = 
  FeatureTransformer with properties:

                     Type: 'regression'
            TargetLearner: 'bag'
    NumEngineeredFeatures: 27
      NumOriginalFeatures: 3
         TotalNumFeatures: 30

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

NewTestTbl = transform(Transformer,TestTbl);

元の学習セット TrainTbl を使用してバギング アンサンブルに学習させ、元の検定セット TestTbl でモデルの平均二乗誤差 (MSE) を計算します。fitrensemble が使用できる 3 つの予測子変数 (RegionCustomers、および Cause) のみ指定し、2 つの datetime 予測子変数 (OutageTime および RestorationTime) を省略します。次に、変換後の学習セット NewTrainTbl を使用してバギング アンサンブルに学習させ、変換後の検定セット NewTestTbl でモデルの MSE を計算します。

originalMdl = fitrensemble(TrainTbl,"Loss ~ Region + Customers + Cause", ...
    Method="bag");
originalTestMSE = loss(originalMdl,TestTbl)
originalTestMSE = 1.8999e+06
newMdl = fitrensemble(NewTrainTbl,"Loss",Method="bag");
newTestMSE = loss(newMdl,NewTestTbl)
newTestMSE = 1.8617e+06

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

検定セットの予測応答値と実際の応答値を両方のモデルで比較します。予測応答の対数を縦軸に、実際の応答 (Loss) の対数を横軸に沿ってプロットします。基準線上にある点は予測が正しいことを示します。優れたモデルでは、生成された予測が線の近くに分布します。

predictedTestY = predict(originalMdl,TestTbl);
newPredictedTestY = predict(newMdl,NewTestTbl);

plot(log(TestTbl.Loss),log(predictedTestY),".")
hold on
plot(log(TestTbl.Loss),log(newPredictedTestY),".")
hold on
plot(log(TestTbl.Loss),log(TestTbl.Loss))
hold off
xlabel("log(True Response)")
ylabel("log(Predicted Response)")
legend(["Original Model Results","New Model Results","Reference Line"], ...
    Location="southeast")
xlim([-1 10])
ylim([-1 10])

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent Original Model Results, New Model Results, Reference Line.

参考

| | | | | | | |