ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

コード生成と分類学習器アプリ

分類学習器は、分類モデルを対話的に選択して学習をさせるために適していますが、学習済みモデルに基づいてデータにラベルを付ける C/C++ コードを生成しません。分類学習器アプリの [エクスポート] セクションの [関数の生成] ボタンは、モデルに学習をさせるための MATLAB コードを生成しますが、C/C++ コードは生成しません。この例では、エクスポートされた分類モデルを使用して、ラベルを予測する関数から C コードを生成する方法を示します。この例では、以下の手順に従って、与えられた各種の財務比率から会社の信用格付けを予測するモデルを構築します。

  1. Statistics and Machine Learning Toolbox™ に含まれているファイル CreditRating_Historical.dat 内の信用格付けデータセットを使用します。

  2. 主成分分析 (PCA) を使用して、データの次元を削減します。

  3. ラベル予測についてコード生成をサポートする一連のモデルに学習をさせます。

  4. 5 分割交差検証以上の分類精度をもつモデルをエクスポートします。

  5. エントリポイント関数から C コードを生成します。この関数では、新しい予測子データを変換してから、エクスポート済みのモデルを使用して対応するラベルを予測します。

標本データの読み込み

標本データを読み込み、データを分類学習器アプリにインポートします。散布図を使用してデータを確認し、不要な予測子を削除します。

readtable を使用して、ファイル CreditRating_Historical.dat 内の過去の信用格付けデータセットを table に読み込みます。

creditrating = readtable('CreditRating_Historical.dat');

[アプリケーション] タブで [分類学習器] をクリックします。

分類学習器の [分類学習器] タブで、[ファイル] セクションの [新規セッション] をクリックし、[ワークスペースから] を選択します。

[新規セッション] ダイアログ ボックスでテーブル creditrating を選択します。応答として認識されたものを除くすべての変数は倍精度数値ベクトルです。[セッションの開始] をクリックして 5 分割交差検証の分類精度に基づき、分類モデルを比較します。

分類学習器がデータを読み込み、変数 WC_TA および ID の散布図をプロットします。識別番号はプロットに表示しても有用ではないので、[予測子][X]RE_TA を選択します。

散布図は、2 つの変数がクラス AAABBBBB および CCC をかなり良好に分類できることを示しています。しかし、残りのクラスに対応する観測値は、これらのクラスに混ざっています。

識別番号は予測に有用ではありません。したがって、[特徴量] セクションで [特徴選択] をクリックしてから [ID] チェック ボックスの選択を解除します。[新規セッション] ダイアログ ボックスのチェック ボックスを使用して、不要な予測子をはじめから削除することもできます。この例では、すべての予測子を含めた場合に、コード生成には使用されない予測子を削除する方法を示します。

PCA の有効化

データの次元を削減するため、PCA を有効にします。

[特徴量] セクションで [PCA] をクリックし [主成分分析を有効化] を選択します。これにより PCA が予測子データに適用され、モデルに学習をさせる前にデータが変換されます。分類学習器は、変動性の 95% を総体として説明する成分のみを使用します。

モデルの学習

ラベル予測についてコード生成をサポートする一連のモデルに学習をさせます。

以下の分類モデルおよびオプションを選択します。これらはラベル予測用のコード生成をサポートします。その後、交差検証を実施します (詳細はコード生成のサポート、使用上の注意事項および制限事項を参照)。各モデルを選択するには、[モデル タイプ] セクションで [さらに表示] の矢印をクリックしてからモデルをクリックします。モデルを選択してオプションを指定したら、開いているメニューをすべて閉じ、[学習] セクションの [学習] をクリックします。

選択するモデルおよびオプション説明
[決定木][すべての木] を選択さまざまな複雑度の分類木
[サポート ベクター マシン][すべての SVM] を選択さまざまな複雑度でさまざまなカーネルを使用する SVM。複雑な SVM ではあてはめに時間が必要。
[アンサンブル分類器][ブースティング決定木] を選択。[モデル タイプ] セクションで [詳細設定] をクリック。[最大分割数][5] に減らし [学習器の数][100] に増やす。ブースティングされた分類木のアンサンブル
[アンサンブル分類器][バギング決定木] を選択。[モデル タイプ] セクションで [詳細設定] をクリック。[最大分割数][50] に増やし [学習器の数][100] に増やす。分類木のランダム フォレスト

各モデル タイプの交差検証後、各モデルおよびその 5 分割交差検証による分類精度がデータ ブラウザーに表示され、最高精度をもつモデルが強調表示されます。

5 分割交差検証による分類精度が最大のモデル (細かいガウス SVM 学習器の誤り訂正出力符号 (ECOC) モデル) を選択します。PCA を有効にすると、分類学習器は 6 つの予測子のうち 2 つを使用します。

[プロット] セクションで [混同行列] をクリックします。

このモデルは、クラス AB および C を良好に識別します。ただし、これらのグループ内の特定のレベル、特に下の B レベル間では識別が不十分です。

ワークスペースへのモデルのエクスポート

モデルを MATLAB® ワークスペースにエクスポートし、saveCompactModel を使用してモデルを保存します。

[エクスポート] セクションで [モデルのエクスポート] をクリックし [コンパクト モデルのエクスポート] を選択します。ダイアログ ボックスの [OK] をクリックします。

構造体 trainedModel が MATLAB のワークスペースに現れます。trainedModelClassificationSVM フィールドにコンパクト モデルが含まれています。

コマンド ラインで、現在のフォルダーの ClassificationLearnerModel.mat という名前のファイルにコンパクト モデルを保存します。

saveCompactModel(trainedModel.ClassificationSVM,'ClassificationLearnerModel')

予測用の C コードの生成

