Main Content

edge

単純ベイズ分類器の分類エッジ

説明

e = edge(Mdl,tbl,ResponseVarName) は、table tbl 内の予測子データと tbl.ResponseVarName 内のクラス ラベルを使用して、単純ベイズ分類器 Mdl分類エッジ (e) を返します。

分類エッジ (e) は、分類マージンの加重平均を表すスカラー値です。

e = edge(Mdl,tbl,Y) は、table tbl 内の予測子データとベクトル Y 内のクラス ラベルを使用して、Mdl の分類エッジを返します。

e = edge(Mdl,X,Y) は、行列 X に含まれている予測子データと Y に含まれているクラス ラベルを使用して、Mdl の分類エッジを返します。

e = edge(___,'Weights',Weights) は、前の構文における入力引数の組み合わせのいずれかを使用して、Weights で指定された観測値の重みを追加して分類エッジを返します。

すべて折りたたむ

単純ベイズ分類器のテスト標本エッジ (分類マージン平均) を推定します。テスト標本エッジは、予測されたクラスに対して推定された事後確率と、事後確率が次に低いクラスの事後確率の間におけるテスト標本の差異の平均です。

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 分類器です。

テスト標本エッジを推定します。

e = edge(Mdl,XTest,YTest)
e = 0.8658

マージン平均は約 0.87 です。この結果は、分類器ラベルの予測子の信頼度が高いことを示します。

単純ベイズ分類器のテスト標本加重エッジ (加重マージン平均) を推定します。テスト標本エッジは、予測されたクラスに対して推定された事後確率と、事後確率が次に低いクラスの事後確率の間におけるテスト標本の差異の平均です。加重標本エッジは、各観測値に重みが割り当てられる際のマージン平均を推定します。

fisheriris データ セットを読み込みます。150 本のアヤメについて 4 つの花弁の測定値が含まれる数値行列 X を作成します。対応するアヤメの種類が含まれる文字ベクトルの cell 配列 Y を作成します。

load fisheriris
X = meas;
Y = species;
rng('default')  % for reproducibility

一部の測定値の品質は、旧式のテクノロジーが測定に使用されたために低いと仮定します。この効果をシミュレートするために、20 個の測定値で構成されるランダムなサブセットにノイズを追加します。

idx = randperm(size(X,1),20);
X(idx,:) = X(idx,:) + 2*randn(20,size(X,2));

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 分類器です。

テスト標本エッジを推定します。

e = edge(Mdl,XTest,YTest)
e = 0.5920

平均マージンは約 0.59 です。

ノイズを含む測定値の影響を減らす方法の 1 つは、他の観測値よりも低く重み付けすることです。品質が高い観測値には、他の観測値の 2 倍の重みを与える重みベクトルを定義します。

n = size(X,1);
weights = ones(size(X,1),1);
weights(idx) = 0.5;
weightsTrain = weights(trainInds);
weightsTest = weights(testInds);

予測子 XTrain、クラス ラベル YTrain、および重み weightsTrain を使用して、単純ベイズ分類器を学習させます。

Mdl_W = fitcnb(XTrain,YTrain,'Weights',weightsTrain,...
    'ClassNames',{'setosa','versicolor','virginica'});

Mdl_W は学習させた ClassificationNaiveBayes 分類器です。

加重スキームを使用して、テスト標本の加重エッジを推定します。

e_W = edge(Mdl_W,XTest,YTest,'Weights',weightsTest)
e_W = 0.6816

加重平均マージンは約 0.69 です。この結果は、平均すると、加重分類器ラベル予測子の信頼度が、ノイズで破損した予測子よりも高いことを示します。

分類器エッジは、分類器マージンの平均を測定します。特徴選択を行う方法の一つとして、複数のモデルからのテスト標本エッジを比較します。この条件のみに基づくと、エッジが最高となる分類器が最善の分類器となります。

ionosphere データ セットを読み込みます。安定させるため、最初の 2 つの予測子を削除します。

load ionosphere
X = X(:,3:end);
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);

次の 2 つの学習データ セットを定義します。

  • fullXTrain にはすべての予測子が含まれます。

  • partXTrain には上位 10 個の最も重要な予測子が含まれます。

fullXTrain = XTrain;
idx = fscmrmr(XTrain,YTrain);
partXTrain = XTrain(:,idx(1:10));

各予測子セットの単純ベイズ分類器に学習させます。

