ベイズの探索 - 多項式/ベルヌーイ/補数単純ベイズ

目次

1. 多項単純ベイズとそのバリエーション

1.1 多項単純ベイズ MultinomialNB

2. ベルヌーイ単純ベイズ ベルヌーイNB

3. 補完ナイーブベイズ

4. ベイジアンの探索: ベイジアン サンプルの不均衡問題


1. 多項単純ベイズとそのバリエーション

1.1 多項単純ベイズ MultinomialNB

class sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None)

        多項ベイズも元のベイジアン理論に基づいていますが、確率分布が単純な多項分布に従うことを前提としています。多項分布は、統計学における多項実験に由来します。これは、次のように具体的に説明できます。実験には n 回の実験が含まれており、各実験には異なる結果が考えられます。どの試行においても、特定の結果が発生する確率は一定です。
        たとえば、特徴行列がコインを投げた結果を表す場合、表が出る確率は P(X=Front|Y) = 0.5、裏が出る確率は P(X=Negative|Y) = 0.5 です。 、これら 2 つの 2 つの可能性のみ、および 2 つの結果が互いに干渉しない場合、2 つのランダムなイベントの確率の合計は 1 になり、これが二項分布です。この場合、多項単純ベイズに適した特徴行列は次のようになります。

試験番号 X1: 頭が出てくる X2: しっぽが出る
0 0 1
1 1 0
2 1 0
3 0 1

別の特徴行列がサイコロを振った結果を表すと仮定すると、私[1,2,3,4,5,6] の値を取ることができ、6 つの結果は互いに干渉せず、サンプル サイズがが十分に大きい場合、確率は 1/6 であり、これは多項分布です。多項分布の特性行列は次のようになります。

試験番号 現れる 1 現れる 2 現れる 3 4が表示されます 5が表示されます 6が表示されます
0 1 0 0 0 0 0
1 0 0 0 0 0 1
2 0 0 1 0 0 0
……
メートル 0 0 0 0 0 1

多項分布はカテゴリ変数に適していることがわかります.その主な仮定では、P(X_{i}|Y)確率の確率は離散的であり、異なるX_{i}条件はP(X_{i}|Y)互いに独立しており、互いに影響しません. sklearn の多項分布は連続変数も扱うことができますが、実際には、本当に連続変数を扱いたい場合は、Gaussian Naive Bayes を使用する必要があります。多項式実験の実験結果は非常に具体的であり, 含まれる機能は多くの場合, 時間, 頻度, カウント, および発生などの概念です. これらの概念はすべて離散的な正の整数です. したがって, sklearn の多項式単純ベイズは受け入れられませ.

        このような特性により、多項単純ベイズの特徴行列は疎であることが多く (必ずしも常に疎であるとは限りません)、テキスト分類によく使用されます。よく知られている TF-IDF ベクトル手法を使用することも、ベイジアンで一般的で単純な単語数ベクトル アプローチを使用することもできます。これらの方法は両方とも一般的なテキスト特徴抽出方法であり、sklearn を介して簡単に実装できます。

        数学的な観点から、ラベル カテゴリ Y=c の下には、特徴量に対応するパラメーター ベクトルのセットがあります\theta_{c}=(\theta_{c1},\theta_{c2},....,\theta_{cn})。ここで、n は特徴量の総数を表します。\theta_{ci}このラベル category の下の th 機能私に対応するパラメーターこのパラメータは、次のように定義されています。

として示されP(X_{i}|Y=c)、条件 Y=c が固定されている場合、 X_{i}サンプルのセットがこの特徴の値で取得される確率を意味します。ラベル カテゴリの下に (m, n) の構造を持つ特徴行列には、次のようなものがあります。

X_{y}=\begin{bmatrix} x_{11} & x_{12}& x_{13}& ...& x_{1n}\\x_{21} & x_{22}& x_{23}& ...& x_{2n}\\ x_{31} & x_{32}& x_{33}& ...& x_{3n}\\ & & ...& & \\ x_{m1} & x_ {m2}& x_{m3}& ...& x_{mn}\\ end{bmatrix}

