1. ホーム
  2. のらマネージャーのブログ
  3. Naive Bayes Models

Naive Bayes Models

2003年7月 5日 14:37

素朴ベイズ は、一つ以上のpredictor(入力)フィールドによって与えられる証拠から、目標(出力)独立(independence)の値を予\測するために、条件付き独立(independence)の(「素朴な」)仮定と結び付けてベイズの定理を使います。

可能\な値T1,...Tmを持つcategoricalな目標フィールドと、(現在のレコードで)I1*,...In*の値を持つ、predictorフィールドI1,...Inを仮定した上で、predictorsの値を与えると、目標Tが値Tiをもつ確率は、次のように導出される。

P(Ti | I1*,...In*) = P(Ti ) P(I1*,...In* |Ti) / P(I1*,...In*), ベイズ定理によって

~ P(Ti ) ProductjP(Ij* |Ti) / P(I1*,...In*), 条件付き独立の仮定によって

= P(Ti ) ProductjP(Ij* | Ti) / Sumk ( P(Tk) Productj P(Ij*| Tk))

= Li / Sumk Lk, defining likelihood Lk = P(Tk) Productj P(Ij*| Tk)

Li = P(Ti ) Productj P(Ij* | Ti)

= (count[Ti] / Sumk count[Tk]) Productj (count[Ij*Ti] / Sumk count[Tk]) / (count[Ti] / Sumk count[Tk] )

~ count[Ti] Productj(count[Ij* Ti] / count[Ti]), removing factors of Sumkcount[Tk] common to all L

0のカウントは特に注意を要します。調節なしでは、0のカウントが、そのカウントが要因として現われる尤度(likelihood)に関して絶対的否定を与えることになるでしょう。したがって、Bayesモデルは、count[Ij*Ti]が0のとき、P(Ij*| Tk)の代わりに使うために、デフォルトの(たいていは非常に小さな)確率を指定するしきい値パラメータを組み込みます。

第二の適応は、トレーニング・データ中のmissing値に対するもので、条件確率(conditional-probability)項に、分母count[Ti]を含んでいるものです。 P(Ij*| Ti)の分母が和Sumk count[IjkTi]で置き換えれられることによって、正確さは向上します。すなわちアイテムIjの任意の(missingではない)値と目標値のco-occurrencesのカウントの和と置き換えるということだ。

素朴Bayesモデルは、各フィールド(ターゲットもしくはpredictor)が離散化されていることを要求する。そうすることで、そのモデルによって、限られた少数の値だけが考慮される。

和において、素朴Bayesモデルは次のパラメーターおよびカウントを要求します:

・属性しきい値(threshold)は、count[Ij*Ti]が0の時にP(Ij*| Tk)の代わりに使う確率を指定します。

・要素TargetValueCountsは、目標フィールドの各々の値Tiに対してトレーニングデータ中に目標値の出現回数、すなわちcount[Ti]をリストします。

・各predictorフィールドIiと、そのフィールドの各々の離散値Iijに対し、要素PairCountsは、目標フィールドの各々の値Tkに対して、その目標値と共にそのpredictor値の出現数、すなわちcount[IijTk]をリストします。

NaiveBayesModelは本質的にマトリックスの集合を定義します。各入力フィールドに対して、目標値に相対的な入力値の頻度カウント(frequency counts)を含むマトリックスがある。

Target value
t1t2t3...
count[t1]count[t2]count[t3]...
Input1 i11count[i11,t1]count[i11,t2]count[i11,t3]...
i12count[i12,t1]count[i12,t2]count[i12,t3]...
...............
Input2 i21count[i21,t1]count[i21,t2]count[i21,t3]...
i22count[i22,t1]count[i22,t2]count[i22,t3]...
i23count[i23,t1]count[i23,t2]count[i23,t3]...
...............
Input3 ...............

Scoring 手続き

(i12,i23,i31)のような入力ベクトルを仮定すると、クラスt1に対する確率は次のように計算される。

P(t1|i12,i23,i31) = L1 / (L1 + L2 + L3)
但し
L1 = count[t1] * count[i12,t1]/count[t1] * count[i23,t1]/count[t1] * count[i31,t1]/count[t1]
L2 = count[t2] * count[i12,t2]/count[t2] * count[i23,t2]/count[t2] * count[i31,t2]/count[t2]
L3 = count[t3] * count[i12,t3]/count[t3] * count[i23,t3]/count[t2] * count[i31,t3]/count[t3]

scoringのとき、欠損値は単純に無視されます。欠損したpredictorフィールドと関係する条件確率(conditional-probability)の要素は省略されます。例えば、欠損値を持つ入力ベクトル(-,i23,-)を仮定すると、クラスt1の確率は、次のように計算されます。

P(t1|-,i23,-) = L1 / (L1 + L2 + L3)
但し
L1 = count[t1] * count[i23,t1]/count[t1]
L2 = count[t2] * count[i23,t2]/count[t2]
L3 = count[t3] * count[i23,t3]/count[t2]

