Naive Bayes Models

素朴ベイズ は、一つ以上の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