オブジェクト関数を使用する予測には学習済みのモデル オブジェクトが必要ですが、codegen-args オプションはこのようなオブジェクトを受け入れません。saveCompactModelloadCompactModel を使用して、この制限に対処します。saveCompactModel を使用して、学習済みモデルを保存します。次に、loadCompactModel を使用して保存済みモデルを読み込んで関数 predict を呼び出す、エントリポイント関数を定義します。最後に、codegen を使用して、エントリポイント関数のコードを生成します。

データの前処理

学習データの場合と同じ方法で新しいデータの前処理を行います。

前処理を行うには、次の 3 つのモデル パラメーターが必要です。

  • removeVars — データから削除する変数のインデックスを識別する、最大で p 個の要素がある列ベクトル。p は生データ内の予測子変数の個数

  • pcaCenters — 厳密に q 個の PCA の中心から成る行ベクトル

  • pcaCoefficientsqr 列の PCA 係数行列。r は最大で q

分類学習器で [特徴選択] を使用してデータを選択するときに削除した予測子変数のインデックスを指定します。PCA 統計量を trainedModel から抽出します。

removeVars = 1;
pcaCenters = trainedModel.PCACenters;
pcaCoefficients = trainedModel.PCACoefficients;

モデル パラメーターを現在のフォルダーの ModelParameters.mat という名前のファイルに保存します。

save('ModelParameters.mat','removeVars','pcaCenters','pcaCoefficients');

エントリポイント関数の定義

エントリポイント関数は、コード生成用に定義する関数です。codegen を使用して最上位レベルの関数を呼び出すことはできないので、コード生成に対応する関数を呼び出すエントリポイント関数を定義し、codegen を使用してエントリポイント関数の C/C++ コードを生成しなければなりません。

現在のフォルダー内に、以下を行う mypredictCL.m という名前の関数を定義します。

  • 分類学習器に渡したものと同じ予測子変数が含まれている、生の観測値の数値行列 (X) を受け入れる

  • ClassificationLearnerModel.mat 内の分類モデルと ModelParameters.mat 内のモデル パラメーターを読み込む

  • removeVars 内のインデックスに対応する予測子変数を削除する

  • 分類学習器によって推定された PCA の中心 (pcaCenters) と係数 (pcaCoefficients) を使用して、残りの予測子データを変換する

  • モデルを使用して予測したラベルを返す。

function label = mypredictCL(X) %#codegen
%MYPREDICTCL Classify credit rating using model exported from
%Classification Learner
%   MYPREDICTCL loads trained classification model (SVM) and model
%   parameters (removeVars, pcaCenters, and pcaCoefficients), removes the
%   columns of the raw matrix of predictor data in X corresponding to the
%   indices in removeVars, transforms the resulting matrix using the PCA
%   centers in pcaCenters and PCA coefficients in pcaCoefficients, and then
%   uses the transformed data to classify credit ratings. X is a numeric
%   matrix with n rows and 7 columns. label is an n-by-1 cell array of
%   predicted labels.

% Load trained classification model and model parameters
SVM = loadLearnerForCoder('ClassificationLearnerModel');
data = coder.load('ModelParameters');
removeVars = data.removeVars;
pcaCenters = data.pcaCenters;
pcaCoefficients = data.pcaCoefficients;

% Remove unused predictor variables
keepvars = 1:size(X,2);
idx = ~ismember(keepvars,removeVars);
keepvars = keepvars(idx);
XwoID = X(:,keepvars);

% Transform predictors via PCA
Xpca = bsxfun(@minus,XwoID,pcaCenters)*pcaCoefficients;

% Generate label from SVM
label = predict(SVM,Xpca);
end

コードの生成

C および C++ は静的な型の言語なので、エントリポイント関数内のすべての変数のプロパティをコンパイル時に決定しなければなりません。coder.typeof を使用して可変サイズの引数を指定し、この引数を使用してコードを生成します。

coder.typeof を使用して、コード生成用の x という名前の倍精度行列を作成します。x の行数が任意であり x の列数が p であることを指定します。

p = size(creditrating,2) - 1;
x = coder.typeof(0,[Inf,p],[1 0]);

可変サイズの引数の指定に関する詳細については、コード生成用の可変サイズ引数の指定を参照してください。

mypredictCL.m から MEX 関数を生成します。-args オプションを使用して、x を引数として指定します。

codegen mypredictCL -args x

codegen は MEX ファイル mypredictCL_mex.mexw64 を現在のフォルダーに生成します。ファイルの拡張子はプラットフォームによって異なります。

生成されたコードの確認

予期されるラベルを MEX 関数が返すことを確認します。

応答変数を元のデータセットから削除し、15 個の観測値を無作為に抽出します。

rng('default'); % For reproducibility
m = 15;
testsampleT = datasample(creditrating(:,1:(end - 1)),m);

分類学習器によって学習をさせた分類モデルで predictFcn を使用して、対応するラベルを予測します。

testLabels = trainedModel.predictFcn(testsampleT);

生成されたテーブルを行列に変換します。

testsample = table2array(testsampleT);

testsample の列は、分類学習器で読み込んだ予測子データの列に対応します。

テスト データを mypredictCL に渡します。関数 mypredictCL は、分類学習器で学習をさせた分類モデルと predict を使用して、対応するラベルを予測します。

testLabelsPredict = mypredictCL(testsample);

生成された MEX 関数 mypredictCL_mex を使用して、対応するラベルを予測します。

testLabelsMEX = mypredictCL_mex(testsample);

予測子のセットを比較します。

isequal(testLabels,testLabelsMEX,testLabelsPredict)
ans =

  logical

   1

すべての入力が等しい場合、isequal は logical 1 (true) を返します。predictFcnmypredictCL および MEX 関数は同じ値を返します。

参考

| | | |

関連するトピック