DTD

<!ELEMENT NaiveBayesModel (Extension*, MiningSchema, ModelStats?,
BayesInputs, BayesOutput, Extension* )>
<!ATTLIST NaiveBayesModel
modelName 		CDATA 			#IMPLIED
threshold 		%REAL-NUMBER; 		#REQUIRED
functionName		%MINING-FUNCTION; 	#REQUIRED
algorithmName 		CDATA 			#IMPLIED
>
<!ELEMENT BayesInputs ( BayesInput+ )>

Bayes入力

各BayesInputには、そのフィールドの離散値と目標フィールドの離散値とを対とするようなカウントも含まれます。連続(continous)フィールドに対する各BayesInputは、どのように連続値が離散的なbinsのようにエンコードされるかをも定義します。( 離散化(Discretization)はDerivedFieldを使用して、実行されます;DerivedFieldに対する離散(Discretize)写像だけがここで呼び出されることができる。)

<!ELEMENT BayesInput ( Extension*, DerivedField?, PairCounts+ ) >
<!ATTLIST BayesInput
fieldName 		CDATA 			#REQUIRED
>

Bayes出力

BayesOutputは、目標フィールドの値に関連したカウントを含んでいます。

<!ELEMENT BayesOutput ( Extension*, TargetValueCounts )>
<!ATTLIST BayesOutput
fieldName 		CDATA 			#REQUIRED
>

ペアカウント(Pair Counts)

PairCountsは、フィールドIiの離散値Iijに対して、目標フィールドの各々の値と値Iijを対にするTargetValueCountsをリストします。

<!ELEMENT PairCounts ( TargetValueCounts )>
<!ATTLIST PairCounts
value 			CDATA 			#REQUIRED
>

目標値カウント(Target Value Counts)

TargetValueCountsは、目標フィールドの各値に関連したカウントをリストします。しかしながら、そのカウントが0であるTargetValueCountは省略することが出来ます。

BayesOutputの中では、TargetValueCountsは、各々の目標値の出現の合計カウントをリストします。

PairCountsの中では、TargetValueCountsは、各々の目標値に対して、その目標値と特定の入力離散値の同時発生(joint occurrences)のカウントをリストします。

<!ELEMENT TargetValueCounts ( TargetValueCount+ )>
<!ELEMENT TargetValueCount EMPTY >
<!ATTLIST TargetValueCount
value 			CDATA 			#REQUIRED
count 			%REAL-NUMBER; 		#REQUIRED
>

モデル例

