Main Content

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

table の数値データを分類するためのコードの生成

この例では、二分決定木を使用して table の数値データを分類するためのコードを生成する方法を示します。

一般的なコード生成のワークフローでは、数値予測子変数のみを使用するという条件で、table のデータを分類モデルまたは回帰モデルに学習させることができます。予測のためのエントリポイント関数を作成するときに、(table ではなく) 数値行列を predict に渡すようにします。

R2020a 以降は、エントリポイント関数内で table を predict に渡すことができます。コード生成における table のサポートの詳細については、table のコード生成 (MATLAB Coder)およびコード生成における table の制限事項 (MATLAB Coder)を参照してください。

分類モデルの学習

patients データセットを読み込みます。single 型および double 型の数値予測子と logical 型の応答変数 Smoker を格納する table を作成します。table の各行は、異なる患者に対応しています。

load patients
Age = single(Age);
Weight = single(Weight);
Tbl = table(Age,Diastolic,Smoker,Systolic,Weight);

Tbl のデータを使用して分類木に学習させます。予測子の名前と順序に注意してください。

Mdl = fitctree(Tbl,'Smoker');
Mdl.PredictorNames
ans = 1×4 cell
    {'Age'}    {'Diastolic'}    {'Systolic'}    {'Weight'}

モデルの保存

saveLearnerForCoder を使用して、ツリーの分類器をファイルに保存します。

saveLearnerForCoder(Mdl,'TreeModel');

saveLearnerForCoder は、現在のフォルダーの TreeModel.mat という MATLAB® バイナリ ファイルに構造体配列として分類器を保存します。

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

数値予測子変数を入力引数として受け入れるエントリポイント関数 predictSmoker を定義します。この関数では、loadLearnerForCoder を使用してツリーの分類器を読み込み、入力引数から table を作成した後、分類器および table を predict に渡します。

type predictSmoker.mlx
function [labels,scores] = predictSmoker(age,diastolic,systolic,weight) %#codegen
%PREDICTSMOKER Label new observations using a trained tree model
%   predictSmoker predicts whether patients are smokers (1) or nonsmokers
%   (0) based on their age, diastolic blood pressure, systolic blood
%   pressure, and weight. The function also provides classification scores
%   indicating the likelihood that a predicted label comes from a
%   particular class (smoker or nonsmoker).
mdl = loadLearnerForCoder('TreeModel');
varnames = mdl.PredictorNames;
tbl = table(age,diastolic,systolic,weight,'VariableNames',varnames);
[labels,scores] = predict(mdl,tbl);
end

エントリポイント関数内に table を作成する場合、変数名を指定しなければなりません (table の名前と値のペアの引数 'VariableNames' を使用するなど)。table に予測子変数のみが含まれていて、予測子の順序がモデルの学習に使用した table と同じである場合、予測子変数の名前を mdl.PredictorNames で見つけることができます。

メモ: このページの右上にあるボタンをクリックしてこの例を MATLAB で開くと、MATLAB で例のフォルダーが開きます。このフォルダーには、エントリポイント関数のファイル predictSmoker.mlx が含まれています。

コードの生成

codegen を使用して predictSmoker のコードを生成します。coder.typeof を使用して、予測子変数の入力引数のデータ型と次元を指定します。

  • coder.typeof の最初の入力引数は、予測子のデータ型を指定します。

  • 2 番目の入力引数は、予測子の行数の上限 (Inf) および列数の上限 (1) を指定します。

  • 3 番目の入力引数は、実行時に予測子の行数を変更できるが、列数は固定であることを指定します。

ARGS = cell(4,1);
ARGS{1} = coder.typeof(Age,[Inf 1],[1 0]);
ARGS{2} = coder.typeof(Diastolic,[Inf 1],[1 0]);
ARGS{3} = coder.typeof(Systolic,[Inf 1],[1 0]);
ARGS{4} = coder.typeof(Weight,[Inf 1],[1 0]);

codegen predictSmoker -args ARGS

codegen は、プラットフォームに依存する拡張子の MEX 関数 predictSmoker_mex を現在のフォルダーに生成します。

生成されたコードの確認

predictpredictSmoker および MEX ファイルが 20 人の患者の無作為標本に対して同じ結果を返すことを確認します。

rng('default') % For reproducibility
[newTbl,idx] = datasample(Tbl,20);

[labels1,scores1] = predict(Mdl,newTbl);
[labels2,scores2] = predictSmoker(Age(idx),Diastolic(idx),Systolic(idx),Weight(idx));
[labels3,scores3] = predictSmoker_mex(Age(idx),Diastolic(idx),Systolic(idx),Weight(idx));

verifyMEXlabels = isequal(labels1,labels2,labels3)
verifyMEXlabels = logical
   1

verifyMEXscores = isequal(scores1,scores2,scores3)
verifyMEXscores = logical
   1

参考

| | (MATLAB Coder) | (MATLAB Coder)

関連するトピック