分類用の自動特徴量エンジニアリング
関数 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")

係数の絶対値が大きい予測子を特定します。
bigCoefs = abs(sortedCoefs) >= 4; flip(sortedExpandedPreds(bigCoefs))
ans = 1×7 cell
{'zsc(Systolic.^2)'} {'eb8(Systolic) >= 5'} {'eb8(Diastolic) >= 3'} {'q8(Diastolic) >= 3'} {'q8(Systolic) >= 6'} {'q8(Diastolic) >= 6'} {'zsc(Height-Systolic)'}
部分依存プロットを使用して、絶対値に関して大きな係数をもつレベルのカテゴリカル特徴量を解析できます。たとえば、q8(Diastolic) >= 3 と q8(Diastolic) >= 6 のレベルで係数の絶対値が大きくなっている変数 q8(Diastolic) の部分依存プロットを調べます。これらの 2 つのレベルは、予測スコアの目立った変化に対応します。
plotPartialDependence(Mdl,"q8(Diastolic)",Mdl.ClassNames,NewTbl);
新しい特徴量の生成によるバギング アンサンブルの精度の向上
バギング アンサンブル分類器に学習させる前に、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 から削除し、変数 Industry を categorical 変数に変換します。
creditrating = removevars(creditrating,"ID");
creditrating.Industry = categorical(creditrating.Industry);応答変数 Rating を categorical 変数に変換します。
creditrating.Rating = categorical(creditrating.Rating, ... ["AAA","AA","A","BBB","BB","B","CCC"]);
データを学習セットとテスト セットに分割します。観測値の約 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.7542
predictedTestLabels = predict(originalMdl,creditTest); confusionchart(creditTest.Rating,predictedTestLabels);

変換後の学習セット newCreditTrain を使用してバギング アンサンブルに学習させます。変換後のテスト セット newCreditTest でモデルの精度を計算します。混同行列を使用して結果を可視化します。
newMdl = fitcensemble(newCreditTrain,"Rating",Method="Bag"); newTestAccuracy = 1 - loss(newMdl,newCreditTest, ... "Rating",LossFun="classiferror")
newTestAccuracy = 0.7461
newPredictedTestLabels = predict(newMdl,newCreditTest); confusionchart(newCreditTest.Rating,newPredictedTestLabels)

変換後のデータで学習させたバギング アンサンブルの方が元のデータで学習させたバギング アンサンブルよりも性能が高くなっていることがわかります。
参考
gencfeatures | FeatureTransformer | describe | transform | fitclinear | fitcensemble | fitcsvm | plotPartialDependence | genrfeatures