Main Content

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

この例では、ClassificationKNN Predictブロックを Simulink® のラベル予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みの最近傍分類モデルを使用することにより、その観測値の予測されたクラス ラベル、クラス スコア、および予測分類コストを返します。

最近傍分類器の学習

最近傍分類器に学習させ、テスト セットで分類器の性能を評価します。

fisheriris データ セットを読み込みます。150 本のアヤメについて 4 つの測定値が含まれる数値行列 X を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y を作成します。

load fisheriris
X = meas;
Y = species;

分割の再現性を得るため、乱数発生器のシードを設定します。Y のクラス情報を使用して、観測値を階層的に学習セットとテスト セットに無作為に分割します。観測値の約 80% を最近傍モデルの学習に使用し、観測値の約 20% を学習済みモデルの新しいデータでの性能のテストに使用します。

rng("default")
cv = cvpartition(Y,"HoldOut",0.2);

学習インデックスとテスト インデックスを抽出します。学習データ セットとテスト データ セットを指定します。

trainingInds = training(cv);
testInds = test(cv);

Xtrain = X(trainingInds,:);
Ytrain = Y(trainingInds);
Xtest = X(testInds,:);
Ytest = Y(testInds);

関数fitcknnを使用して、5 最近傍分類器に学習させます。非カテゴリカル予測子データを標準化します。

knnMdl = fitcknn(Xtrain,Ytrain, ...
    NumNeighbors=5,Standardize=1)
knnMdl = 
  ClassificationKNN
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'setosa'  'versicolor'  'virginica'}
           ScoreTransform: 'none'
          NumObservations: 120
                 Distance: 'euclidean'
             NumNeighbors: 5


knnMdl は学習させたClassificationKNNモデルです。

テスト セットの分類精度を計算して、テスト セットで分類器の性能を評価します。

testError = loss(knnMdl,Xtest,Ytest,LossFun="classiferror");
testAccuracy = 1 - testError
testAccuracy = 
0.9333

Simulink モデルの作成

ClassificationKNN Predictブロックを使用して新しいモデルを作成します。新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、Statistics and Machine Learning Toolbox™ ライブラリから ClassificationKNN Predict ブロックを追加します。

ClassificationKNN Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。モデルを含むワークスペース変数の名前を指定することにより、学習済みの ClassificationKNN モデルをブロックにインポートします。既定の変数名は knnMdl です。これは、コマンド ラインで学習させたモデルです。

[更新] ボタンをクリックして、ダイアログ ボックス内の学習済みモデルの設定を更新します。ダイアログ ボックスの [Trained Machine Learning Model] セクションに、モデル knnMdl の学習に使用されるオプションが表示されます。[Add output port for predicted class scores] チェック ボックスと [Add output port for expected classification cost] チェック ボックスをオンにして、ブロックに 2 番目 ("score") と 3 番目 ("cost") の出力端子を追加します。

classificationknn_predict_block_dialog.png

Inport ブロックを 1 つと Outport ブロックを 3 つ追加して、それらを ClassificationKNN Predict ブロックの入力と出力に接続します。

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

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

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

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

将来の予測用に適切な構造体配列を作成します。詳細については、時間付き構造体 (Simulink)を参照してください。

modelInput.time = (0:length(Ytest)-1)';
modelInput.signals(1).values = Xtest;
modelInput.signals(1).dimensions = size(Xtest,2);

ワークスペースから信号データをインポートします。

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

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

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

classificationknn_predict_block_solver.png

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

Outport 1 ブロックをクリックし、ブロック名を label に設定します。同様に、Outport 2 と Outport 3 のブロック名をそれぞれ scorecost に変更します。

指定されたモデルを開く

新しいモデルを作成する代わりに、用意されている Simulink モデル slexClassificationKNNPredictExample.slx を開くことができます。このモデルに ClassificationKNN Predict ブロックが含まれています。このモデルにアクセスするには、例をライブ スクリプトとして開く必要があります。

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

SimMdlName = "slexClassificationKNNPredictExample"; 
open_system(SimMdlName)

classificationknn_predict_simulink_model.png

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

Simulink モデルのシミュレート

Simulink モデルをシミュレートし、シミュレーション出力をワークスペースにエクスポートします。Inport ブロックでは、観測値を検出すると、その観測値を ClassificationKNN Predict ブロックに配置します。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

simOut = sim(SimMdlName)
simOut = 
  Simulink.SimulationOutput:
                   tout: [30x1 double] 
                   yout: [1x1 Simulink.SimulationData.Dataset] 

     SimulationMetadata: [1x1 Simulink.SimulationMetadata] 
           ErrorMessage: [0x0 char] 

シミュレートされた分類ラベルを調べます。

outputs = simOut.yout;
sim_label = outputs.get("label").Values.Data;

真のラベル (Ytest) と Simulink モデルによって予測されたラベル (sim_label) から混同行列チャートを作成します。

confusionchart(string(Ytest),string(sim_label))

Figure contains an object of type ConfusionMatrixChart.

対角線上の値が大きい場合は、対応するクラスについての予測が正確であることを示します。

参考

| |

関連するトピック