<?xml version="1.0" ?>
<PMML version="2.0">
<Header copyright="Copyright (c) 2001, DMG.org"/>
<DataDictionary numberOfFields="5">
<DataField name="gender" optype="categorical">
<Value value="female"/>
<Value value= "male"/>
</DataField>
<DataField name="no of claims" optype="categorical">
<Value value= "0"/>
<Value value= "1"/>
<Value value= "2"/>
<Value value=">2"/>
</DataField>
<DataField name="domicile" optype="categorical">
<Value value="suburban"/>
<Value value= "urban"/>
<Value value= "rural"/>
</DataField>
<DataField name="age of car" optype="continuous"/>
<DataField name="amount of claims" optype="categorical">
<Value value= "100"/>
<Value value= "500"/>
<Value value= "1000"/>
<Value value= "5000"/>
<Value value="10000"/>
</DataField>
</DataDictionary>
<NaiveBayesModel
modelName="NaiveBayes Insurance"
functionName="classification"
threshold="0.001">
<MiningSchema>
<MiningField name="gender"/>
<MiningField name="no of claims"/>
<MiningField name="domicile"/>
<MiningField name="age of car"/>
<MiningField name="amount of claims" usageType="predicted"/>
</MiningSchema>
<BayesInputs>
<BayesInput fieldName="gender">
<PairCounts value="male">
<TargetValueCounts>
<TargetValueCount value= "100" count="4273"/>
<TargetValueCount value= "500" count="1321"/>
<TargetValueCount value= "1000" count= "780"/>
<TargetValueCount value= "5000" count= "405"/>
<TargetValueCount value="10000" count= "42"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value="female">
<TargetValueCounts>
<TargetValueCount value= "100" count="4325"/>
<TargetValueCount value= "500" count="1212"/>
<TargetValueCount value= "1000" count= "742"/>
<TargetValueCount value= "5000" count= "292"/>
<TargetValueCount value="10000" count= "48"/>
</TargetValueCounts>
</PairCounts>
</BayesInput>
<BayesInput fieldName="no of claims">
<PairCounts value="0">
<TargetValueCounts>
<TargetValueCount value= "100" count="4698"/>
<TargetValueCount value= "500" count= "623"/>
<TargetValueCount value= "1000" count="1259"/>
<TargetValueCount value= "5000" count= "550"/>
<TargetValueCount value="10000" count= "40"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value="1">
<TargetValueCounts>
<TargetValueCount value= "100" count="3526"/>
<TargetValueCount value= "500" count="1798"/>
<TargetValueCount value= "1000" count= "227"/>
<TargetValueCount value= "5000" count= "152"/>
<TargetValueCount value="10000" count= "40"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value="2">
<TargetValueCounts>
<TargetValueCount value= "100" count="225"/>
<TargetValueCount value= "500" count= "10"/>
<TargetValueCount value= "1000" count= "9"/>
<TargetValueCount value= "5000" count= "0"/>
<TargetValueCount value="10000" count= "10"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value=">2">
<TargetValueCounts>
<TargetValueCount value= "100" count="112"/>
<TargetValueCount value= "500" count= "5"/>
<TargetValueCount value= "1000" count= "1"/>
<TargetValueCount value= "5000" count= "1"/>
<TargetValueCount value="10000" count= "8"/>
</TargetValueCounts>
</PairCounts>
</BayesInput>
<BayesInput fieldName="domicile">
<PairCounts value="suburban">
<TargetValueCounts>
<TargetValueCount value= "100" count="2536"/>
<TargetValueCount value= "500" count= "165"/>
<TargetValueCount value= "1000" count= "516"/>
<TargetValueCount value= "5000" count= "290"/>
<TargetValueCount value="10000" count= "42"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value="urban">
<TargetValueCounts>
<TargetValueCount value= "100" count="1679"/>
<TargetValueCount value= "500" count= "792"/>
<TargetValueCount value= "1000" count= "511"/>
<TargetValueCount value= "5000" count= "259"/>
<TargetValueCount value="10000" count= "30"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value="rural">
<TargetValueCounts>
<TargetValueCount value= "100" count="2512"/>
<TargetValueCount value= "500" count="1013"/>
<TargetValueCount value= "1000" count= "442"/>
<TargetValueCount value= "5000" count= "137"/>
<TargetValueCount value="10000" count= "21"/>
</TargetValueCounts>
</PairCounts>
</BayesInput>
<BayesInput fieldName="age of car">
<DerivedField>
<Discretize field="age of car">
<DiscretizeBin binValue="0">
<Interval closure="closedOpen" leftMargin="0"
rightMargin="1"/>
</DiscretizeBin>
<DiscretizeBin binValue="1">
<Interval closure="closedOpen" leftMargin="1"
rightMargin="5"/>
</DiscretizeBin>
<DiscretizeBin binValue="2">
<Interval closure="closedOpen" leftMargin="5"/>
</DiscretizeBin>
</Discretize>
</DerivedField>
<PairCounts value="0">
<TargetValueCounts>
<TargetValueCount value= "100" count="927"/>
<TargetValueCount value= "500" count="183"/>
<TargetValueCount value= "1000" count="221"/>
<TargetValueCount value= "5000" count= "50"/>
<TargetValueCount value="10000" count= "10"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value="1">
<TargetValueCounts>
<TargetValueCount value= "100" count="830"/>
<TargetValueCount value= "500" count="182"/>
<TargetValueCount value= "1000" count= "51"/>
<TargetValueCount value= "5000" count= "26"/>
<TargetValueCount value="10000" count= "6"/>
</TargetValueCounts>
</PairCounts>
<PairCounts value="2">
<TargetValueCounts>
<TargetValueCount value= "100" count="6251"/>
<TargetValueCount value= "500" count="1901"/>
<TargetValueCount value= "1000" count= "919"/>
<TargetValueCount value= "5000" count= "623"/>
<TargetValueCount value="10000" count= "71"/>
</TargetValueCounts>
</PairCounts>
</BayesInput>
</BayesInputs>
<BayesOutput fieldName="amount of claims">
<TargetValueCounts>
<TargetValueCount value= "100" count="8723"/>
<TargetValueCount value= "500" count="2557"/>
<TargetValueCount value= "1000" count="1530"/>
<TargetValueCount value= "5000" count= "709"/>
<TargetValueCount value="10000" count= "100"/>
</TargetValueCounts>
</BayesOutput>
</NaiveBayesModel>
</PMML>

Scoring手続きの例

入力ベクトル(gender="male", no of claims = "2", domicile= (missing), age of car = "1")を仮定すると、クラス「1000」に対する確率は次のように計算される。

P("1000"| "male", "2", -,"1" ) = L2 / (L0 + L1 + L2 + L3 + L4)
但し
L0 = 8723 * 4273/8723 * 225/8723 * 830/8723
L1 = 2557 * 1321/2557 * 10/2557 * 182/2557
L2 = 1530 * 780/1530 * 9/1530 * 51/1530
L3 = 709 * 405/709 * .001 * 26/709
L4 = 100 * 42/100 * 10/100 * 6/100

トラックバック(0)

コメントする

アイリンクへのお問い合わせ

お問い合わせメールフォームはこちら

2016年12月移転 北海道旭川市神楽1条7丁目4−8 お問合わせはメール・SNSアカウントで mail
  • twitter
  • facebook
  • google
  • noimage
  • noimage
  • noimage