Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ClassificationEnsemble Predict ブロックの使用によるクラス ラベルの予測

この例では、最適なハイパーパラメーターでアンサンブル モデルの学習を行い、ClassificationEnsemble Predictブロックを Simulink® のラベル予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みのアンサンブル分類モデルを使用することにより、その観測値の予測されたクラス ラベルとクラス スコアを返します。

最適なハイパーパラメーターでの分類モデルの学習

CreditRating_Historical データセットを読み込みます。このデータ セットには、顧客 ID、顧客の財務比率、業種ラベル、および信用格付けが格納されています。標本サイズを調べます。

tbl = readtable('CreditRating_Historical.dat');
n = numel(tbl)
n = 31456

テーブルの最初の 3 行を表示します。

head(tbl,3)
ans=3×8 table
     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' }

tbl.Industry は業種ラベルのカテゴリカル変数です。ClassificationEnsemble Predict ブロックのモデルの学習を行う場合、カテゴリカル予測子をモデルに含めるには、関数 dummyvar を使用してカテゴリカル予測子を前処理しなければなりません。名前と値の引数 'CategoricalPredictors' は使用できません。tbl.Industry についてダミー変数を作成します。

d = dummyvar(tbl.Industry);

tbl.Industry の各カテゴリに対応するダミー変数が dummyvar で作成されます。tbl.Industry のカテゴリの数と d のダミー変数の数を調べます。

unique(tbl.Industry)'
ans = 1×12

     1     2     3     4     5     6     7     8     9    10    11    12

size(d)
ans = 1×2

        3932          12

予測子変数の数値行列と応答変数の cell 配列を作成します。

X = [table2array(tbl(:,2:6)) d];
Y = tbl.Rating;

X は、17 個の変数 (5 個の財務比率と 12 個の業種ラベルのダミー変数) が含まれている数値行列です。tbl.ID は格付けの予測に有用ではないため、X ではこの変数は使用されません。Y は、対応する格付けが含まれている文字ベクトルの cell 配列です。

データは連続的に入手するものとし、また、はじめの 3000 個の観測値を入手しており、残りの 932 個はまだ入手していないとします。現在の標本と将来の標本にデータを分割します。

prsntX = X(1:3000,:);
prsntY = Y(1:3000);
ftrX = X(3001:end,:);
ftrY = Y(3001:end);

現在利用できるすべてのデータ prsntX および prsntY と次のオプションを使用してアンサンブルの学習を行います。

  • 最適なハイパーパラメーターでアンサンブルの学習を行うために、'OptimizeHyperparameters''auto' に指定します。'auto' オプションは、fitcensemble'Method''NumLearningCycles'、および 'LearnRate' (適用可能な手法) と木学習器の 'MinLeafSize' について最適な値を探します。

  • 再現性を得るために、乱数シードを設定し、'expected-improvement-plus' の獲得関数を使用します。また、ランダム フォレスト アルゴリズムの再現性を得るため、木学習器の 'Reproducible'true に指定します。

  • 名前と値の引数 'ClassNames' を使用してクラスの順序を指定します。ClassificationEnsemble Predict ブロックの score 端子からの出力値は同じ順序です。

rng('default')
t = templateTree('Reproducible',true);
ensMdl = fitcensemble(prsntX,prsntY, ...
    'ClassNames',{'AAA' 'AA' 'A' 'BBB' 'BB' 'B' 'CCC'}, ...
    'OptimizeHyperparameters','auto','Learners',t, ...
    'HyperparameterOptimizationOptions', ...
    struct('AcquisitionFunctionName','expected-improvement-plus'))