fullMdl = fitcnb(fullXTrain,YTrain);
partMdl = fitcnb(partXTrain,YTrain);

fullMdlpartMdl は、学習済みの ClassificationNaiveBayes 分類器です。

分類器ごとにテスト標本エッジを推定します。

fullEdge = edge(fullMdl,XTest,YTest)
fullEdge = 0.5831
partEdge = edge(partMdl,XTest(:,idx(1:10)),YTest)
partEdge = 0.7593

上位 10 個の最も重要な予測子を使用した分類器のテスト標本エッジの方が大きくなります。

入力引数

すべて折りたたむ

単純ベイズ分類モデル。fitcnb によって返される ClassificationNaiveBayes モデル オブジェクト、または compact によって返される CompactClassificationNaiveBayes モデル オブジェクトとして指定します。

モデルを学習させるために使用する標本データ。テーブルとして指定します。tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。tbl には、Mdl の学習を行うために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。必要に応じて、tbl に応答変数用および観測値の重み用の追加列を含めることができます。

テーブルに格納されている標本データを使用して Mdl の学習を行った場合、edge の入力データもテーブルに格納されていなければなりません。

応答変数の名前。tbl 内の変数の名前で指定します。

ResponseVarName には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、応答変数 ytbl.y として格納されている場合、'y' として指定します。それ以外の場合、tbl の列は y を含めてすべて予測子として扱われます。

Mdl を学習させるために使用した応答変数が tbl に含まれている場合、ResponseVarName を指定する必要はありません。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

予測子データ。数値行列として指定します。

X の各行は 1 つの観測値 ("インスタンス" や "例" とも呼ばれます) に対応し、各列は 1 つの変数 ("特徴" とも呼ばれます) に対応します。X の列内の変数は、分類器 Mdl に学習させた変数と同じでなければなりません。

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

データ型: double | single

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトルのいずれか、あるいは文字ベクトルの cell 配列として指定します。Y のデータ型は Mdl.ClassNames と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

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

データ型: categorical | char | string | logical | single | double | cell

観測値の重み。数値ベクトルまたは tbl 内の変数の名前を指定します。X または tbl の各行に含まれている観測値には、Weights の対応する重みが適用されます。

数値ベクトルで Weights を指定する場合、Weights のサイズは X または tbl の行数と等しくなければなりません。

Weights として tbl 内の変数名を指定する場合、名前は文字ベクトルまたは string スカラーでなければなりません。たとえば、重みが tbl.w として格納されている場合、Weights として 'w' を指定します。それ以外の場合、tbl の列は tbl.w を含めてすべて予測子として扱われます。

データ型: double | char | string

詳細

すべて折りたたむ

分類エッジ

"分類エッジ" は、分類マージンの加重平均です。

重みを指定すると、この重みは正規化され、各クラスの事前確率の合計になります。正規化された重みを使用して、加重平均が計算されます。

複数の分類器を選択して特徴選択などのタスクを実行する場合は、最も高いエッジが得られる分類器を選択します。

分類マージン

各観測値の "分類マージン" は、真のクラスのスコアと偽のクラスの最大スコアの差です。マージンは分類の信頼尺度となります。つまり、複数の分類器がある場合、(同じスケールで) より大きいマージンが得られる分類器の方が優れています。

事後確率

"事後確率" はデータが与えられる場合に、観測値が特定のクラスに属している確率です。

単純ベイズの場合、与えられた観測値 (x1,...,xP) の分類が k になる事後確率は次のようになります。

P^(Y=k|x1,..,xP)=P(X1,...,XP|y=k)π(Y=k)P(X1,...,XP),

ここで

  • P(X1,...,XP|y=k) は、予測子がクラス k に含まれる場合の条件付き同時密度です。予測子の分布名は Mdl.DistributionNames に格納します。

  • π(Y = k) はクラスの事前確率の分布です。Mdl.Prior は事前分布を保存します。

  • P(X1,..,XP) は予測子の同時密度です。各クラスは離散的なので、次のようになります。P(X1,...,XP)=k=1KP(X1,...,XP|y=k)π(Y=k).

事前確率

クラスの "事前確率" は、母集団内でそのクラスの観測値が出現すると考えられる相対頻度です。

分類スコア

単純ベイズの "スコア" は観測が与えられる場合のクラスの事後確率です。

拡張機能

バージョン履歴

R2014b で導入