RegressionEnsemble Predict ブロックの使用による応答の予測
この例では、最適なハイパーパラメーターでアンサンブル モデルの学習を行い、RegressionEnsemble Predictブロックを Simulink® の応答予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みのアンサンブル回帰モデルを使用することにより、その観測値の予測された応答を返します。
最適なハイパーパラメーターでの回帰モデルの学習
carbig
データ セットを読み込みます。このデータ セットには、1970 年代と 1980 年代初期に製造された自動車の測定値が格納されています。
load carbig
whos
Name Size Bytes Class Attributes Acceleration 406x1 3248 double Cylinders 406x1 3248 double Displacement 406x1 3248 double Horsepower 406x1 3248 double MPG 406x1 3248 double Mfg 406x13 10556 char Model 406x36 29232 char Model_Year 406x1 3248 double Origin 406x7 5684 char Weight 406x1 3248 double cyl4 406x5 4060 char org 406x7 5684 char when 406x5 4060 char
Origin
はカテゴリカル変数です。RegressionEnsemble Predict ブロックのモデルの学習を行う場合、カテゴリカル予測子をモデルに含めるには、関数 dummyvar
を使用してカテゴリカル予測子を前処理しなければなりません。名前と値の引数 'CategoricalPredictors'
は使用できません。Origin
についてダミー変数を作成します。
c_Origin = categorical(cellstr(Origin)); d_Origin = dummyvar(c_Origin);
c_Origin
の各カテゴリに対応するダミー変数が dummyvar
で作成されます。c_Origin
のカテゴリの数と d_Origin
のダミー変数の数を調べます。
unique(cellstr(Origin))
ans = 7x1 cell
{'England'}
{'France' }
{'Germany'}
{'Italy' }
{'Japan' }
{'Sweden' }
{'USA' }
size(d_Origin)
ans = 1×2
406 7
Origin
の各カテゴリに対応するダミー変数が dummyvar
で作成されます。
6 つの数値予測子変数と Origin
の 7 つのダミー変数を格納する行列を作成します。また、応答変数のベクトルを作成します。
X = [Acceleration,Cylinders,Displacement,Horsepower,Model_Year,Weight,d_Origin]; Y = MPG;
X
および Y
と次のオプションを使用してアンサンブルの学習を行います。
最適なハイパーパラメーターでアンサンブルの学習を行うために、
'OptimizeHyperparameters'
を'auto'
に指定します。'auto'
オプションは、fitrensemble
の'Method'
、'NumLearningCycles'
、および'LearnRate'
(適用可能な手法) と木学習器の'MinLeafSize'
について最適な値を探します。再現性を得るために、乱数シードを設定し、
'expected-improvement-plus'
の獲得関数を使用します。また、ランダム フォレスト アルゴリズムの再現性を得るため、木学習器の'Reproducible'
をtrue
に指定します。
rng('default') t = templateTree('Reproducible',true); ensMdl = fitrensemble(X,Y,'Learners',t, ... 'OptimizeHyperparameters','auto', ... 'HyperparameterOptimizationOptions', ... struct('AcquisitionFunctionName','expected-improvement-plus'))
|===================================================================================================================================| | Iter | Eval | Objective: | Objective | BestSoFar | BestSoFar | Method | NumLearningC-| LearnRate | MinLeafSize | | | result | log(1+loss) | runtime | (observed) | (estim.) | | ycles | | | |===================================================================================================================================| | 1 | Best | 2.7403 | 5.1312 | 2.7403 | 2.7403 | Bag | 184 | - | 69 | | 2 | Accept | 4.1317 | 0.72167 | 2.7403 | 2.8143 | Bag | 10 | - | 176 | | 3 | Best | 2.1687 | 9.5444 | 2.1687 | 2.1689 | Bag | 118 | - | 2 | | 4 | Accept | 2.2747 | 1.2536 | 2.1687 | 2.1688 | LSBoost | 24 | 0.37779 | 7 | | 5 | Best | 2.1421 | 2.7276 | 2.1421 | 2.1422 | Bag | 75 | - | 1 | | 6 | Best | 2.1365 | 11.42 | 2.1365 | 2.1365 | Bag | 500 | - | 1 | | 7 | Accept | 2.4302 | 0.84292 | 2.1365 | 2.1365 | LSBoost | 37 | 0.94779 | 71 | | 8 | Accept | 2.1813 | 13.068 | 2.1365 | 2.1365 | LSBoost | 497 | 0.023582 | 1 | | 9 | Accept | 6.1992 | 2.1532 | 2.1365 | 2.1363 | LSBoost | 91 | 0.0012439 | 1 | | 10 | Accept | 2.2119 | 11.627 | 2.1365 | 2.1363 | LSBoost | 497 | 0.087441 | 11 | | 11 | Accept | 4.7782 | 0.37126 | 2.1365 | 2.1366 | LSBoost | 15 | 0.055744 | 1 | | 12 | Accept | 2.3093 | 11.86 | 2.1365 | 2.1366 | LSBoost | 493 | 0.39665 | 1 | | 13 | Accept | 4.1304 | 4.4206 | 2.1365 | 2.1366 | LSBoost | 198 | 0.33031 | 201 | | 14 | Accept | 2.595 | 0.43717 | 2.1365 | 2.1367 | LSBoost | 16 | 0.99848 | 1 | | 15 | Accept | 2.6643 | 0.57596 | 2.1365 | 2.1363 | LSBoost | 25 | 0.97637 | 5 | | 16 | Accept | 2.2388 | 0.30814 | 2.1365 | 2.1363 | LSBoost | 11 | 0.42205 | 1 | | 17 | Accept | 4.1304 | 1.0041 | 2.1365 | 2.1789 | LSBoost | 19 | 0.79808 | 202 | | 18 | Accept | 2.347 | 1.4916 | 2.1365 | 2.1394 | LSBoost | 70 | 0.44243 | 1 | | 19 | Accept | 2.3032 | 7.9039 | 2.1365 | 2.136 | Bag | 498 | - | 15 | | 20 | Accept | 2.2289 | 8.5094 | 2.1365 | 2.136 | LSBoost | 404 | 0.1006 | 41 | |===================================================================================================================================| | Iter | Eval | Objective: | Objective | BestSoFar | BestSoFar | Method | NumLearningC-| LearnRate | MinLeafSize | | | result | log(1+loss) | runtime | (observed) | (estim.) | | ycles | | | |===================================================================================================================================| | 21 | Accept | 4.1723 | 1.7382 | 2.1365 | 2.1369 | LSBoost | 12 | 0.09538 | 1 | | 22 | Accept | 2.1635 | 8.015 | 2.1365 | 2.1361 | LSBoost | 360 | 0.014398 | 1 | | 23 | Accept | 2.1604 | 7.0202 | 2.1365 | 2.1369 | LSBoost | 313 | 0.018437 | 1 | | 24 | Accept | 2.2712 | 0.63144 | 2.1365 | 2.1369 | LSBoost | 19 | 0.16242 | 13 | | 25 | Accept | 2.5452 | 0.51069 | 2.1365 | 2.1369 | LSBoost | 15 | 0.9873 | 26 | | 26 | Accept | 2.1717 | 10.345 | 2.1365 | 2.1361 | LSBoost | 429 | 0.018333 | 4 | | 27 | Accept | 6.0793 | 0.3716 | 2.1365 | 2.1366 | LSBoost | 11 | 0.015762 | 12 | | 28 | Accept | 2.567 | 9.1921 | 2.1365 | 2.1366 | LSBoost | 387 | 0.99805 | 20 | | 29 | Accept | 2.2095 | 3.1473 | 2.1365 | 2.1366 | LSBoost | 143 | 0.20337 | 10 | | 30 | Accept | 2.2024 | 10.008 | 2.1365 | 2.1366 | LSBoost | 496 | 0.03898 | 34 | __________________________________________________________ Optimization completed. MaxObjectiveEvaluations of 30 reached. Total function evaluations: 30 Total elapsed time: 170.0211 seconds Total objective function evaluation time: 146.35 Best observed feasible point: Method NumLearningCycles LearnRate MinLeafSize ______ _________________ _________ ___________ Bag 500 NaN 1 Observed objective function value = 2.1365 Estimated objective function value = 2.1366 Function evaluation time = 11.4204 Best estimated feasible point (according to models): Method NumLearningCycles LearnRate MinLeafSize ______ _________________ _________ ___________ Bag 500 NaN 1 Estimated objective function value = 2.1366 Estimated function evaluation time = 9.2855
ensMdl = RegressionBaggedEnsemble ResponseName: 'Y' CategoricalPredictors: [] ResponseTransform: 'none' NumObservations: 398 HyperparameterOptimizationResults: [1x1 BayesianOptimization] NumTrained: 500 Method: 'Bag' LearnerNames: {'Tree'} ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.' FitInfo: [] FitInfoDescription: 'None' Regularization: [] FResample: 1 Replace: 1 UseObsForLearner: [398x500 logical]
fitrensemble
は、ランダム フォレスト アルゴリズム ('Bag'
) が最適な手法であると特定し、RegressionBaggedEnsemble
オブジェクトを返します。
Simulink モデルの作成
この例では、RegressionEnsemble Predictブロックを含む Simulink モデル slexCarDataRegressionEnsemblePredictExample.slx
が用意されています。この節の説明に従って、この Simulink モデルを開くことも、新しいモデルを作成することもできます。
Simulink モデル slexCarDataRegressionEnsemblePredictExample.slx
を開きます。
SimMdlName = 'slexCarDataRegressionEnsemblePredictExample';
open_system(SimMdlName)
Simulink モデルを開くと、Simulink モデルを読み込む前に、ソフトウェアがコールバック関数 PreLoadFcn
のコードを実行します。slexCarDataRegressionEnsemblePredictExample
のコールバック関数 PreLoadFcn
には、学習済みモデルの変数 ensMdl
がワークスペースにあるかどうかをチェックするコードが含まれています。ワークスペースに変数がない場合、PreLoadFcn
は標本データを読み込み、最適なハイパーパラメーターを使用してモデルに学習させ、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブで、[モデルのコールバック] ペインのコールバック関数 PreLoadFcn
を選択します。
新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、RegressionEnsemble Predict ブロックを追加します。Inport ブロックと Outport ブロックを追加して、それらを RegressionEnsemble Predict ブロックに接続します。
RegressionEnsemble Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[Select trained machine learning model] パラメーターを ensMdl
として指定します。これは、学習済みのモデルを含むワークスペース変数の名前です。[更新] ボタンをクリックします。ダイアログ ボックスの [Trained Machine Learning Model] に、モデル ensMdl
の学習に使用されるオプションが表示されます。
RegressionEnsemble Predict ブロックには、13 個の予測子の値を含む観測値が必要です。Inport ブロックをダブルクリックし、[信号属性] タブで [端子の次元] を 13 に設定します。
Simulink モデルの構造体配列の形式で、入力信号を作成します。構造体配列には、次のフィールドが含まれていなければなりません。
time
— 観測値がモデルに入力された時点。方向は予測子データ内の観測値に対応しなければなりません。したがって、この例の場合はtime
が列ベクトルでなければなりません。signals
—values
フィールドとdimensions
フィールドが含まれている、入力データを説明する 1 行 1 列の構造体配列。values
は予測子データの行列、dimensions
は予測子変数の個数です。
carsmall
データ セットから、slexCarDataRegressionEnsemblePredictExample
モデルに適切な構造体配列を作成します。carsmall
の Origin
を categorical
データ型配列 c_Origin_small
に変換する際は、c_Origin
と c_Origin_small
に同じ数のカテゴリが同じ順序で含まれるように categories(c_Origin)
を使用します。
load carsmall
c_Origin_small = categorical(cellstr(Origin),categories(c_Origin));
d_Origin_small = dummyvar(c_Origin_small);
testX = [Acceleration,Cylinders,Displacement,Horsepower,Model_Year,Weight,d_Origin_small];
testX = rmmissing(testX);
carsmallInput.time = (0:size(testX,1)-1)';
carsmallInput.signals(1).values = testX;
carsmallInput.signals(1).dimensions = size(testX,2);
ワークスペースから信号データをインポートするには、次を実行します。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開く。[モデル化] タブで、[モデル設定] をクリック。
[データのインポート/エクスポート] ペインで [入力] チェック ボックスをオンにし、隣のテキスト ボックスに
carsmallInput
と入力。[ソルバー] ペインの [シミュレーション時間] で、[終了時間] を
carsmallInput.time(end)
に設定。[ソルバーの選択] で、[タイプ] をFixed-step
に、[ソルバー] をdiscrete (no continuous states)
に設定。
詳細は、シミュレーションのための信号データの読み込み (Simulink)を参照してください。
モデルをシミュレートします。
sim(SimMdlName);
Inport ブロックは観測値を検出すると、その観測値を RegressionEnsemble Predict ブロックに送ります。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。