機械学習のベイズ分類


極めて尤度な推定
確率モデルの訓練過程はパラメータ推定である.ベイズ学派は,パラメータは観測されていないランダム変数であり,それ自体にも分布がある可能性があると考えているので,パラメータが1つの先行分布に従うと仮定し,観測されたデータに基づいて後続分布を計算することができる.周波数主義学派は,パラメータは未知であるが客観的に存在する固定値があるため,尤度関数などを最適化することでパラメータを決定できると考えている.極大尤度推定(Maximum Likelihood Estimation)は,確率分布パラメータを推定するための古代データサンプリングの古典的な方法である.
Dcは、訓練セットDにおける第cクラスのサンプルからなる集合を表し、これらのサンプルが独立して同分布であると仮定すると、パラメータθcデータセットDcに対する尤度は、
P(Dc|θc)=∏x∈DcP(x|θc)
確率の低い連乗はアンダーフローを引き起こすため、通常は対数を使用します
LL(Dc|θc)=∑x∈DclogP(x|θc)
このときのパラメータθcの極大尤度推定:argmaxLL(θc) .このパラメータ化法は条件確率推定を比較的簡単にすることができるが,推定結果の正確性は仮定した確率分布形式が潜在的な真のデータ分布に合致するかどうかに大きく依存する.現実的な応用で比較的良い効果を得るには、いくつかの経験知識を利用する必要があります.
素朴ベイズ分類器
素朴ベイズと呼ばれるのは,属性条件独立性仮定を用いたためであり,属性ごとに独立して分類結果に影響を及ぼすと仮定したためである.次の式があります.
P(c|x)=P(c)P(x|c)P(x)=P(c)P(x)∏i=1dP(xi|c)
後続の連乗の点で注意しなければならないのは,従来の確率値が0であると後続の推定に影響するため,出現していない属性確率に対して0ではない小さな値を設定することである.これがLaplacian correctionである.
P(c)=|Dc|+1|D|+N
ラプラス修正は実際に属性値とカテゴリの均一分布を仮定し,学習過程で先行知識を追加的に導入した.
セミ素朴ベイズ分類器
属性条件の独立性の仮定は現実生活ではなかなか得られないので,この条件を緩和して半素朴ベイズ分類器(semi-naive Bayes classifiers)を得ることを試みた.
その基本的な考え方は,一部の属性間の相互依存関係を適切に考慮することである.独立依存推定(One-Dependent Estimator)は、各属性がカテゴリ外で最大1つの他の属性にのみ依存すると仮定する、半素朴ベイズ分類器の一般的なポリシーです.
最も直接的には、スーパーペアレントを生成し、クロス検証などのモデル選択方法によってスーパーペアレント属性を決定することです.これがSPODE(Super-Parent ODE)方法です.TAN(Tree Augumented naive Bayes)は,最大重み付き生成ツリー(maximum weighted spanning tree)アルゴリズムの至る所で属性関係を簡略化する.
ベイズネット
信念網とも呼ばれ,属性間の依存関係を有向無ループ図(Directed Acyclic Graph)で描画し,条件確率テーブル(Conditional Probability Table)を用いて属性の連合確率分布を記述する.
ネットワーク構造が既知である場合、すなわち属性間の依存関係が明確である場合、ベイズネットワーク学習プロセスは比較的簡単であり、ネットワーク構造が分からない場合、「スコア検索」は一般的な方法である.まず、ネットワークとデータの適合度を推定するためのスコア関数を定義し、スコア関数に基づいて最適なネットワークを探します.
一般的な採点関数は、通常、情報論に基づいて、学習問題をデータ圧縮タスクと見なし、学習目標は、トレーニングデータを最短符号化長で記述できるモデルを見つけることであり、これが最小記述長(Minimal Description Length,MDL)準則である.
ベイズネットワークの推定には後験確率を正確に計算する必要があり,これはNPが難しい問題であるため,一般に近似推定を用いてランダムサンプリング方式,ギブスサンプリング(Gibbs sampling)を採用している.実際,ジブスサンプリングはマルコフ鎖であるため,収束が遅い.
EMアルゴリズム
EM(Expectation-Maximization)はパラメータ隠蔽量を推定する利器であり,反復法である.簡単に言えば、EMアルゴリズムは2つのステップを用いて交互に計算し、第1のステップは期待(Eステップ)を計算し、現在推定されているパラメータ値を利用して対数的に類似した期待値を計算する.第2のステップは最大化(Mステップ)であり、Eステップで生成される所望の最大化に値するパラメータ値を探す.次に,新しいパラメータ値をEステップに再利用し,グローバル最適解に収束するまで用いた.
暗黙変数推定問題は勾配降下などの最適化アルゴリズムで解くこともできるが、和を求める項数は暗黙変数の数が指数級で上昇するにつれて勾配計算に迷惑をかける.EMは非勾配最適化法と見なすことができ,実際には作用座標降下(coordinate descent)法が対数尤度下限を最大化する過程を見ることができる.
素朴ベイズ分類器の実現と応用
素朴ベイズは多くの場合かなり良い効果を得ることができ,情報検索分野で特によく用いられる.まず簡単なテキスト分類を行い、まずテキストをベクトルとして表す必要があります.私たちはこの言葉で表現したことがあるかどうか、現れたことがあるかどうかは1で、現れていないかは0です.
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else: print "the word: %s is not in my Vocabulary!" % word
    return returnVec

ベクトルに変換した後、ベイズ式で確率を計算します.また、素朴ベイズは属性が独立しているため、次の式で計算できます.
P(ci|w)=P(w|ci)P(ci)P(w)=P(ci)P(w)P(w0|ci)P(w1|ci)...P(wN|ci)
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones() 
    p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)          #change to log()
    p0Vect = log(p0Num/p0Denom)          #change to log()
    return p0Vect,p1Vect,pAbusive

確率が0の場合(アンダーフロー問題)を避けるために,ここではp 0 Denomとp 1 Denomdの両方を2に設定する.この関数は次から分類できます.
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else: 
        return 0

どのクラスにいる確率が高いとどのクラスに分けられるのか、簡単ではないでしょうか.私たちは今アップグレードします.これを単語が現れるかどうかだけで表すのが語集モデル(set-of-words)と呼ばれ、文中に何度も現れる単語を表すことができず、単語ごとに重みが同じだと考えられます.次に,ワードバッグモデル(bag−of−words model)に改良し,複数回出現したワードを表すことができるようにした.しかし、ドキュメントには意味のない虚語がたくさん統計されています.これらの重みが高くて意味のない語はフィルタリングできますか?もちろんいいですよ.これがいわゆるストップワードテーブルで、現在は良いストップワードテーブルがたくさんあります.語袋モデルの大きな欠陥は,語の位置と論理関係を表すことができないことである.しかし、最も有名な迷惑メールの分類など、一般的な応用には、素朴なベイズ法が効果的になっています.
ここには素朴なベイズ分類で実現されたスパム分類の例があります.完全なコードとテストセットのデータはここからダウンロードしてください.