|===================================================================================================================================|
| Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   |       Method | NumLearningC-|    LearnRate |  MinLeafSize |
|      | result |             | runtime     | (observed)  | (estim.)    |              | ycles        |              |              |
|===================================================================================================================================|
|    1 | Best   |     0.51133 |      13.652 |     0.51133 |     0.51133 |   AdaBoostM2 |          429 |     0.082478 |          871 |
|    2 | Best   |     0.26133 |      18.827 |     0.26133 |     0.27463 |   AdaBoostM2 |          492 |      0.19957 |            4 |
|    3 | Accept |     0.85133 |     0.76925 |     0.26133 |     0.28421 |     RUSBoost |           10 |      0.34528 |         1179 |
|    4 | Accept |       0.263 |     0.61254 |     0.26133 |     0.26124 |   AdaBoostM2 |           13 |      0.27107 |           10 |
|    5 | Best   |        0.26 |      0.9413 |        0.26 |     0.26003 |          Bag |           10 |            - |            1 |
|    6 | Accept |     0.28933 |      1.7101 |        0.26 |      0.2602 |          Bag |           36 |            - |          101 |
|    7 | Best   |     0.25667 |      1.3583 |     0.25667 |     0.25726 |   AdaBoostM2 |           33 |      0.99501 |           11 |
|    8 | Best   |       0.244 |      28.725 |       0.244 |     0.24406 |          Bag |          460 |            - |            7 |
|    9 | Accept |       0.246 |        4.19 |       0.244 |     0.24435 |          Bag |           60 |            - |            4 |
|   10 | Accept |     0.25533 |      1.3969 |       0.244 |     0.24437 |   AdaBoostM2 |           33 |      0.99516 |            1 |
|   11 | Accept |     0.25733 |      1.5294 |       0.244 |      0.2442 |          Bag |           25 |            - |            8 |
|   12 | Accept |     0.74267 |      16.444 |       0.244 |     0.24995 |          Bag |          488 |            - |         1494 |
|   13 | Accept |     0.28567 |      7.9382 |       0.244 |     0.24624 |     RUSBoost |          158 |    0.0010063 |            1 |
|   14 | Accept |       0.257 |      23.416 |       0.244 |     0.24559 |          Bag |          491 |            - |           31 |
|   15 | Accept |     0.28433 |     0.71501 |       0.244 |     0.24557 |     RUSBoost |           12 |      0.48085 |            6 |
|   16 | Accept |       0.267 |       17.82 |       0.244 |      0.2456 |   AdaBoostM2 |          484 |    0.0028818 |           43 |
|   17 | Accept |     0.24667 |      33.219 |       0.244 |     0.24601 |          Bag |          488 |            - |            3 |
|   18 | Best   |       0.244 |      34.953 |       0.244 |      0.2454 |          Bag |          498 |            - |            3 |
|   19 | Accept |     0.24467 |      31.568 |       0.244 |     0.24489 |          Bag |          473 |            - |            3 |
|   20 | Accept |       0.259 |      19.187 |       0.244 |     0.24488 |   AdaBoostM2 |          497 |      0.67001 |           19 |
|===================================================================================================================================|
| Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   |       Method | NumLearningC-|    LearnRate |  MinLeafSize |
|      | result |             | runtime     | (observed)  | (estim.)    |              | ycles        |              |              |
|===================================================================================================================================|
|   21 | Accept |     0.27733 |      19.735 |       0.244 |     0.24468 |     RUSBoost |          386 |      0.91461 |            2 |
|   22 | Accept |       0.245 |      32.172 |       0.244 |      0.2441 |          Bag |          482 |            - |            4 |
|   23 | Accept |       0.244 |      33.117 |       0.244 |     0.24388 |          Bag |          497 |            - |            4 |
|   24 | Accept |       0.245 |       34.32 |       0.244 |     0.24406 |          Bag |          497 |            - |            4 |
|   25 | Best   |       0.243 |      33.134 |       0.243 |     0.24394 |          Bag |          499 |            - |            5 |
|   26 | Accept |     0.25733 |     0.55541 |       0.243 |     0.24371 |   AdaBoostM2 |           12 |      0.87848 |           53 |
|   27 | Accept |       0.263 |     0.52438 |       0.243 |     0.24371 |   AdaBoostM2 |           11 |       0.6978 |            2 |
|   28 | Accept |     0.24367 |      31.167 |       0.243 |     0.24344 |          Bag |          484 |            - |            5 |
|   29 | Accept |       0.292 |      19.748 |       0.243 |     0.24342 |   AdaBoostM2 |          497 |    0.0010201 |            1 |
|   30 | Accept |       0.292 |      0.7854 |       0.243 |     0.24342 |     RUSBoost |           13 |    0.0012334 |            3 |

__________________________________________________________
Optimization completed.
MaxObjectiveEvaluations of 30 reached.
Total function evaluations: 30
Total elapsed time: 488.5833 seconds
Total objective function evaluation time: 464.2275

Best observed feasible point:
    Method    NumLearningCycles    LearnRate    MinLeafSize
    ______    _________________    _________    ___________

     Bag             499              NaN            5     

Observed objective function value = 0.243
Estimated objective function value = 0.24342
Function evaluation time = 33.1343

