predict
単純ベイズ分類器の使用による観測値の分類
説明
例
単純ベイズ分類器のテスト標本観測値のラベル付け
fisheriris
データ セットを読み込みます。150 本のアヤメについて 4 つの花弁の測定値が含まれる数値行列 X
を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y
を作成します。
load fisheriris X = meas; Y = species; rng('default') % for reproducibility
Y
のクラス情報を使用して、観測値を階層的に学習セットとテスト セットに無作為に分割します。テスト用の 30% のホールドアウト標本を指定します。
cv = cvpartition(Y,'HoldOut',0.30);
学習インデックスとテスト インデックスを抽出します。
trainInds = training(cv); testInds = test(cv);
学習データ セットとテスト データ セットを指定します。
XTrain = X(trainInds,:); YTrain = Y(trainInds); XTest = X(testInds,:); YTest = Y(testInds);
予測子 XTrain
とクラス ラベル YTrain
を使用して、単純ベイズ分類器に学習させます。クラス名を指定することが推奨されます。fitcnb
は、各予測子が条件付き正規分布に従うと仮定しています。
Mdl = fitcnb(XTrain,YTrain,'ClassNames',{'setosa','versicolor','virginica'})
Mdl = ClassificationNaiveBayes ResponseName: 'Y' CategoricalPredictors: [] ClassNames: {'setosa' 'versicolor' 'virginica'} ScoreTransform: 'none' NumObservations: 105 DistributionNames: {'normal' 'normal' 'normal' 'normal'} DistributionParameters: {3x4 cell}
Mdl
は学習させた ClassificationNaiveBayes
分類器です。
テスト標本のラベルを予測します。
idx = randsample(sum(testInds),10); label = predict(Mdl,XTest);
テスト標本にある 10 件の観測値の無作為なセットについて結果を表示します。
table(YTest(idx),label(idx),'VariableNames',... {'TrueLabel','PredictedLabel'})
ans=10×2 table
TrueLabel PredictedLabel
______________ ______________
{'virginica' } {'virginica' }
{'versicolor'} {'versicolor'}
{'versicolor'} {'versicolor'}
{'virginica' } {'virginica' }
{'setosa' } {'setosa' }
{'virginica' } {'virginica' }
{'setosa' } {'setosa' }
{'versicolor'} {'versicolor'}
{'versicolor'} {'virginica' }
{'versicolor'} {'versicolor'}
真のラベル YTest
と予測ラベル label
から混同チャートを作成します。
cm = confusionchart(YTest,label);
事後確率と誤分類コストの推定
単純ベイズ分類器を使用して、新しい観測値の事後確率と誤分類コストを推定します。メモリ効率の高い事前学習済みの分類器を使用して、新しい観測値を分類します。
fisheriris
データ セットを読み込みます。150 本のアヤメについて 4 つの花弁の測定値が含まれる数値行列 X
を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y
を作成します。
load fisheriris X = meas; Y = species; rng('default') % for reproducibility
データ セットを 2 つのセットに分割します。1 つは学習セットを含め、もう 1 つは新しい未観測のデータを含めます。新しいデータ セットの 10 件の観測値を保持します。
n = size(X,1); newInds = randsample(n,10); inds = ~ismember(1:n,newInds); XNew = X(newInds,:); YNew = Y(newInds);
予測子 X
とクラス ラベル Y
を使用して、単純ベイズ分類器に学習させます。クラス名を指定することが推奨されます。fitcnb
は、各予測子が条件付き正規分布に従うと仮定しています。
Mdl = fitcnb(X(inds,:),Y(inds),... 'ClassNames',{'setosa','versicolor','virginica'});
Mdl
は学習させた ClassificationNaiveBayes
分類器です。
学習させた単純ベイズ分類器のサイズを減らし、メモリの消費量を抑えます。
CMdl = compact(Mdl); whos('Mdl','CMdl')
Name Size Bytes Class Attributes CMdl 1x1 5575 classreg.learning.classif.CompactClassificationNaiveBayes Mdl 1x1 12900 ClassificationNaiveBayes
CMdl
は CompactClassificationNaiveBayes
分類器です。Mdl
はデータを格納しているため、Mdl
よりメモリ使用量が少なくなります。
ドット表記を使用して、CMdl
のクラス名を表示します。
CMdl.ClassNames
ans = 3x1 cell
{'setosa' }
{'versicolor'}
{'virginica' }
ラベルを予測します。事後確率と予測クラスの誤分類コストを推定します。
[labels,PostProbs,MisClassCost] = predict(CMdl,XNew);
真のラベルを予測ラベルと比較します。
table(YNew,labels,PostProbs,MisClassCost,'VariableNames',... {'TrueLabels','PredictedLabels',... 'PosteriorProbabilities','MisclassificationCosts'})
ans=10×4 table
TrueLabels PredictedLabels PosteriorProbabilities MisclassificationCosts
______________ _______________ _________________________________________ ______________________________________
{'virginica' } {'virginica' } 4.0832e-268 4.6422e-09 1 1 1 4.6422e-09
{'setosa' } {'setosa' } 1 3.0706e-18 4.6719e-25 3.0706e-18 1 1
{'virginica' } {'virginica' } 1.0007e-246 5.8758e-10 1 1 1 5.8758e-10
{'versicolor'} {'versicolor'} 1.2022e-61 0.99995 4.9859e-05 1 4.9859e-05 0.99995
{'virginica' } {'virginica' } 2.687e-226 1.7905e-08 1 1 1 1.7905e-08
{'versicolor'} {'versicolor'} 3.3431e-76 0.99971 0.00028983 1 0.00028983 0.99971
{'virginica' } {'virginica' } 4.05e-166 0.0028527 0.99715 1 0.99715 0.0028527
{'setosa' } {'setosa' } 1 1.1272e-14 2.0308e-23 1.1272e-14 1 1
{'virginica' } {'virginica' } 1.3292e-228 8.3604e-10 1 1 1 8.3604e-10
{'setosa' } {'setosa' } 1 4.5023e-17 2.1724e-24 4.5023e-17 1 1
PostProbs
と MisClassCost
は 10
行 3
列の数値行列で、各行は新しい観測値に、各列はクラスに対応します。列の順序は CMdl.ClassNames
の順序に対応します。
単純ベイズ分類器の事後確率領域のプロット
fisheriris
データ セットを読み込みます。150 本のアヤメについての花弁の長さと幅の測定値が含まれる数値行列 X
を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y
を作成します。
load fisheriris
X = meas(:,3:4);
Y = species;
予測子 X
とクラス ラベル Y
を使用して、単純ベイズ分類器に学習させます。クラス名を指定することが推奨されます。fitcnb
は、各予測子が条件付き正規分布に従うと仮定しています。
Mdl = fitcnb(X,Y,'ClassNames',{'setosa','versicolor','virginica'});
Mdl
は学習させた ClassificationNaiveBayes
分類器です。
観測された予測子領域の値のグリッドを定義します。
xMax = max(X); xMin = min(X); h = 0.01; [x1Grid,x2Grid] = meshgrid(xMin(1):h:xMax(1),xMin(2):h:xMax(2));
グリッド内の各インスタンスの事後確率を予測します。
[~,PosteriorRegion] = predict(Mdl,[x1Grid(:),x2Grid(:)]);
事後確率領域と学習データをプロットします。
h = scatter(x1Grid(:),x2Grid(:),1,PosteriorRegion); h.MarkerEdgeAlpha = 0.3;
データをプロットする。
hold on gh = gscatter(X(:,1),X(:,2),Y,'k','dx*'); title 'Iris Petal Measurements and Posterior Probabilities'; xlabel 'Petal length (cm)'; ylabel 'Petal width (cm)'; axis tight legend(gh,'Location','Best') hold off
入力引数
Mdl
— 単純ベイズ分類モデル
ClassificationNaiveBayes
モデル オブジェクト | CompactClassificationNaiveBayes
モデル オブジェクト
単純ベイズ分類モデル。fitcnb
によって返される ClassificationNaiveBayes
モデル オブジェクト、または compact
によって返される CompactClassificationNaiveBayes
モデル オブジェクトとして指定します。
X
— 分類対象の予測子データ
数値行列 | テーブル
分類対象の予測子データ。数値行列またはテーブルを指定します。
X
の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。
数値行列の場合
X
の列を構成する変数の順序は、Mdl
に学習させた予測子変数の順序と同じでなければなりません。テーブル (たとえば
Tbl
) を使用してMdl
に学習させる場合、Tbl
に含まれている予測子変数が数値変数のみであれば、X
を数値行列にすることができます。学習時にTbl
内の数値予測子をカテゴリカルとして扱うには、fitcnb
の名前と値のペアの引数'CategoricalPredictors'
を使用してカテゴリカル予測子を同定します。Tbl
に種類の異なる予測子変数 (数値および categorical データ型など) が混在し、X
が数値行列である場合、predict
でエラーがスローされます。
テーブルの場合
predict
は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。テーブル (たとえば
Tbl
) を使用してMdl
に学習をさせた場合、X
内のすべての予測子変数は変数名およびデータ型が、Mdl
に学習させた (Mdl.PredictorNames
に格納されている) 変数と同じでなければなりません。ただし、X
の列の順序がTbl
の列の順序に対応する必要はありません。Tbl
とX
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。数値行列を使用して
Mdl
に学習をさせる場合、Mdl.PredictorNames
内の予測子名とX
内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定するには、fitcnb
の名前と値のペアの引数 'PredictorNames
' を使用します。X
内の予測子変数はすべて数値ベクトルでなければなりません。X
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。
データ型: table
| double
| single
メモ:
Mdl.DistributionNames
が'mn'
の場合、少なくとも 1 つのNaN
を含むX
の行に対応するNaN
が返されます。Mdl.DistributionNames
が'mn'
以外の場合、誤分類コストと事後確率を推定するときにNaN
の値は無視されます。特に、欠損する予測子値に対応する要因を除外することで、クラスの与えられた予測子の条件付き密度が計算されます。予測子の分布として
'mvmn'
を指定した場合、X
に含まれるレベルが学習データに示されていない (つまり、その予測子に対するMdl.CategoricalLevels
にない) と、指定クラスに対する予測子の条件付き密度は 0 になります。このような観測値の場合、対応するPosterior
の値としてNaN
が返されます。Mdl.Prior
に格納されたクラス事前確率を使用して、観測のクラス ラベルが決定されます。
出力引数
label
— 予測クラス ラベル
categorical ベクトル | 文字配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
予測クラス ラベル。categorical ベクトル、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として返されます。
予測クラス ラベルは以下をもちます。
観測されたクラス ラベル (
Mdl.Y
) と同じデータ型 (string 配列は文字ベクトルの cell 配列として扱われます)。Mdl.X
の行数と等しい長さ。予測誤分類コスト (
Cost
) が最低になるクラス。
Posterior
— クラスの事後確率
数値行列
クラスの事後確率。数値行列として返されます。Posterior
は、Mdl.X
の行数に等しい行と、学習データ (size(Mdl.ClassNames,1)
) の個々のクラスの数に等しい列をもちます。
Posterior(j,k)
は、Mdl.X
の行 j
の観測が与えられたクラス k
(クラス Mdl.ClassNames(k)
内) の予測事後確率です。
Cost
— 予測誤分類コスト
数値行列
予測誤分類コスト。数値行列として返されます。Cost
は、Mdl.X
の行数に等しい行と、学習データ (size(Mdl.ClassNames,1)
) の個々のクラスの数に等しい列をもちます。
Cost(j,k)
はクラス k
(クラス Mdl.ClassNames(k)
内) で予測される Mdl.X
の行 j
の観測値の予測誤分類コストです。
詳細
誤分類コスト
"誤分類コスト" は、観測を誤ったクラスにラベル付けする分類器の相対的な重大度です。
誤分類コストには、真と予測の 2 種類があります。K をクラスの数と仮定します。
"真の誤分類コスト" — K 行 K 列の行列で、要素 (i,j) は、真のクラスが i である場合に観測値をクラス j に分類するコストを示します。誤分類コストはプロパティ
Mdl.Cost
に格納され、計算に使用されます。既定の設定では、i
≠j
の場合にMdl.Cost(i,j)
= 1 で、i
=j
の場合Mdl.Cost(i,j)
= 0 です。つまり、正しい分類のコストは0
で、誤った分類では1
です。"予測誤分類コスト" — K 次元のベクトルで、要素 k は、観測値をクラス k に分類するクラス事後確率で重み付けされた加重平均コストです。
つまり、観測値は予測誤分類コストが最も低いクラスに分類されます。
事後確率
"事後確率" はデータが与えられる場合に、観測値が特定のクラスに属している確率です。
単純ベイズの場合、与えられた観測値 (x1,...,xP) の分類が k になる事後確率は次のようになります。
ここで
は、予測子がクラス k に含まれる場合の条件付き同時密度です。予測子の分布名は
Mdl.DistributionNames
に格納します。π(Y = k) はクラスの事前確率の分布です。
Mdl.Prior
は事前分布を保存します。は予測子の同時密度です。各クラスは離散的なので、次のようになります。
事前確率
クラスの "事前確率" は、母集団内でそのクラスの観測値が出現すると考えられる相対頻度です。
代替機能
Simulink ブロック
Simulink® に単純ベイズ分類モデルの予測を統合するには、Statistics and Machine Learning Toolbox™ ライブラリにある ClassificationNaiveBayes Predict ブロックを使用するか、MATLAB® Function ブロックを関数 predict
と共に使用します。例については、Predict Class Labels Using ClassificationNaiveBayes Predict BlockとMATLAB Function ブロックの使用によるクラス ラベルの予測を参照してください。
使用するアプローチを判断する際は、以下を考慮してください。
Statistics and Machine Learning Toolbox ライブラリ ブロックを使用する場合、固定小数点ツール (Fixed-Point Designer)を使用して浮動小数点モデルを固定小数点に変換できます。
MATLAB Function ブロックを関数
predict
と共に使用する場合は、可変サイズの配列に対するサポートを有効にしなければなりません。MATLAB Function ブロックを使用する場合、予測の前処理や後処理のために、同じ MATLAB Function ブロック内で MATLAB 関数を使用することができます。
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
この関数は、tall 配列を完全にサポートします。この関数でインメモリ データまたは tall データに対して学習を行ったモデルを使用できます。
詳細は、tall 配列を参照してください。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
saveLearnerForCoder
、loadLearnerForCoder
およびcodegen
(MATLAB Coder) を使用して、関数predict
のコードを生成します。saveLearnerForCoder
を使用して、学習済みモデルを保存します。loadLearnerForCoder
を使用して保存済みモデルを読み込んで関数predict
を呼び出す、エントリポイント関数を定義します。次に、codegen
を使用して、エントリポイント関数のコードを生成します。predict
用の単精度 C/C++ コードを生成するには、関数loadLearnerForCoder
を呼び出すときに名前と値の引数"DataType","single"
を指定します。次の表は、
predict
の引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 Mdl
モデル オブジェクトの使用上の注意および制限については、
CompactClassificationNaiveBayes
オブジェクトのコード生成を参照してください。X
X
は、単精度または倍精度の行列か、数値変数、カテゴリカル変数、またはその両方を含むテーブルでなければなりません。X
の行数、または観測値の数は可変サイズにすることができますが、X
の列数は固定でなければなりません。X
を table として指定する場合、モデルは table を使用して学習させたものでなければならず、かつ予測のためのエントリポイント関数で次を行う必要があります。データを配列として受け入れる。
データ入力の引数から table を作成し、その table 内で変数名を指定する。
table を
predict
に渡す。
このテーブルのワークフローの例については、table のデータを分類するためのコードの生成を参照してください。コード生成におけるテーブルの使用の詳細については、table のコード生成 (MATLAB Coder)およびコード生成における table の制限事項 (MATLAB Coder)を参照してください。
詳細は、コード生成の紹介を参照してください。
バージョン履歴
R2014b で導入
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)