predict
構文
説明
例
ニューラル ネットワークを使用したテスト セットの観測値の分類
ニューラル ネットワーク分類器を使用してテスト セットの観測値のラベルを予測します。
patients
データセットを読み込みます。データ セットから table を作成します。各行が 1 人の患者に対応し、各列が診断の変数に対応します。変数 Smoker
を応答変数として使用し、残りの変数を予測子として使用します。
load patients
tbl = table(Diastolic,Systolic,Gender,Height,Weight,Age,Smoker);
層化ホールドアウト分割を使用して、データを学習セット tblTrain
とテスト セット tblTest
に分割します。観測値の約 30% がテスト データ セット用に予約され、残りの観測値が学習データ セットに使用されます。
rng("default") % For reproducibility of the partition c = cvpartition(tbl.Smoker,"Holdout",0.30); trainingIndices = training(c); testIndices = test(c); tblTrain = tbl(trainingIndices,:); tblTest = tbl(testIndices,:);
学習セットを使用してニューラル ネットワーク分類器に学習させます。tblTrain
の列 Smoker
を応答変数として指定します。数値予測子を標準化するための指定を行います。
Mdl = fitcnet(tblTrain,"Smoker", ... "Standardize",true);
テスト セットの観測値を分類します。混同行列を使用して結果を可視化します。
label = predict(Mdl,tblTest); confusionchart(tblTest.Smoker,label)
ニューラル ネットワーク モデルでテスト セットの観測値が 2 つを除いて正しく分類されています。
ニューラル ネットワーク分類器に含める特徴量の選択
テスト セットの分類マージン、エッジ、誤差、予測を比較することにより、特徴選択を実行します。すべての予測子を使用して学習させたモデルのテスト セット メトリクスを予測子のサブセットのみを使用して学習させたモデルのテスト セット メトリクスと比較します。
標本ファイル fisheriris.csv
を読み込みます。これには、アヤメについてのがく片の長さ、がく片の幅、花弁の長さ、花弁の幅、種の種類などのデータが格納されています。ファイルを table に読み込みます。
fishertable = readtable('fisheriris.csv');
層化ホールドアウト分割を使用して、データを学習セット trainTbl
とテスト セット testTbl
に分割します。観測値の約 30% がテスト データ セット用に予約され、残りの観測値が学習データ セットに使用されます。
rng("default") c = cvpartition(fishertable.Species,"Holdout",0.3); trainTbl = fishertable(training(c),:); testTbl = fishertable(test(c),:);
学習セット内のすべての予測子を使用して 1 つのニューラル ネットワーク分類器に学習させ、PetalWidth
を除くすべての予測子を使用してもう 1 つの分類器に学習させます。両方のモデルについて、Species
を応答変数として指定し、予測子を標準化します。
allMdl = fitcnet(trainTbl,"Species","Standardize",true); subsetMdl = fitcnet(trainTbl,"Species ~ SepalLength + SepalWidth + PetalLength", ... "Standardize",true);
2 つのモデルのテスト セットの分類マージンを計算します。テスト セットに含まれる観測値は 45 個だけであるため、棒グラフを使用してマージンを表示します。
各観測値の分類マージンは、真のクラスの分類スコアと偽のクラスの最大スコアの差を表します。ニューラル ネットワーク分類器から返される分類スコアは事後確率であるため、マージンの値が 1 に近いほど信頼度が高い分類であることを示し、負のマージンの値は誤分類を示します。
tiledlayout(2,1) % Top axes ax1 = nexttile; allMargins = margin(allMdl,testTbl); bar(ax1,allMargins) xlabel(ax1,"Observation") ylabel(ax1,"Margin") title(ax1,"All Predictors") % Bottom axes ax2 = nexttile; subsetMargins = margin(subsetMdl,testTbl); bar(ax2,subsetMargins) xlabel(ax2,"Observation") ylabel(ax2,"Margin") title(ax2,"Subset of Predictors")
2 つのモデルのテスト セットの分類エッジ (分類マージンの平均) を比較します。
allEdge = edge(allMdl,testTbl)
allEdge = 0.8198
subsetEdge = edge(subsetMdl,testTbl)
subsetEdge = 0.9556
テスト セットの分類マージンと分類エッジからは、予測子のサブセットで学習させたモデルの方がすべての予測子で学習させたモデルよりも性能が優れていると考えられます。
2 つのモデルのテスト セットの分類誤差を比較します。
allError = loss(allMdl,testTbl); allAccuracy = 1-allError
allAccuracy = 0.9111
subsetError = loss(subsetMdl,testTbl); subsetAccuracy = 1-subsetError
subsetAccuracy = 0.9778
この場合も、予測子のサブセットのみを使用して学習させたモデルの方がすべての予測子を使用して学習させたモデルよりも性能が優れていることがわかります。
混同行列を使用してテスト セットの分類結果を可視化します。
allLabels = predict(allMdl,testTbl);
figure
confusionchart(testTbl.Species,allLabels)
title("All Predictors")
subsetLabels = predict(subsetMdl,testTbl);
figure
confusionchart(testTbl.Species,subsetLabels)
title("Subset of Predictors")
すべての予測子を使用して学習させたモデルには、テスト セットの観測値の誤分類が 4 件あります。予測子のサブセットを使用して学習させたモデルでは、テスト セットの観測値の誤分類は 1 件だけです。
2 つのモデルのテスト セットの性能から、PetalWidth
を除くすべての予測子を使用して学習させたモデルを使用することを検討します。
ニューラル ネットワーク分類器の層の構造を使用した予測
単一の観測値のラベルと分類スコアを予測するためにニューラル ネットワーク分類器の層がどのように連携するかを調べます。
標本ファイル fisheriris.csv
を読み込みます。これには、アヤメについてのがく片の長さ、がく片の幅、花弁の長さ、花弁の幅、種の種類などのデータが格納されています。ファイルを table に読み込みます。
fishertable = readtable('fisheriris.csv');
データ セットを使用してニューラル ネットワーク分類器に学習させます。fishertable
の列 Species
を応答変数として指定します。
Mdl = fitcnet(fishertable,"Species");
データ セットから 15 番目の観測値を選択します。ニューラル ネットワーク分類器の層が観測値をどのように扱い、予測クラス ラベル newPointLabel
と分類スコア newPointScores
をどのように返すかを調べます。
newPoint = Mdl.X{15,:}
newPoint = 1×4
5.8000 4.0000 1.2000 0.2000
firstFCStep = (Mdl.LayerWeights{1})*newPoint' + Mdl.LayerBiases{1}; reluStep = max(firstFCStep,0); finalFCStep = (Mdl.LayerWeights{end})*reluStep + Mdl.LayerBiases{end}; finalSoftmaxStep = softmax(finalFCStep); [~,classIdx] = max(finalSoftmaxStep); newPointLabel = Mdl.ClassNames{classIdx}
newPointLabel = 'setosa'
newPointScores = finalSoftmaxStep'
newPointScores = 1×3
1.0000 0.0000 0.0000
オブジェクト関数 predict
で返される予測と一致することを確認します。
[predictedLabel,predictedScores] = predict(Mdl,newPoint)
predictedLabel = 1x1 cell array
{'setosa'}
predictedScores = 1×3
1.0000 0.0000 0.0000
入力引数
Mdl
— 学習させたニューラル ネットワーク分類器
ClassificationNeuralNetwork
モデル オブジェクト | CompactClassificationNeuralNetwork
モデル オブジェクト
学習させたニューラル ネットワーク分類器。fitcnet
によって返される ClassificationNeuralNetwork
モデル オブジェクト、または compact
によって返される CompactClassificationNeuralNetwork
モデル オブジェクトとして指定します。
X
— 分類対象の予測子データ
数値行列 | テーブル
分類対象の予測子データ。数値行列またはテーブルを指定します。
既定では、X
の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。
数値行列の場合
X
の列に含まれている変数の順序は、Mdl
に学習させた予測子変数の順序と同じでなければなりません。テーブル (たとえば
Tbl
) を使用してMdl
に学習をさせる場合、Tbl
に含まれている予測子変数が数値のみであれば、X
を数値行列にすることができます。学習時にTbl
内の数値予測子をカテゴリカルとして扱うには、fitcnet
の名前と値の引数CategoricalPredictors
を使用してカテゴリカル予測子を指定します。Tbl
に種類の異なる予測子変数 (数値および categorical データ型など) が混在し、X
が数値行列である場合、predict
でエラーがスローされます。
テーブルの場合
predict
は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。テーブル (たとえば
Tbl
) を使用してMdl
に学習をさせた場合、X
内のすべての予測子変数は変数名およびデータ型が、Mdl
に学習させた (Mdl.PredictorNames
に格納されている) 変数と同じでなければなりません。ただし、X
の列の順序がTbl
の列の順序に対応する必要はありません。また、Tbl
とX
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。数値行列を使用して
Mdl
に学習をさせる場合、Mdl.PredictorNames
内の予測子名とX
内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定するには、fitcnet
の名前と値の引数PredictorNames
を使用します。X
内の予測子変数はすべて数値ベクトルでなければなりません。X
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。
Mdl
に学習させるときに fitcnet
で 'Standardize',true
を設定した場合、予測子データの数値列が対応する平均および標準偏差を使用して標準化されます。
メモ
観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns'
を指定すると、計算時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns'
を指定することはできません。
データ型: single
| double
| table
dimension
— 予測子データにおける観測値の次元
'rows'
(既定値) | 'columns'
予測子データにおける観測値の次元。'rows'
または 'columns'
として指定します。
メモ
観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns'
を指定すると、計算時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns'
を指定することはできません。
データ型: char
| string
出力引数
label
— 予測クラス ラベル
数値ベクトル | categorical ベクトル | logical ベクトル | 文字配列 | string 配列 | 文字ベクトルの cell 配列
詳細
分類スコア
ニューラル ネットワーク分類器の "分類スコア" は、ネットワークの最終全結合層に続くソフトマックス活性化関数を使用して計算されます。スコアは事後確率に対応します。
観測値 x がクラス k に属する事後確率は次のとおりです。
ここで
P(x|k) は、x がクラス k に属する条件付き確率です。
P(k) は、クラス k の事前確率です。
K は、応答変数内のクラスの数です。
ak(x) は、観測値 x に対する最終全結合層からの k の出力です。
代替機能
Simulink ブロック
Simulink® にニューラル ネットワーク分類モデルの予測を統合するには、Statistics and Machine Learning Toolbox™ ライブラリにある ClassificationNeuralNetwork Predict ブロックを使用するか、MATLAB® Function ブロックを関数 predict
と共に使用します。例については、ClassificationNeuralNetwork Predict ブロックの使用によるクラス ラベルの予測とMATLAB Function ブロックの使用によるクラス ラベルの予測を参照してください。
使用するアプローチを判断する際は、以下を考慮してください。
Statistics and Machine Learning Toolbox ライブラリ ブロックを使用する場合、固定小数点ツール (Fixed-Point Designer)を使用して浮動小数点モデルを固定小数点に変換できます。
MATLAB Function ブロックを関数
predict
と共に使用する場合は、可変サイズの配列に対するサポートを有効にしなければなりません。MATLAB Function ブロックを使用する場合、予測の前処理や後処理のために、同じ MATLAB Function ブロック内で MATLAB 関数を使用することができます。
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
saveLearnerForCoder
、loadLearnerForCoder
およびcodegen
(MATLAB Coder) を使用して、関数predict
のコードを生成します。saveLearnerForCoder
を使用して、学習済みモデルを保存します。loadLearnerForCoder
を使用して保存済みモデルを読み込んで関数predict
を呼び出す、エントリポイント関数を定義します。次に、codegen
を使用して、エントリポイント関数のコードを生成します。predict
用の単精度 C/C++ コードを生成するには、関数loadLearnerForCoder
を呼び出すときに名前と値の引数"DataType","single"
を指定します。次の表は、
predict
の引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 Mdl
モデル オブジェクトの使用上の注意および制限については、
CompactClassificationNeuralNetwork
オブジェクトのコード生成を参照してください。X
X
は、単精度または倍精度の行列か、数値変数、カテゴリカル変数、またはその両方を含むテーブルでなければなりません。X
の行数、または観測値の数は可変サイズにすることができますが、X
の列数は固定でなければなりません。X
を table として指定する場合、モデルは table を使用して学習させたものでなければならず、かつ予測のためのエントリポイント関数で次を行う必要があります。データを配列として受け入れる。
データ入力の引数から table を作成し、その table 内で変数名を指定する。
table を
predict
に渡す。
このテーブルのワークフローの例については、table のデータを分類するためのコードの生成を参照してください。コード生成におけるテーブルの使用の詳細については、table のコード生成 (MATLAB Coder)およびコード生成における table の制限事項 (MATLAB Coder)を参照してください。
ObservationsIn
名前と値の引数
ObservationsIn
のdimension
の値は、コンパイル時の定数でなければなりません。たとえば、生成されたコードで"ObservationsIn","columns"
を使用するには、{coder.Constant("ObservationsIn"),coder.Constant("columns")}
をcodegen
(MATLAB Coder) の-args
の値に含めます。
詳細は、コード生成の紹介を参照してください。
バージョン履歴
R2021a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)