Best estimated feasible point (according to models):
    Method    NumLearningCycles    LearnRate    MinLeafSize
    ______    _________________    _________    ___________

     Bag             499              NaN            5     

Estimated objective function value = 0.24342
Estimated function evaluation time = 32.1002
ensMdl = 
  ClassificationBaggedEnsemble
                         ResponseName: 'Y'
                CategoricalPredictors: []
                           ClassNames: {'AAA'  'AA'  'A'  'BBB'  'BB'  'B'  'CCC'}
                       ScoreTransform: 'none'
                      NumObservations: 3000
    HyperparameterOptimizationResults: [1×1 BayesianOptimization]
                           NumTrained: 499
                               Method: 'Bag'
                         LearnerNames: {'Tree'}
                 ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.'
                              FitInfo: []
                   FitInfoDescription: 'None'
                            FResample: 1
                              Replace: 1
                     UseObsForLearner: [3000×499 logical]


  Properties, Methods

fitcensemble は、ランダム フォレスト アルゴリズム ('Bag') が最適な手法であると特定し、ClassificationBaggedEnsembleオブジェクトを返します。

Simulink モデルの作成

この例では、ClassificationEnsemble Predictブロックを含む Simulink モデル slexCreditRatingClassificationEnsemblePredictExample.slx が用意されています。この節の説明に従って、この Simulink モデルを開くことも、新しいモデルを作成することもできます。

Simulink モデル slexCreditRatingClassificationEnsemblePredictExample.slx を開きます。

SimMdlName = 'slexCreditRatingClassificationEnsemblePredictExample'; 
open_system(SimMdlName)

slexCreditRatingClassificationEnsemblePredictExample のコールバック関数 PreLoadFcn には、標本データの読み込み、最適なハイパーパラメーターを使用したモデルの学習、および Simulink モデルの入力信号の作成を行うコードが含まれています。Simulink モデルを開くと、Simulink モデルを読み込む前に、ソフトウェアが PreLoadFcn のコードを実行します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブで、[モデルのコールバック] ペインのコールバック関数 PreLoadFcn を選択します。

新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、ClassificationEnsemble Predict ブロックを追加します。Inport ブロックと Outport ブロックを追加して、それらを ClassificationEnsemble Predict ブロックに接続します。

ClassificationEnsemble Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[Select trained machine learning model] パラメーターを ensMdl として指定します。これは、学習済みのモデルを含むワークスペース変数の名前です。[更新] ボタンをクリックします。ダイアログ ボックスの [Trained Machine Learning Model] に、モデル ensMdl の学習に使用されるオプションが表示されます。[Add output port for predicted class scores] チェック ボックスをオンにして、2 番目の出力端子 score を追加します。

ClassificationEnsemble Predict ブロックには、17 個の予測子の値を含む観測値が必要です。Inport ブロックをダブルクリックし、[信号属性] タブで [端子の次元] を 17 に設定します。

Simulink モデルの構造体配列の形式で、入力信号を作成します。構造体配列には、次のフィールドが含まれていなければなりません。

  • time — 観測値がモデルに入力された時点。この例では、期間に 0 ~ 931 の整数を含めます。方向は予測子データ内の観測値に対応しなければなりません。したがって、この場合は time が列ベクトルでなければなりません。

  • signalsvalues フィールドと dimensions フィールドが含まれている、入力データを説明する 1 行 1 列の構造体配列。values は予測子データの行列、dimensions は予測子変数の個数です。

将来の標本用に適切な構造体配列を作成します。

creditRatingInput.time = (0:931)';
creditRatingInput.signals(1).values = ftrX;
creditRatingInput.signals(1).dimensions = size(ftrX,2);

ワークスペースから信号データをインポートするには、次を実行します。

  • [コンフィギュレーション パラメーター] ダイアログ ボックスを開く。[モデル化] タブで、[モデル設定] をクリック。

  • [データのインポート/エクスポート] ペインで [入力] チェック ボックスをオンにし、隣のテキスト ボックスに「creditRatingInput」と入力。

  • [ソルバー] ペインの [シミュレーション時間] で、[終了時間]creditRatingInput.time(end) に設定。[ソルバーの選択] で、[タイプ]Fixed-step に、[ソルバー]discrete (no continuous states) に設定。

詳細は、シミュレーションのための信号データの読み込み (Simulink)を参照してください。

モデルをシミュレートします。

sim(SimMdlName);

Inport ブロックでは、観測値を検出すると、その観測値を ClassificationEnsemble Predict ブロックに送ります。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

参考

関連するトピック