分類学習器は、分類モデルを対話的に選択して学習をさせるために適していますが、学習済みモデルに基づいてデータにラベルを付ける C/C++ コードを生成しません。分類学習器アプリの [エクスポート] セクションの [関数の生成] ボタンは、モデルに学習をさせるための MATLAB コードを生成しますが、C/C++ コードは生成しません。この例では、エクスポートされた分類モデルを使用して、ラベルを予測する関数から C コードを生成する方法を示します。この例では、以下の手順に従って、与えられた各種の財務比率から会社の信用格付けを予測するモデルを構築します。
Statistics and Machine Learning Toolbox™ に含まれているファイル CreditRating_Historical.dat
内の信用格付けデータセットを使用します。
主成分分析 (PCA) を使用して、データの次元を削減します。
ラベル予測についてコード生成をサポートする一連のモデルに学習をさせます。
5 分割交差検証以上の分類精度をもつモデルをエクスポートします。
エントリポイント関数から C コードを生成します。この関数では、新しい予測子データを変換してから、エクスポート済みのモデルを使用して対応するラベルを予測します。
標本データを読み込み、データを分類学習器アプリにインポートします。散布図を使用してデータを確認し、不要な予測子を削除します。
readtable
を使用して、ファイル CreditRating_Historical.dat
内の過去の信用格付けデータセットを table に読み込みます。
creditrating = readtable('CreditRating_Historical.dat');
[アプリケーション] タブで [分類学習器] をクリックします。
分類学習器の [分類学習器] タブで、[ファイル] セクションの [新規セッション] をクリックし、[ワークスペースから] を選択します。
[新規セッション] ダイアログ ボックスでテーブル creditrating
を選択します。応答として認識されたものを除くすべての変数は倍精度数値ベクトルです。[セッションの開始] をクリックして 5 分割交差検証の分類精度に基づき、分類モデルを比較します。
分類学習器がデータを読み込み、変数 WC_TA
および ID
の散布図をプロットします。識別番号はプロットに表示しても有用ではないので、[予測子] の [X] に RE_TA
を選択します。
散布図は、2 つの変数がクラス AAA
、BBB
、BB
および CCC
をかなり良好に分類できることを示しています。しかし、残りのクラスに対応する観測値は、これらのクラスに混ざっています。
識別番号は予測に有用ではありません。したがって、[特徴量] セクションで [特徴選択] をクリックしてから [ID] チェック ボックスの選択を解除します。[新規セッション] ダイアログ ボックスのチェック ボックスを使用して、不要な予測子をはじめから削除することもできます。この例では、すべての予測子を含めた場合に、コード生成には使用されない予測子を削除する方法を示します。
データの次元を削減するため、PCA を有効にします。
[特徴量] セクションで [PCA] をクリックし [主成分分析を有効化] を選択します。これにより PCA が予測子データに適用され、モデルに学習をさせる前にデータが変換されます。分類学習器は、変動性の 95% を総体として説明する成分のみを使用します。
ラベル予測についてコード生成をサポートする一連のモデルに学習をさせます。
以下の分類モデルおよびオプションを選択します。これらはラベル予測用のコード生成をサポートします。その後、交差検証を実施します (詳細はコード生成の紹介を参照)。各モデルを選択するには、[モデル タイプ] セクションで [さらに表示] の矢印をクリックしてからモデルをクリックします。モデルを選択してオプションを指定したら、開いているメニューをすべて閉じ、[学習] セクションの [学習] をクリックします。
選択するモデルおよびオプション | 説明 |
---|---|
[決定木] で [すべての木] を選択 | さまざまな複雑度の分類木 |
[サポート ベクター マシン] で [すべての SVM] を選択 | さまざまな複雑度でさまざまなカーネルを使用する SVM。複雑な SVM ではあてはめに時間が必要。 |
[アンサンブル分類器] で [ブースティング木] を選択。[モデル タイプ] セクションで [詳細設定] をクリック。[最大分割数] を [5] に減らし [学習器の数] を [100] に増やす。 | 分類木のブースティング アンサンブル |
[アンサンブル分類器] で [バギング木] を選択。[モデル タイプ] セクションで [詳細設定] をクリック。[最大分割数] を [50] に増やし [学習器の数] を [100] に増やす。 | 分類木のランダム フォレスト |
各モデル タイプの交差検証後、各モデルおよびその 5 分割交差検証による分類精度がデータ ブラウザーに表示され、最高精度をもつモデルが強調表示されます。
5 分割交差検証による分類精度が最大のモデル (細かいガウス SVM 学習器の誤り訂正出力符号 (ECOC) モデル) を選択します。PCA を有効にすると、分類学習器は 6 つの予測子のうち 2 つを使用します。
[プロット] セクションで [混同行列] をクリックします。
このモデルは、クラス A
、B
および C
を良好に識別します。ただし、これらのグループ内の特定のレベル、特に下の B レベル間では識別が不十分です。
モデルを MATLAB® ワークスペースにエクスポートし、saveLearnerForCoder
を使用してモデルを保存します。
[エクスポート] セクションで [モデルのエクスポート] をクリックし [コンパクト モデルのエクスポート] を選択します。ダイアログ ボックスの [OK] をクリックします。
構造体 trainedModel
が MATLAB のワークスペースに現れます。trainedModel
の ClassificationSVM
フィールドにコンパクト モデルが含まれています。
コマンド ラインで、現在のフォルダーの ClassificationLearnerModel.mat
という名前のファイルにコンパクト モデルを保存します。
saveLearnerForCoder(trainedModel.ClassificationSVM,'ClassificationLearnerModel')
オブジェクト関数を使用する予測には学習済みのモデル オブジェクトが必要ですが、codegen
(MATLAB Coder) の -args
オプションはこのようなオブジェクトを受け入れません。saveLearnerForCoder
と loadLearnerForCoder
を使用して、この制限に対処します。saveLearnerForCoder
を使用して、学習済みモデルを保存します。次に、loadLearnerForCoder
を使用して保存済みモデルを読み込んで関数 predict
を呼び出す、エントリポイント関数を定義します。最後に、codegen
を使用して、エントリポイント関数のコードを生成します。
学習データの場合と同じ方法で新しいデータの前処理を行います。
前処理を行うには、次の 3 つのモデル パラメーターが必要です。
removeVars
— データから削除する変数のインデックスを識別する、最大で p
個の要素がある列ベクトル。p
は生データ内の予測子変数の個数
pcaCenters
— 厳密に q
個の PCA の中心から成る行ベクトル
pcaCoefficients
— q
行 r
列の 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
) を使用して、残りの予測子データを変換する
モデルを使用して予測したラベルを返す。
C および C++ は静的な型の言語なので、エントリポイント関数内のすべての変数のプロパティをコンパイル時に決定しなければなりません。coder.typeof
(MATLAB Coder) を使用して可変サイズの引数を指定し、この引数を使用してコードを生成します。
coder.typeof
(MATLAB Coder) を使用して、コード生成用の 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) を返します。predictFcn
、mypredictCL
、および MEX 関数は同じ値を返します。
learnerCoderConfigurer
| loadLearnerForCoder
| saveLearnerForCoder
| codegen
(MATLAB Coder) | coder.typeof
(MATLAB Coder)