メインコンテンツ

Python Scikit-learn Model Predict ブロックを使用したクラスター割り当ての予測

この例では、Scikit-learn Model Predictブロックを Simulink® での予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、Python® で実行される学習済みの教師なし機械学習モデルを使用することにより、予測されたクラスター割り当てを返します。MATLAB® は、Python の参照実装 (通称 CPython) をサポートします。Mac または Linux® プラットフォームを使用している場合、Python は既にインストールされています。Windows® を使用している場合、"https://www.python.org/downloads/" などにある配布版をインストールする必要があります。詳細については、Python を使用するためのシステムの構成を参照してください。MATLAB Python 環境に scikit-learn モジュールがインストールされている必要があります。

Scikit-learn Model Predict ブロックには、pickle.dump()joblib.dump()、または skops.io.dump() を使用して Python で保存した事前学習済みの scikit-learn™ モデル ファイルが必要です。Python の対応する predict() メソッドがモデルでサポートされていなければなりません。この例では、保存されたモデル sklearnmodel.pkl が用意されています。これは、標準化されたフィッシャーのアヤメのデータで学習させた MiniBatchKMeans クラスタリング モデルを scikit-learn version 1.3.2 の pickle.dump() で保存したものです。また、この例では Python ファイル scaler.pklsklearnmodel.py、および preprocessor.py も用意されています。

用意されている Simulink モデルを開く

この例では、Scikit-learn Model Predict ブロックを含む Simulink モデル slexScikitLearnPredictExample.slx が用意されています。この Simulink モデルを開くことも、次のセクションの説明に従って新しいモデルを作成することもできます。

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

open_system("slexScikitLearnPredictExample");

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

Simulink モデルの作成

新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、Statistics and Machine Learning Toolbox™ ライブラリから Scikit-learn Model Predict ブロックを追加します。Inport ブロックと Outport ブロックを追加して、それらを Scikit-learn Model Predict ブロックに接続します。

Scikit-learn Model Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[scikit-learn モデル ファイルへのパス] テキスト ボックスに「sklearnmodel.pkl」と入力します。

scikitlearn.png

[入力] タブで、Python データ型を float に設定します。[前/後処理] タブで、[preprocess() を定義する Python ファイルへのパス] テキスト ボックスに「preprocessor.py」と入力します。[OK] をクリックします。

4 個の予測子変数をもつデータ セットを使用して Python モデルに学習させたため、Scikit-learn Model Predict ブロックには 4 個の予測子の値を含む観測値が必要です。Inport ブロックをダブルクリックし、[信号属性] タブで [端子の次元] を 4 に設定します。出力信号を入力信号と同じ長さに指定するには、[実行] タブで [サンプル時間] を 1 に設定します。[データを内挿する] チェック ボックスをオフにし、[OK] をクリックします。

フィッシャーのアヤメのデータ セットを読み込みます。これには、150 個の観測値と 4 個の予測子が格納されています。Python モデルの学習に使用したものとは異なる新しい観測値をシミュレートするには、観測値にランダムなガウス ノイズを追加します。

rng(0,"twister") % For reproducibility
load fisheriris
meas = meas + 0.1*randn(size(meas));

入力データ用に適切な構造体配列を作成します。詳細については、Control How Models Load Input Data (Simulink)を参照してください。

modelInput.time = (1:size(meas,1))'-1;
modelInput.signals.values = meas;
modelInput.signals.dimensions = size(meas,2);

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

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

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスの左側で、[データのインポート/エクスポート] をクリックします。次に、[入力] チェック ボックスをオンにし、隣のテキスト ボックスに「modelInput」と入力します。

  3. 左側で [ソルバー] をクリックします。[シミュレーション時間] で、[終了時間]size(meas,1)-1 に設定します。[ソルバーの選択] で、[タイプ]Fixed-step に、[ソルバー]discrete (no continuous states) に設定します。[OK] をクリックします。

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

モデルを Simulink で slexScikitLearnPredictExample.slx として保存します。

Simulink モデルのシミュレート

Simulink モデルをシミュレートして、入力観測値のクラスター割り当てを予測します。Python のインストールで version 1.3.2 より前の scikit-learn を使用している場合、警告メッセージが表示されることがあります。

simOut=sim("slexScikitLearnPredictExample");

Inport ブロックは、観測値を検出すると、それらを Scikit-learn Model Predict ブロックに配置します。Scikit-learn Model Predict ブロックは、予測子データを Python または NumPy のデータ型に変換します。[ブロック パラメーター] ダイアログ ボックスの [入力] タブにある [Python Datatype] 列で指定されたデータ型です。ブロックがデータを Python に渡すと、preprocessor.py で定義されている関数を使用してデータが標準化され、次にデータが Python モデルに送られます。観測値の予測されたクラスター割り当てが Python モデルから返されます。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

モデル予測の可視化

3 番目の予測子変数と 2 番目の予測子変数の散布図を作成します。モデルによって予測されたクラスター割り当てごとに異なる色を割り当てます。

C = squeeze(simOut.yout.getElement(1).Values.Data);
gscatter(meas(:,2),meas(:,3),C')

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent 0, 1, 2.

参考

|