Main Content

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

R2023a 以降

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

分類モデルの学習

Web ページにおける単語の頻度に基づいて、そのページが Statistics and Machine Learning Toolbox™ ドキュメンテーションのものであるかどうかを識別するようにモデルに学習させます。このタイプのモデルは "bag-of-words" モデルと呼ばれます。

nlp データ セットを読み込みます。これには、予測子の行列 X とラベルのベクトル Y が含まれています。予測子データ X は、MathWorks® ドキュメンテーション ページから計算された単語頻度のスパース行列です。Y のラベルは、ページが属するツールボックスの名前です。

load nlpdata

ディクショナリやコーパスなどのデータ セットの詳細については、「Description」と入力します。

観測値がラベルごとに並べられているため、データ セットをシャッフルします。

n = size(X,1);
rng("default") % For reproducibility
shflidx = randperm(n);
X = X(shflidx,:);
Y = Y(shflidx);

Statistics and Machine Learning Toolbox のドキュメンテーション Web ページに対応するラベルを識別します。

Ystats = Y == "stats";

データの 90% が観測され、残りは見当たらないものと仮定します。現在の標本と将来の標本にデータを分割します。

c = cvpartition(Ystats,Holdout=0.1);
idxPrsnt = training(c);
idxFtr = test(c);

prsntX = X(idxPrsnt,:);
prsntY = Ystats(idxPrsnt);
ftrX = X(idxFtr,:);
ftrY = Ystats(idxFtr);

現在使用可能なすべてのデータを使用して線形モデルに学習させます。

linearMdl = fitclinear(prsntX,prsntY);

linearMdlClassificationLinearモデルです。

linearMdlClassNames プロパティを使用して、陰性および陽性のクラス名をチェックします。

linearMdl.ClassNames
ans = 2x1 logical array

   0
   1

陰性のクラスは logical 0 で、陽性のクラスは logical 1 です。logical 1 のラベルは、そのページが Statistics and Machine Learning Toolbox ドキュメンテーションのものであることを示します。ClassificationLinear Predict ブロックの "score" 端子からの出力値は同じ順序です。1 番目および 2 番目の要素が、それぞれ陰性クラスのスコアおよび陽性クラスのスコアに対応します。

Simulink モデルの作成

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

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

SimMdlName = "slexNLPClassificationLinearPredictExample"; 
open_system(SimMdlName)

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

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

ClassificationLinear Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[学習済み機械学習モデルを選択] パラメーターを linearMdl として指定します。これは、学習済みの線形モデルを含むワークスペース変数です。[更新] ボタンをクリックします。ダイアログ ボックスの [学習済みの機械学習モデル] に、線形モデル linearMdl の学習に使用されるオプションが表示されます。[Add output port for predicted class scores] チェック ボックスをオンにして、2 番目の出力端子 score を追加します。

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

  • time — 観測値がモデルに入力された時点。この例では、期間に 0 ~ nftrX - 1 の整数を含めます。ここで、nftrX は入力データ内の標本の数です。方向は予測子データ内の観測値に対応しなければなりません。したがって、この場合は time が列ベクトルでなければなりません。

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

スパース行列 ftrX を非スパースのストレージ構造に変換した後の将来の行列の標本用に、関数fullを使用して適切な構造体配列を作成します。

[nftrX,p] = size(ftrX);
nlp.time = (1:nftrX)' - 1;
nlp.signals(1).values = full(ftrX);
nlp.signals(1).dimensions = p;

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

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

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

  • [ソルバー] ペインの [シミュレーション時間] で、[終了時間]nlp.time(end) に設定。[ソルバーの選択] で、[タイプ]Fixed-step に、[ソルバー]discrete (no continuous states) に設定。[ソルバーの詳細] で、Fixed-step size を 1 に設定。これらの設定により、nlp の各標本についてのシミュレーションをモデルで実行できます。

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

モデルをシミュレートします。

sim(SimMdlName);

Inport ブロックでは、観測値を検出すると、その観測値を ClassificationLinear Predict ブロックに送ります。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。

参考

| | |

関連するトピック