ドキュメンテーション

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

fitNaiveBayes

単純ベイズ分類器の学習

fitNaiveBayes は将来のリリースでは削除される予定です。代わりに fitcnb を使用してください。

構文

  • NBModel = fitNaiveBayes(X,Y)
  • NBModel = fitNaiveBayes(X,Y,Name,Value)

説明

NBModel = fitNaiveBayes(X,Y) は単純ベイズ分類器 NBModel を返します。この分類器は、予測子 X とクラス ラベル Y により K レベルの分類についての学習が行われています。

データと NBModelpredict に渡して、新しいデータのラベルを予測します。

NBModel = fitNaiveBayes(X,Y,Name,Value) は、1 つ以上の Name,Value の引数ペアが指定された追加オプションを使用すると、単純ベイズ分類器を返します。

たとえば、クラスの事前確率やカーネル平滑化ウィンドウ帯域幅など、データをモデル化するための分布を指定できます。

すべて折りたたむ

フィッシャーのアヤメのデータセットを読み込みます。

load fisheriris
X = meas(:,3:4);
Y = species;
tabulate(Y)
       Value    Count   Percent
      setosa       50     33.33%
  versicolor       50     33.33%
   virginica       50     33.33%

単純ベイズ メソッドを使用して、3 つ以上のクラスがあるデータを分類することができます。

単純ベイズ分類器を学習させます。

NBModel = fitNaiveBayes(X,Y)
Warning: NaiveBayes will be removed in a future release. Use fitcnb instead. 

NBModel = 

Naive Bayes classifier with 3 classes for 2 dimensions.
Feature Distribution(s):normal
Classes:setosa, versicolor, virginica


NBModel は学習させた NaiveBayes 分類器です。

既定の設定では、いくつかの平均と標準偏差をもつガウス分布を使用して、各クラス内で予測子分布がモデル化されます。ドット表記を使用して特定のガウス近似のパラメーターを表示します。たとえば、setosa 内にある最初の特徴の近似を表示します。

setosaIndex = strcmp(NBModel.ClassLevels,'setosa');
estimates = NBModel.Params{setosaIndex,1}
estimates =

    1.4620
    0.1737

平均値は 1.4620 で、標準偏差は 0.1737 です。

ガウス等高線をプロットします。

figure
gscatter(X(:,1),X(:,2),Y);
h = gca;
xylim = [h.XLim h.YLim];
hold on
Params = cell2mat(NBModel.Params);
Mu = Params(2*(1:3)-1,1:2); % Extracts the means
Sigma = zeros(2,2,3);
for j = 1:3
    Sigma(:,:,j) = diag(Params(2*j,:)); % Extracts the standard deviations
    ezcontour(@(x1,x2)mvnpdf([x1,x2],Mu(j,:),Sigma(:,:,j)),...
        xylim+0.5*[-1,1,-1,1]) ...
        % Draws contours for the multivariate normal distributions
end
title('Naive Bayes Classifier -- Fisher''s Iris Data')
xlabel('Petal Length (cm)')
ylabel('Petal Width (cm)')
hold off

名前と値のペアの引数 'Distribution' を使用すると、既定の分布を変更できます。たとえば、カウントベースの予測子がある場合、'Distribution','mn' を使用して、これらの予測子が多項確率変数となるよう指定することができます。

フィッシャーのアヤメのデータセットを読み込みます。

load fisheriris
X = meas;
Y = species;

すべての予測子を使用して単純ベイズ分類器を学習させます。

NBModel1 = fitNaiveBayes(X,Y);
NBModel1.ClassLevels % Display the class order
NBModel1.Params
NBModel1.Params{1,2}
Warning: NaiveBayes will be removed in a future release. Use fitcnb instead. 

ans = 

    'setosa'
    'versicolor'
    'virginica'


ans = 

    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]
    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]
    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]


ans =

    3.4280
    0.3791

既定の設定では、各クラス内の予測子分布が、いくつかの平均と標準偏差をもつガウス分布としてモデル化されます。予測子は 4 つあり、クラス レベルは 3 つあります。NBModel1.Params の各セルは、各分布の平均と標準偏差が格納された数値ベクトルに対応します。たとえば、setosa のがく片の幅の平均と標準偏差はそれぞれ 3.42800.3791 です。

NBModel1 の混合行列を推定します。

predictLabels1 = predict(NBModel1,X);
[ConfusionMat1,labels] = confusionmat(Y,predictLabels1)
Warning: NaiveBayes will be removed in a future release. Use the predict method
of an object returned by fitcnb instead. 