これらはそれぞれx_{の}特徴でありX_{i}、これらの理解に基づいて、パラメーターは平滑化された最尤推定によって解決されますθy

\アルファ平滑化係数として知られている値を\アルファ>0 にして、トレーニング データに出現した一部の単語がテスト セットに出現しない確率が 0 になるのを防ぎ、パラメーター θ が 0 になる状況を回避します。=1の場合\アルファ、この平滑化はラプラス平滑化と呼ばれ、\アルファ<1 はリドストーン平滑化と呼ばれます。どちらの種類の平滑化も、分類されたデータを平滑化するために自然言語処理で一般的に使用される統計的手法です。

sklearn では、多項単純ベイズを実行するために使用されるクラス MultinomialNB には、次のパラメーターと属性が含まれています。

パラメータ

alpha : 浮動小数点数、ラプラスまたはリードストーン スムージングのオプション(デフォルトでは 1.0) パラメーター\アルファ。0 に設定すると、スムージング オプションがまったくないことを意味します。\アルファただし、平滑化は確率に人為的に何らかのノイズを加えることと同等であるため、設定が大きいほど多項式 Naive Bayes の精度が低下することに注意してください(影響はそれほど大きくありません)。
fit_prior : ブール値、オプション (デフォルトは True)
事前確率 P(Y=c) を学習するかどうか。false に設定すると、すべてのサンプル クラス出力のクラス事前確率が同じになります。つまり、各ラベル クラスが出現する確率は です\frac{1}{n.classes}
class_prior: 配列のような構造、構造は (n_classes, ) で、空白のままにすることができます (デフォルトは None)
クラスの事前確率 P(Y=c)。特定の事前確率が指定されていない場合は、データに基づいて自動的に計算されます

 通常、多項単純ベイズをインスタンス化するときは、すべてのパラメーターをデフォルトのままにします。最初に多項式 Naive Bayes の簡単な例を作成してみましょう。

from sklearn.preprocessing import MinMaxScaler
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_blobs
from sklearn.metrics import brier_score_loss
class_1=500
class_2=500 #两个类别分别设定500个样本
centers=[[0.0,0.0],[2.0,2.0]] #设定两个类别的中心
clusters_std=[0.5,0.5] #设定两个类别的方差
x,y=make_blobs(n_samples=[class_1,class_2],
              centers=centers,
              cluster_std=clusters_std,
              random_state=0,shuffle=False)
xtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.3,random_state=420)
# 归一化,确保输入的矩阵不带有负数
mms=MinMaxScaler().fit(xtrain)
xtrain_=mms.transform(xtrain)
xtest_=mms.transform(xtest)
# 建立多项式朴素贝叶斯分类器
mnb=MultinomialNB().fit(xtrain_,ytrain)
(ytrain==1).sum()/ytrain.shape[0] #计数:所有标签类别=1的样本量
0.49857142857142855
(ytrain==0).sum()/ytrain.shape[0] #计数:所有标签类别=1的样本量
0.5014285714285714
mnb.score(xtest_,ytest)
0.5433333333333333
brier_score_loss(ytest,mnb.predict_proba(xtest_)[:,0],pos_label=0)
0.24977828412546035

Brill スコアが高く、精度が低い場合、xtrain を型データに変換します。

from sklearn.preprocessing import KBinsDiscretizer #对连续型变量分箱
kbs=KBinsDiscretizer(n_bins=10,encode='onehot').fit(xtrain)
xtrain_=kbs.transform(xtrain)
xtest_=kbs.transform(xtest)
# 建立多项式朴素贝叶斯分类器
mnb=MultinomialNB().fit(xtrain_,ytrain)
mnb.score(xtest_,ytest)
0.9966666666666667
brier_score_loss(ytest,mnb.predict_proba(xtest_)[:,0],pos_label=0)
0.001459393277821188

