メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

R2023b 以降

この例では、ClassificationDiscriminant Predictブロックを Simulink® のラベル予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みの判別分析分類モデルを使用することにより、その観測値の予測クラス ラベル、クラス スコア、および予測分類コストを返します。この例を完了するには、用意されている Simulink モデルを使用することも、新しいモデルを作成することもできます。

分類モデルの学習

humanactivity データ セットを読み込みます。このデータ セットには、人間の次の 5 種類の身体動作についての 24,075 個の観測値が含まれています。座る、立つ、歩く、走る、踊るです。各観測値には、スマートフォンの加速度センサーによって測定された加速度データから抽出した 60 個の特徴量が含まれています。

load humanactivity

24,075 個の観測値に対する 60 個の特徴量を格納する数値行列として予測子 X を作成します。活動 ID を整数で格納する数値ベクトルとしてクラス ラベル Y を作成します。1 ~ 5 はそれぞれ、座る、立つ、歩く、走る、踊る、を表します。

X = feat;
Y = actid;

Y のクラス情報を使用して、観測値を階層的に学習セットとテスト セットに無作為に分割します。観測値の約 80% を判別分析モデルの学習に使用し、観測値の約 20% を学習済みモデルの新しいデータでの性能のテストに使用します。

rng(0,"twister") % For reproducibility of the partition
cv = cvpartition(Y,"Holdout",0.20);

学習インデックスとテスト インデックスを抽出します。

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

学習データ セットとテスト データ セットを指定します。

XTrain = X(trainingInds,:);
YTrain = Y(trainingInds);
XTest = X(testInds,:);
YTest = Y(testInds);

学習データ XTrain および YTrain を関数 fitcdiscr に渡して、判別分析分類モデルに学習させます。

daMdl = fitcdiscr(XTrain,YTrain);

daMdl は学習させた ClassificationDiscriminant モデルです。ドット表記を使用して daMdl のプロパティにアクセスできます。たとえば、「daMdl.ModelParameters」と入力すると、学習済みモデルのパラメーターについての詳細情報を取得できます。

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

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

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

open_system("slexClassificationDAPredictExample")

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

Simulink モデルの作成

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

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

[予測済みクラス スコア用の出力端子を追加] のチェック ボックスをオンにして 2 番目の出力端子 "score" を追加し、[予測される分類コストの出力端子を追加] のチェック ボックスをオンにして 3 番目の出力端子 "cost" を追加します。[OK] をクリックします。

[リフレッシュ] ボタンをクリックして、ダイアログ ボックス内の学習済みモデルの設定を更新します。ダイアログ ボックスの [学習済みの機械学習モデル] セクションに、モデル daMdl の学習に使用されるオプションが表示されます。

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

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

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

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

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

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

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

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

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

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

  • [ソルバー] ペインの [シミュレーション時間] で、[終了時間]modelInput.time(end) に設定。[ソルバーの選択] で、[タイプ]Fixed-step に、[ソルバー]discrete (no continuous states) に設定。これらの設定により、modelInput の各クエリ点についてのシミュレーションをモデルで実行できます。[OK] をクリックします。

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

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

モデルをシミュレーション

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

simOut = sim("slexClassificationDAPredictExample");

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

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.

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