Main Content

分類学習器で学習させたバイナリ GLM ロジスティック回帰モデルのコード生成

この例では、分類学習器を使用してバイナリ GLM ロジスティック回帰モデルに学習させ、エクスポートされた分類モデルを使用してラベルを予測する C コードを生成する方法を示します。

標本データの読み込み

標本データを読み込み、データを分類学習器アプリにインポートします。

patients データ セットを読み込みます。p 個の予測子で構成される予測子データ X と応答変数 Y を指定します。

load patients
X = [Age Diastolic Height Systolic Weight];
p = size(X,2);
Y = Gender;

[アプリ] タブで、[アプリ] セクションの右にある [さらに表示] 矢印をクリックしてギャラリーを表示し、[分類学習器] を選択します。[分類学習器] タブの [ファイル] セクションで、[新規セッション]、[ワークスペースから] を選択します。

[ワークスペースからの新規セッション] ダイアログ ボックスの [データ セット変数] で、ワークスペース変数のリストから X 選択します。[応答][ワークスペースから] オプション ボタンをクリックし、リストから Y を選択します。既定の検証方式をそのまま使用して続行するため、[セッションの開始] をクリックします。既定の検証オプションは 5 分割交差検証であるため、過適合が防止されます。

分類学習器の既定の設定では、データの散布図が作成されます。

バイナリ GLM ロジスティック回帰モデルの学習

分類学習器アプリを使用してバイナリ GLM ロジスティック回帰モデルに学習させます。

[分類学習器] タブの [モデル] セクションで [さらに表示] 矢印をクリックして分類器のギャラリーを表示します。[ロジスティック回帰分類器][バイナリ GLM ロジスティック回帰] をクリックします。[学習] セクションで、[すべてを学習] をクリックして [選択を学習] を選択します。モデルの学習が行われ、交差検証精度 [精度 (検証)][モデル] ペインに表示されます。

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

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

[分類学習器] タブで、[エクスポート] をクリックして [モデルのエクスポート] をクリックし、[モデルのエクスポート] を選択します。ダイアログ ボックスで、trainedLogisticRegressionModel をモデル名として指定し、[OK] をクリックします。

構造体 trainedLogisticRegressionModel が MATLAB ワークスペースに表示されます。trainedLogisticRegressionModelGeneralizedLinearModel フィールドに必要なモデルが含まれています。

メモ: この例をすべてのサポート ファイルを含めて実行する場合は、モデルをエクスポートする代わりに、コマンド ラインで trainedLogisticRegressionModel.mat ファイルを読み込むことができます。trainedLogisticRegressionModel 構造体は前の手順を使用して作成されたものです。

load('trainedLogisticRegressionModel.mat')

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

saveLearnerForCoder(trainedLogisticRegressionModel.GeneralizedLinearModel,'myModel')

さらに、学習させたモデルの成功、失敗、および欠落したクラスの名前を保存します。

classNames = {trainedLogisticRegressionModel.SuccessClass, ...
    trainedLogisticRegressionModel.FailureClass,trainedLogisticRegressionModel.MissingClass};
save('ModelParameters.mat','classNames');

予測用の C コードの生成

予測のためのエントリポイント関数を定義し、codegen を使用して関数のコードを生成します。

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

  • ロジスティック回帰モデルの学習に使用したものと同じ予測子変数が含まれている観測値の数値行列 (X) を受け入れる

  • myModel.mat 内の分類モデルを読み込む

  • モデルを使用して予測確率を計算する

  • 予測確率をインデックスに変換する (成功は 1、失敗は 2、欠損値は 3)

  • ModelParameters.mat 内のクラス名を読み込む

  • クラス名にインデックスを付けることで予測ラベルを返す

function label = classifyX (X) %#codegen 
%CLASSIFYX Classify using Logistic Regression Model 
%  CLASSIFYX classifies the measurements in X 
%  using the logistic regression model in the file myModel.mat, 
%  and then returns class labels in label.

n = size(X,1);
label = coder.nullcopy(cell(n,1));

Mdl = loadLearnerForCoder('myModel');
probability = predict(Mdl,X);

index = ~isnan(probability).*((probability<0.5)+1) + isnan(probability)*3;

classInfo = coder.load('ModelParameters');
classNames = classInfo.classNames;

for i = 1:n    
    label{i} = classNames{index(i)};
end
end

メモ: 特徴選択や主成分分析 (PCA) の使用後に分類学習器でロジスティック回帰モデルを作成する場合は、エントリポイント関数のコードに追加の行を含めなければなりません。それらの追加の手順の例については、コード生成と分類学習器アプリを参照してください。

classifyX.m から MEX 関数を生成します。coder.typeof を使用して、コード生成用の行列 data を作成します。data の行数が任意であり data の列数が p であることを指定します。p はロジスティック回帰モデルの学習に使用した予測子の数です。-args オプションを使用して、data を引数として指定します。

data = coder.typeof(X,[Inf p],[1 0]);
codegen classifyX.m -args data
Code generation successful.

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

予期されるラベルを MEX 関数が返すことを確認します。X から 15 個の観測値を無作為に抽出します。

rng('default') % For reproducibility
testX = datasample(X,15);

分類学習器で学習させた分類モデルで関数 predictFcn を使用して観測値を分類します。

testLabels = trainedLogisticRegressionModel.predictFcn(testX);

生成された MEX 関数 classifyX_mex を使用して観測値を分類します。

testLabelsMEX = classifyX_mex(testX);

予測子のセットを比較します。testLabelstestLabelsMEX が等しい場合、isequal は logical 1 (true) を返します。

isequal(testLabels,testLabelsMEX)
ans = logical
   1

predictFcn と MEX 関数 classifyX_mex で同じ値が返されています。

参考

| | (MATLAB Coder) | (MATLAB Coder) | |

関連するトピック