多項単純ベイズの基本的な操作とコードは比較的単純であることがわかります。同じデータをダミー変数でビニングすると、多項式ベイジアンの効果が飛躍的に向上します。

2. ベルヌーイ単純ベイズ ベルヌーイNB

クラス sklearn .naive_bayes.BernoulliNB (アルファ = 1.0、バイナリ化 = 0.0、fit_prior = True、class_prior = なし)

        多項ナイーブベイズは、二項分布(コイントス)と多項分布(サイコロ投げ)を同時に扱うことができますが、このうち二項分布はベルヌーイ分布とも呼ばれ、現実にはよくある、優れた数学的性質が数多く分布しています。したがって、多項の単純ベイズが存在するため、2 項分布の単純ベイズ、つまりベルヌーイ単純ベイズを扱うのが自然です。
        ベルヌーイ ベイズ クラス ベルヌーイNB は、データが多変量ベルヌーイ分布に従うと仮定し、これに基づいて単純ベイズのトレーニングおよび分類プロセスを適用します。簡単に言えば、多変量ベルヌーイ分布とは、データ セットに複数の特徴が存在する可能性があることを意味しますが、各特徴は 2 つのカテゴリに分類され、ブール変数 {0, 1} または {-1, 1} で表すことができます。 2 つのカテゴリの任意の組み合わせについても同様です。したがって、このクラスでは、サンプルをバイナリの特徴ベクトルに変換する必要があります. データ自体がバイナリでない場合は、バイナリ化専用のクラスでパラメーター binarize を使用してデータを変更できます.
        ベルヌーイ単純ベイズは多項単純ベイズに非常に似ており、どちらもテキスト分類データによく使用されます。しかし、ベルヌーイ単純ベイズは二項分布を扱うため、「何回出現するか」の数や頻度よりも「存在するかしないか」に注目し、そこがベルヌーイ・ベイズと多項ベイズとの根本的な違いです。テキスト分類の場合、Bernoulli Naive Bayes は単語カウント ベクトルの代わりに単語出現ベクトルを使用して分類器をトレーニングできます。Bernoulli Naive Bayes は、ドキュメントが短いデータセットでうまく機能します。

ベルヌーイ単純ベイズ

alpha : 浮動小数点数、ラプラスまたはリードストーン スムージングのオプション(デフォルトでは 1.0) パラメーター\アルファ。0 に設定すると、スムージング オプションがまったくないことを意味します。ただし、平滑化は人為的に確率に何らかのノイズを追加することと同じであるため、\アルファ設定が大きいほどベルヌーイ ナイーブ ベイズの精度が低下し (影響はそれほど大きくありません)、Brill スコアも徐々に上昇します。 .
binarize : 浮動小数点数または None、空白のままにすることができます。デフォルトは 0 で
、特徴のしきい値を 2 値化します。None に設定すると、特徴が 2 値化されていると見なされます
fit_prior : ブール値、オプション (デフォルトは True)
事前確率 P(Y=c) を学習するかどうか。false に設定すると、事前確率は使用されませんが、一様事前確率 (一様事前確率) が使用されます。つまり、各ラベル クラスの確率は、\frac{1}{n.classes}
class_prior: 配列のような構造で、構造は (n_classes, ) で、オプション (デフォルトは None) で、
クラスの事前確率 P(Y=c) です。特定の事前確率が指定されていない場合は、データに基づいて自動的に計算されます。

 sklearn では、Bernoulli Naive Bayes の実装も非常に単純です。

