Main Content

RegressionSVM Predict ブロックの使用による応答の予測

この例では、回帰学習器アプリを使用してサポート ベクター マシン (SVM) 回帰モデルの学習を行い、RegressionSVM Predictブロックを Simulink® の応答予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みの SVM 回帰モデルを使用することにより、その観測値の予測された応答を返します。

回帰学習器アプリでの回帰モデルの学習

回帰学習器アプリでハイパーパラメーターの最適化を使用して、SVM 回帰モデルの学習を行います。

1.MATLAB® コマンド ウィンドウで carbig データ セットを読み込み、予測子変数の大部分を含む行列と応答変数のベクトルを作成します。

load carbig
X = [Acceleration,Cylinders,Displacement,Horsepower,Model_Year,Weight];
Y = MPG;

2.X および Y からいずれかの配列に欠損値がある行を削除します。

R = rmmissing([X Y]);
X = R(:,1:end-1);
Y = R(:,end);

3.回帰学習器を開きます。[アプリ] タブの [アプリ] セクションで [さらに表示] 矢印をクリックして、アプリ ギャラリーを表示します。[機械学習および深層学習] グループの [回帰学習器] をクリックします。

4.[回帰学習器] タブで、[ファイル] セクションの [新規セッション] を選択し、[ワークスペースから] を選択します。

5.[ワークスペースからの新規セッション] ダイアログ ボックスで、[データ セット変数] のリストから行列 X を選択します。[応答][ワークスペースから] オプション ボタンをクリックし、ワークスペースからベクトル Y を選択します。既定の検証オプションは 5 分割交差検証であるため、過適合が防止されます。この例では、既定の設定を変更しないでください。

RegressionSVMPredictExample_LearnerApp_import_data.png

6.既定のオプションをそのまま使用して続行するため、[セッションの開始] をクリックします。

7.学習させる最適化可能な SVM モデルを選択します。[回帰学習器] タブの [モデル] セクションで [さらに表示] 矢印をクリックしてギャラリーを開きます。[サポート ベクター マシン] グループで [最適化可能な SVM] をクリックします。

8.最適化するモデル ハイパーパラメーターを選択します。[概要] タブで、最適化するハイパーパラメーターの [最適化] チェック ボックスを選択できます。既定では、利用可能なハイパーパラメーターのすべてのチェック ボックスが選択されます。この例では、[カーネル関数] および [データの標準化][最適化] チェック ボックスをオフにします。カーネル関数に Gaussian 以外の固定値がある場合は、既定で [カーネル スケール][最適化] チェック ボックスがオフにされます。Gaussian カーネル関数を選択し、[カーネル スケール][最適化] チェック ボックスを選択します。

RegressionSVMPredictExample_LearnerApp1_optimizable_tree.png

9.[学習] セクションで、[すべてを学習] をクリックして [選択を学習] を選択します。最適化が実行されると [最小 MSE のプロット] が表示されます。反復ごとに、ハイパーパラメーター値の異なる組み合わせが試され、その反復までに観測された最小検証の平均二乗誤差 (MSE) をもつプロットが更新され、濃い青で示されます。最適化プロセスが完了すると、最適化された一連のハイパーパラメーターが選択され、赤の四角形で示されます。詳細は、最小 MSE のプロットを参照してください。

最適化されたハイパーパラメーターはプロットの右の [最適化の結果] セクションとモデルの [概要] タブの [モデルのハイパーパラメーター] セクションの両方に一覧表示されます。一般に、最適化の結果に再現性はありません。

10.モデルを MATLAB ワークスペースにエクスポートします。[回帰学習器] タブで、[エクスポート] セクションの [モデルのエクスポート] をクリックし、[モデルのエクスポート] を選択して [OK] をクリックします。エクスポートされたモデルの既定の名前は trainedModel です。

あるいは、アプリでの SVM モデルの学習時と同じ設定を使用して回帰モデルの学習を行う MATLAB コードを生成できます。[回帰学習器] タブの [エクスポート] セクションで [関数の生成] をクリックします。アプリによってコードがセッションから生成され、ファイルが MATLAB エディターに表示されます。ファイルでは、予測子変数と応答変数を受け入れ、回帰モデルの学習を行い、交差検証を実行する関数が定義されます。関数名を trainRegressionSVMModel に変更し、関数ファイルを保存します。関数 trainRegressionSVMModel を使用して、SVM モデルの学習を行います。

trainedModel = trainRegressionSVMModel(X,Y);

11.学習済みの SVM モデルを trainedModel 変数から抽出します。trainedModel には、RegressionSVM フィールドのRegressionSVMモデル オブジェクトが含まれます。

svmMdl = trainedModel.RegressionSVM;

ハイパーパラメーターの最適化によってモデルが過適合になることがあるため、回帰学習器アプリにデータをインポートする前にテスト セットを別途作成しておき、最適化されたモデルの性能をそのテスト セットで確認することを推奨します。詳細は、回帰学習器アプリのハイパーパラメーターの最適化を使用した回帰モデルの学習を参照してください。

Simulink モデルの作成

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

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

SimMdlName = 'slexCarDataRegressionSVMPredictExample'; 
open_system(SimMdlName)

slexCarDataRegressionSVMPredictExampleAfterOpenSystem.png

Simulink モデルを開くと、Simulink モデルを読み込む前に、ソフトウェアがコールバック関数 PreLoadFcn のコードを実行します。slexCarDataRegressionSVMPredictExample のコールバック関数 PreLoadFcn には、学習済みモデルの変数 svmMdl がワークスペースにあるかどうかをチェックするコードが含まれています。ワークスペースに変数がない場合、PreLoadFcn は標本データを読み込み、SVM モデルに学習させ、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブで、[モデルのコールバック] ペインのコールバック関数 PreLoadFcn を選択します。

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

RegressionSVM Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。学習済みの SVM モデルを含むワークスペース変数の名前を指定できます。既定の変数名は svmMdl です。[更新] ボタンをクリックします。ダイアログ ボックスの Trained Machine Learning Model には、SVM モデル svmMdl の学習に使用されるオプションが表示されます。

RegressionSVMPredictExample_BlockDialog.png

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

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

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

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

carsmall データ セットから、slexCarDataRegressionSVMPredictExample モデルに適切な構造体配列を作成します。

load carsmall
testX = [Acceleration,Cylinders,Displacement,Horsepower,Model_Year,Weight];
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 ブロックでは、観測値を検出すると、その観測値を RegressionSVM Predict ブロックに送ります。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

参考

関連するトピック