ConfusionMat1 =

    50     0     0
     0    47     3
     0     3    47


labels = 

    'setosa'
    'versicolor'
    'virginica'

ConfusionMat1 の要素 (j, k) は、k として分類され、データ上ではクラス j として表示される観測値の数を表します。

予測子 1 および 2 (がく片の長さと幅) のガウス分布および予測子 3 と 4 (花弁の長さと幅) の既定の正規カーネル密度を使用して、分類器を再度学習させます。

NBModel2 = fitNaiveBayes(X,Y,...
    'Distribution',{'normal','kernel','normal','kernel'});
NBModel2.Params{1,2}
Warning: NaiveBayes will be removed in a future release. Use fitcnb instead. 

ans = 

  KernelDistribution

    Kernel = normal
    Bandwidth = 0.179536
    Support = unbounded

カーネル密度のパラメーターの学習は実行されません。その代わりに、最適な幅が自動的に選択されます。ただし、'KSWidth' 名前と値のペアの引数を使用して幅を指定することができます。

NBModel2 の混合行列を推定します。

predictLabels2 = predict(NBModel2,X);
ConfusionMat2 = confusionmat(Y,predictLabels2)
Warning: NaiveBayes will be removed in a future release. Use the predict method
of an object returned by fitcnb instead. 

ConfusionMat2 =

    50     0     0
     0    47     3
     0     3    47

混合行列に基づいて、2 つの分類器は学習標本内で同様に動作します。

スパム フィルターによっては、電子メール内の単語や句読点 (トークン) の使用頻度を基準にして、受信した電子メールをスパムとして分類します。予測子は電子メールに含まれる特定の単語または句読点が使用される頻度です。したがって、予測子は多項確率変数を作成します。

この例では、単純ベイズ予測子と多項予測子を使用した分類を説明します。

1,000 件の電子メールを観測し、スパムまたはスパム以外に分類したとします。この処理を行うには、各電子メールに対応する y に -1 または 1 を無作為に割り当てます。

n = 1000;                       % Sample size
rng(1);                         % For reproducibility
y = randsample([-1 1],n,true);  % Random labels

予測子データを構築するため、語彙集に 5 つのトークンが存在し、電子メールごとに 20 のトークンが観測されたと仮定します。多項偏差を抽出して 5 つのトークンから予測子データを生成します。スパム電子メールに対応するトークンの相対的頻度は、スパム以外の電子メールとは異なっていなければなりません。

tokenProbs = [0.2 0.3 0.1 0.15 0.25;...
    0.4 0.1 0.3 0.05 0.15];             % Token relative frequencies
tokensPerEmail = 20;
X = zeros(n,5);
X(y == 1,:) = mnrnd(tokensPerEmail,tokenProbs(1,:),sum(y == 1));
X(y == -1,:) = mnrnd(tokensPerEmail,tokenProbs(2,:),sum(y == -1));

単純ベイズ分類器を学習させます。予測子が多項予測子となるよう指定します。

NBModel = fitNaiveBayes(X,y,'Distribution','mn');
Warning: NaiveBayes will be removed in a future release. Use fitcnb instead. 

NBModel は学習させた NaiveBayes 分類器です。

誤判別率を推定して、NBModel の標本内パフォーマンスを評価します。