from sklearn.naive_bayes import BernoulliNB
# 普通来说应使用二值化的类sklearn.preprocessing.Binarizer来将特征二值化
# 然而这样效率过低,因此没选择归一化之后直接设置一个阈值
mms=MinMaxScaler().fit(xtrain)
xtrain_=mms.transform(xtrain)
xtest_=mms.transform(xtest)
# 不设置二值化
bnl_=BernoulliNB().fit(xtrain_,ytrain)
bnl_.score(xtest_,ytest)
0.49666666666666665
brier_score_loss(ytest,bnl_.predict_proba(xtest_)[:,1],pos_label=1)
0.25000009482193225
# 设置阈值为0.5
bnl_=BernoulliNB(binarize=0.5).fit(xtrain_,ytrain)
bnl_.score(xtest_,ytest)
0.98333333333333
brier_score_loss(ytest,bnl_.predict_proba(xtest_)[:,1],pos_label=1)
0.010405875827339534

多項ベイズと同様に、ベルヌーイ ベイズの結果はデー​​タの構造に大きく影響されます。したがって、ベイジアンモデルを選択する上で、データの見た目に合わせてベイジアンを選択することは非常に重要なポイントです。

3. 補完ナイーブベイズ

Complementary Naive Bayes は Multinomial Naive Bayes を改良したもので、含まれるパラメーターも Multinomial Naive Bayes と非常によく似ています。

4. ベイジアンの探索: ベイジアン サンプルの不均衡問題

from sklearn.naive_bayes import MultinomialNB,GaussianNB,BernoulliNB
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_blobs
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.metrics import brier_score_loss as BS,recall_score,roc_auc_score as AUC
class_1=50000 #多数类为50000个样本
class_2=500 #少数类为500个样本
centers=[[0.0,0.0],[5.0,5.0]]
clusters_std=[3,1] #设定两个类别的方差
x,y=make_blobs(n_samples=[class_1,class_2],
               centers=centers,
               cluster_std=clusters_std,
               random_state=0,shuffle=False
              )
from sklearn.naive_bayes import ComplementNB
from time import time
import datetime
name=["Multinomial","GaussianNB","Bernoulli","Complement"]
models=[MultinomialNB(),GaussianNB(),BernoulliNB(),ComplementNB()]
for name,clf in zip(name,models):
    times=time()
    xtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.3,random_state=420)
    #预处理
    if name!="GaussianNB":
        kbs=KBinsDiscretizer(n_bins=10,encode='onehot').fit(xtrain)
        xtrain=kbs.transform(xtrain)
        xtest=kbs.transform(xtest)
        
    clf.fit(xtrain,ytrain)
    y_pred=clf.predict(xtest)
    proba=clf.predict_proba(xtest)[:,1]
    score=clf.score(xtest,ytest)
    print(name)
    print("\tBrier:{:.3f}".format(BS(ytest,proba,pos_label=1)))
    print("\tAccuracy:{:.3f}".format(score))
    print("\tRecall:{:.3f}".format(recall_score(ytest,y_pred)))
    print("\tAUC:{:.3f}".format(AUC(ytest,proba)))
    print(datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f"))
    
多項式
	Brier:0.007
	精度:0.990 
	Recall:0.000 
	AUC:0.991 
00:00:040009 
GaussianNB 
	Brier:0.006 
	Accuracy:0.990 
	Recall:0.438 
	AUC:0.993 
00:00:023005 
Bernoulli 
	Brier: 
	0.009 Accuracy: 
	0.987 Recall 
	: 
0.8 :00:035008
補体
	ブライアー:0.038
	精度:0.953
	リコール:0.987 
	AUC:0.991 
00:00:033008

補完的なナイーブ ベイジアンは、全体的な精度とブリル インデックスの一部を犠牲にしていますが、非常に高いリコール レートを取得し、マイノリティ クラスの 98.7% をキャプチャし、元の多項式ナイーブ ベイズの一貫した AUC スコアと同じ基準を維持していることがわかります。 . 他のベイジアン アルゴリズムと比較して、補足のナイーブ ベイジアンも非常に高速です。私たちの目標がマイノリティ クラスをキャプチャすることである場合、アルゴリズムとして Complementary Naive Bayes を選択することは間違いありません。

 
 

おすすめ

転載: blog.csdn.net/weixin_60200880/article/details/129307096