ClassificationECOC Predict ブロックの使用によるクラス ラベルの予測
この例では、ClassificationECOC Predictブロックを Simulink® のラベル予測に使用する方法を示します。このブロックは、観測値 (予測子データ) を受け入れて、学習済みの誤り訂正出力符号 (ECOC) 分類モデルを使用することにより、その観測値の予測されたクラス ラベルとクラス スコア、およびバイナリ学習器の陽性クラスのスコアを返します。
分類モデルの学習
humanactivity
データ セットを読み込みます。このデータ セットには、人間の次の 5 種類の身体動作についての 24,075 個の観測値が含まれています。座る、立つ、歩く、走る、踊るです。各観測値には、スマートフォンの加速度センサーによって測定された加速度データから抽出した 60 個の特徴量が含まれています。
load humanactivity
24,075 個の観測値に対する 60 個の特徴量を格納する数値行列として予測子 X
を作成します。活動 ID を整数で格納する数値ベクトルとしてクラス ラベル Y
を作成します。1 ~ 5 はそれぞれ、座る、立つ、歩く、走る、踊る、を表します。
X = feat; Y = actid;
Y
のクラス情報を使用して、観測値を階層的に学習セットとテスト セットに無作為に分割します。観測値の約 80% を ECOC モデルの学習に使用し、観測値の約 20% を学習済みモデルの新しいデータでの性能のテストに使用します。
rng("default") % 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
を関数 fitcecoc
に渡して、ECOC 分類モデルに学習させます。
ecocMdl = fitcecoc(XTrain,YTrain);
ecocMdl
はClassificationECOC
モデルです。ドット表記を使用して ecocMdl
のプロパティにアクセスできます。たとえば、モデルの符号化設計行列を表示するには「ecocMdl.CodingMatrix
」と入力します。
ecocMdl.CodingMatrix
ans = 5×10
1 1 1 1 0 0 0 0 0 0
-1 0 0 0 1 1 1 0 0 0
0 -1 0 0 -1 0 0 1 1 0
0 0 -1 0 0 -1 0 -1 0 1
0 0 0 -1 0 0 -1 0 -1 -1
符号化設計行列の各行はクラスに対応し、各列はバイナリ学習器に対応します。たとえば、1 番目のバイナリ学習器はクラス 1 と 2、4 番目のバイナリ学習器はクラス 1 と 5 に対応しており、どちらの学習器でもクラス 1 を陽性クラスと仮定しています。
各バイナリ学習器のモデル タイプを表示するには、「ecocMdl.BinaryLearners
」と入力します。
ecocMdl.BinaryLearners
ans=10×1 cell array
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
{1x1 classreg.learning.classif.CompactClassificationSVM}
バイナリ学習器の損失関数を表示するには、「ecocMdl.BinaryLoss
」と入力します。
ecocMdl.BinaryLoss
ans = 'hinge'
このモデルでは、新しい観測値を分類するために、バイナリ学習器の陽性クラスの分類スコアを計算し、そのスコアにヒンジ関数を適用してバイナリ損失を計算してから、そのバイナリ損失を損失に重みを付けた復号化方式を使用して分類スコアに結合します。
関数 predict
を使用して、新しい観測値のラベル、分類スコア、および陽性クラスのスコアを計算して表示します。
[label,scores,pbscores] = predict(ecocMdl,XTest(1,:)); label
label = 1
scores
scores = 1×5
0 -0.7281 -1.1774 -2.4186 -2.1109
pbscores'
ans = 10×1
4.8247
2.6695
2.4870
1.9088
4.7496
7.5894
9.4470
3.8461
2.5316
-1.4261
ClassificationECOC Predict ブロックでは、ブロックに渡す観測値ごとに 3 つの出力を返すことができます。
Simulink モデルの作成
この例では、ClassificationECOC Predictブロックを含む Simulink モデル slexClassificationECOCPredictExample.slx
が用意されています。この節の説明に従って、この Simulink モデルを開くことも、新しいモデルを作成することもできます。
Simulink モデル slexClassificationECOCPredictExample.slx
を開きます。
SimMdlName = "slexClassificationECOCPredictExample";
open_system(SimMdlName)
Simulink モデルを開くと、Simulink モデルを読み込む前に、ソフトウェアがコールバック関数 PreLoadFcn
のコードを実行します。slexClassificationECOCPredictExample
のコールバック関数 PreLoadFcn
には、学習済みモデルの変数 ecocMdl
がワークスペースにあるかどうかをチェックするコードが含まれています。ワークスペースに変数がない場合、PreLoadFcn
は標本データを読み込み、ECOC モデルに学習させ、Simulink モデルの入力信号を作成します。コールバック関数を表示するには、[モデル化] タブの [設定] セクションで、[モデル設定] をクリックし、[モデル プロパティ] を選択します。次に、[コールバック] タブで、[モデルのコールバック] ペインのコールバック関数 PreLoadFcn
を選択します。
新しい Simulink モデルを作成するには、[空のモデル] テンプレートを開き、ClassificationECOC Predict ブロックを追加します。Inport ブロックと Outport ブロックを追加して、それらを ClassificationECOC Predict ブロックに接続します。
ClassificationECOC Predict ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。[学習済み機械学習モデルを選択] パラメーターを ecocMdl
として指定します。これは、学習済みの ECOC モデルを含むワークスペース変数です。[更新] ボタンをクリックします。ダイアログ ボックスの [学習済みの機械学習モデル] に、ecocMdl
の学習に使用されるオプションが表示されます。[予測済みクラス スコア用の出力端子を追加 (符号を反転した平均バイナリ損失)] のチェック ボックスをオンにして 2 番目の出力端子 "score" を追加し、[バイナリ学習器の陽性クラスのスコアに対する出力端子を追加] のチェック ボックスをオンにして 3 番目の出力端子 "pbscore" を追加します。[OK] をクリックします。
Simulink モデルの構造体配列の形式で、入力信号を作成します。構造体配列には、次のフィールドが含まれていなければなりません。
time
— 観測値がモデルに入力された時点。この例では、期間に 0 ~nTest – 1
の整数を含めます。ここで、nTest
はテスト データ内の標本の数です。方向は予測子データ内の観測値に対応しなければなりません。したがって、この場合はtime
が列ベクトルでなければなりません。signals
—values
フィールドとdimensions
フィールドが含まれている、入力データを説明する構造体配列。values
は予測子データの行列、dimensions
は予測子変数の個数です。
人の行動のテスト データ セット用に適切な構造体配列を作成します。
[nTest,p] = size(XTest); activityInput.time = (0:(nTest-1))'; activityInput.signals(1).values = XTest; activityInput.signals(1).dimensions = p;
ワークスペースから信号データをインポートするには、次を実行します。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開く。[モデル化] タブの [設定] セクションで、[モデル設定] をクリック。
[データのインポート/エクスポート] ペインで [入力] チェック ボックスをオンにし、隣のテキスト ボックスに「
activityInput
」と入力。[ソルバー] ペインの [シミュレーション時間] で、[終了時間] を
activityInput.time(end)
に設定。[ソルバーの選択] で、[タイプ] をFixed-step
に、[ソルバー] をdiscrete (no continuous states)
に設定。[ソルバーの詳細] で、Fixed-step size
を 1 に設定。これらの設定により、activityInput
の各標本についてのシミュレーションをモデルで実行できます。
詳細は、シミュレーションのための信号データの読み込み (Simulink)を参照してください。
モデルをシミュレートします。
sim(SimMdlName);
Inport ブロックでは、観測値を検出すると、その観測値を ClassificationECOC Predict ブロックに送ります。シミュレーション データ インスペクター (Simulink)を使用して、Outport ブロックのログ データを表示できます。
参考
ClassificationECOC Predict | ClassificationEnsemble Predict | ClassificationSVM Predict | ClassificationLinear Predict | ClassificationECOC
| predict
| fitcecoc