predSpam = predict(NBModel,X);
misclass = sum(y'~=predSpam)/n
Warning: NaiveBayes will be removed in a future release. Use the predict method
of an object returned by fitcnb instead. 

misclass =

    0.0200

標本内の誤判別率は 2% です。

電子メールの新しいバッチを表す偏差を無作為に生成します。

nOut = 500;
yOut = randsample([-1 1],nOut,true);
XOut = zeros(nOut,5);
XOut(yOut == 1,:) = mnrnd(tokensPerEmail,tokenProbs(1,:),...
    sum(yOut == 1));
XOut(yOut == -1,:) = mnrnd(tokensPerEmail,tokenProbs(2,:),...
    sum(yOut == -1));

学習させた単純ベイズ分類器 NBModel を使用して新しい電子メールを分類し、アルゴリズムが一般化するかどうかを判別します。

predSpamOut = predict(NBModel,XOut);
genRate = sum(yOut'~=predSpamOut)/nOut
Warning: NaiveBayes will be removed in a future release. Use the predict method
of an object returned by fitcnb instead. 

genRate =

    0.0260

標本外の誤判別率が 2.6% であるため、分類器が良好に一般化されていることを示しています。

入力引数

すべて折りたたむ

単純ベイズ分類器に学習させる予測子データ。数値の行列として指定します。

X の各行は 1 件の観測 (インスタンスや例とも呼ばれます) に対応し、各列は 1 個の変数 (特徴とも呼ばれます) に対応します。

Y の長さと X の行数は等しくなければなりません。

データ型: double

単純ベイズ分類器に学習させるクラス ラベル。カテゴリカル配列または文字配列、論理ベクトルまたは数値ベクトル、または文字列のセル配列として指定します。Y の各要素は、X の対応する行のクラス メンバーシップを定義します。Y は K クラス レベルをサポートします。

Y が文字配列の場合、各行は 1 個のクラス ラベルに対応しなければなりません。

Y の長さと X の行数は等しくなければなりません。

データ型: cell | char | double | logical

    メモ:    NaN、空の文字列 ('') および <undefined> 要素は欠損値として扱われます。

    • Y に欠損値がある場合、その部分と X の対応する行が削除されます。

    • X に全体が欠損値で構成される行がある場合、その行と対応する Y の要素は削除されます。

    • X に欠損値があり、さらに 'Distribution','mn' が設定されている場合、X の対象行と Y の対応する要素は削除されます。

    • 予測子がクラス内に表れない場合、つまり、すべての値がクラス内で NaN の場合、エラーが返されます。

    X の行および Y の対応する要素を削除すると、有効な学習または交差検定の標本サイズが小さくなります。

名前/値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: 'Distribution','mn','Prior','uniform','KSWidth',0.5 により指定されるのは、データ分布が多項式であり、すべてのクラスの事前確率が等しく、すべてのクラスのカーネル平滑化ウィンドウ帯域幅が 0.5 単位であることです。

すべて折りたたむ

fitNaiveBayes がデータのモデル化に使用するデータ分布。'Distribution' と文字列または文字列のセル配列で構成されるコンマ区切りのペアとして指定します。

次の表は、使用できる分布の一覧です。

説明
'kernel'カーネル平滑化密度推定。
'mn'多項分布。mn を指定するとすべての特徴量は多項分布の成分となります。したがって、'mn' を文字列のセル配列の要素として含むことはできません。詳細は、アルゴリズムを参照してください。
'mvmn'多変量多項分布。詳細は、アルゴリズムを参照してください。
'normal'正規 (ガウス) 分布。

文字列を指定すると、この分布を使用してすべての特徴量がモデル化されます。1 行 D 列の文字列のセル配列を指定すると、このセル配列の要素 j の分布を使用して特徴 j がモデル化されます。

例: 'Distribution',{'kernel','normal'}

データ型: cell | char

カーネル平滑化密度のサポート。'KSSupport' と、数値行ベクトル、文字列またはセル配列で構成されるコンマ区切りのペアとして指定します。カーネル平滑化密度がこの領域に適用されます。

'Distribution','kernel' を指定しない場合、'KSSupport''KSType''KSWidth' の値は無視されます。

次の表は、カーネル平滑化密度領域の設定に使用できるオプションの一覧です。

説明
1 行 2 列の数値行ベクトルたとえば、[L,U] のように指定します。LU はそれぞれ、密度サポートの下限と上限を表します。
'positive'密度サポートはすべて正の実数です。
'unbounded'密度サポートはすべて実数です。

各セルにテーブルのいずれかの値が格納されている状態で、1 行 D 列のセル配列を指定する場合、X の特徴 j に対して、セル j のカーネル サポートを使用して分類器の学習が実行されます。

例: 'KSSupport',{[-10,20],'unbounded'}

データ型: cell | char | double

カーネル平滑化のタイプ。'KSType' と文字列または文字列のセル配列で構成されるコンマ区切りのペアとして指定します。

'Distribution','kernel' を指定しない場合、'KSSupport''KSType''KSWidth' の値は無視されます。

次の表は、カーネル平滑化密度領域の設定に使用できるオプションの一覧です。I{u} はインジケーター関数を表します。

カーネル
'box'ボックス (一様)

f(x)=0.5I{|x|1}

'epanechnikov'Epanechnikov

f(x)=0.75(1x2)I{|x|1}

'normal'ガウス

f(x)=12πexp(0.5x2)

'triangle'三角形

f(x)=(1|x|)I{|x|1}

各セルにテーブルのいずれかの値が格納されている状態で、1 行 D 列のセル配列を指定する場合、X の特徴 j に対して、セル j のカーネル平滑化タイプを使用して分類器の学習が実行されます。

例: 'KSType',{'epanechnikov','normal'}

データ型: cell | char

カーネル平滑化ウィンドウ帯域幅。'KSWidth' と、数値の行列、数値行ベクトル、数値列ベクトル、スカラー、構造体配列のいずれかで構成される、コンマ区切りのペアとして指定します。

'Distribution','kernel' を指定しない場合、'KSSupport''KSType''KSWidth' の値は無視されます。

K 個のクラス レベルと D 個の予測子があるとします。次の表は、カーネル平滑化ウィンドウ帯域幅の設定に使用できるオプションの一覧です。

説明
数値の K 行 D 列の行列要素 (k,d) は クラス k の予測子 d の帯域幅を指定します。
K 行 1 列の数値列ベクトル要素 k は クラス k のすべての予測子の帯域幅を指定します。
1 行 D 列の数値行ベクトル要素 d は 予測子 d のすべてのクラス レベルの帯域幅を指定します。
スカラーすべてのクラスのすべての特徴量に帯域幅を指定します。
構造体配列クラス レベルおよびその帯域幅を含む構造体配列 SS には次の 2 つのフィールドがなければなりません。
  • S.width: 帯域幅の数値行ベクトル、または D 個の列がある数値の行列。

  • S.group: Y と同じ型のベクトル。対応する S.width の要素のクラスを表す一意なクラス レベルを格納します。

既定の設定では、ガウス分布に最適な値を使用し、特徴およびクラスの各組み合わせで使用する既定の帯域幅が自動的に選択されます。

例: 'KSWidth',struct('width',[0.5,0.25],'group',{{'b';'g'}})

データ型: double | struct

クラスの事前確率。'Prior' と数値ベクトル、構造体配列、文字列のいずれかで構成されるコンマ区切りのペアとして指定します。

次の表は、事前確率の設定に使用できるオプションの一覧です。

説明
'empirical'事前確率に対しては、クラスの相対的頻度分布が使用されます。
数値ベクトル

各クラスの事前確率を指定する、長さが K の数値ベクトル。Prior の要素の順序は、クラス レベルの順序に相当します。クラスの順序の詳細は、アルゴリズムを参照してください。

事前確率は合計が 1 になるように正規化されます。

構造体配列クラス レベルおよび事前確率が格納された構造体配列 SS には次の 2 つのフィールドがなければなりません。
  • S.prob: 事前確率の数値ベクトル。事前確率は合計が 1 になるように正規化されます。

  • S.group: Y と同じ型のベクトル。対応する S.prob の要素のクラスを表す一意なクラス レベルを格納します。S.class には、Y に含まれている K 個のレベルをすべて格納しなければなりません。Y に現れないクラスも含めることができます。これは、X が大きな学習セットの一部である場合に便利です。S.group にあるクラスはすべて無視されますが、Y のクラスは無視されません。

'uniform'すべてのクラスについて、前の確率は等しくなります。

例: 'Prior',struct('prob',[1,2],'group',{{'b';'g'}})

データ型: char | double | struct

出力引数

すべて折りたたむ

学習させた単純ベイズ分類器。NaiveBayes 分類器として返します。

詳細

すべて折りたたむ

bag-of-tokens モデル

bag-of-tokens モデルでは、予測子 j の値は当該の観測値のトークン j の発生数を表す非負の数値です。この多項モデルのカテゴリ (ビン) の数は、異なるトークンの数、すなわち予測子の数です。

ヒント

  • bag-of-tokens モデルなどのカウントベースを分類するには、多項分布を使用します (たとえば、'Distribution','mn' を設定するなど)。

  • このリストはクラスの順序を定義しています。'Prior',prior (prior は数値ベクトル) を設定して事前確率を指定する場合に便利です。

    • Y がカテゴリカル配列の場合、クラス レベルの順序は categories(Y) の出力と一致します。

    • Y が数値ベクトルまたは論理ベクトルの場合、クラス レベルの順序は sort(unique(Y)) の出力と一致します。

    • 文字列のセル配列または文字配列の場合、クラス ラベルの順序は Y での各ラベルの順序と同じです。

アルゴリズム

  • 'Distribution','mn' を指定すると、各観測は多項分布の複数の試行であり、トークンの発生はそれぞれ 1 回の試行として認識されます (bag-of-tokens モデルを参照してください)。

  • 'Distribution','mvmn' を指定すると、各予測子がクラス内の多項モデルに従っているものと認識されます。予測子のパラメーターには、対応する特徴が取得できるすべての値の確率が含まれます。

R2014a で導入

この情報は役に立ちましたか?