Trees

PMMLの中の(決定)木モデル、分類または予測の構造を定義することを考慮に入れます。各ノードは、ノードあるいは分岐するノードのいずれかを選ぶために規則を定義する論理的な述語表現を保持します。


<!ELEMENT TreeModel (Extension*, MiningSchema, ModelStats?, 
		Node, Extension*)>

<!ATTLIST TreeModel
	modelName 		CDATA 				#IMPLIED
	functionName 		%MINING-FUNCTION; 		#REQUIRED
	algorithmName 		CDATA 				#IMPLIED
	splitCharacteristic 	(binarySplit | multiSplit) 	"multiSplit"
>

定義:

TreeModel:決定木モデル用の定義を始めます。

Node(ノード):この要素は、決定木モデルに分岐(split)や葉(leaf)を定義するためのカプセル化です。すべてのノードは、それ自体あるいはその枝のいずれかを選ぶために規則を識別する述語を含んでいます。述語は他の入れ子(nested)の述語から構\成された表\現かもしれません。

modelName:TreeModel要素中のmodelNameの中の値はモデルを識別する、PMMLファイルの文脈中の一意な名前です。MMLモデルの一般的な構\造を参照。

splitCharacteristic:決定木モデルが1ノード当たりちょうど2つの子、あるいは1ノード当たり多数のchildrensを持っているかどうか示します。多数の場合には、それが、各ノードが2つ以上の子ノードを持っているかもしれないことを意味します。


ノードは次のものから成ります:


<!ENTITY % PREDICATE "( SimplePredicate | CompoundPredicate 
			SimpleSetPredicate | True | False ) " >

<!ELEMENT Node ( Extension*, (%PREDICATE;), ScoreDistribution*, Node* )>
<!ATTLIST Node
	score 		CDATA 			#REQUIRED
	recordCount 	%NUMBER; 		#IMPLIED
>

定義:

score:ノードのスコアの値はそのノードを選択するレコードの予\測値として役立ちます。

recordCount:ノード中のrecordCountの値は、ScoreDistribution要素中のrecordCount値のベースサイズとして使われます。これらの数は、モデルを構\築/学習するために使用されたレコードの数を必ずしも決定するわけではない。しかしながら、それらは、親ノードと比較された時のノードの相対的なサイズと同様に、スコア分配での与えられた値の相対的なサイズも決定することを可能\にします。


述語

各ノードは1つの%PREDICATE;を持っています;それは、SimplePredicate、述語の集合、CompoundPredicate、True、あるいはFalse を持ちうる。


<!ELEMENT SimplePredicate EMPTY>
<!ATTLIST SimplePredicate
	field 		%FIELD-NAME; 			#REQUIRED
	operator 	(equal | notEqual |
			lessThan | lessOrEqual |
			greaterThan | greaterOrEqual) 	#REQUIRED 
	value 		CDATA 				#REQUIRED
>

サブノード中の述語は左から右に評価されます。アプリケーションアルゴリズムは、述語が真である第一のノードを選択します。典型的に、rightmostなノードは述語<True/>をちょうど含んでいます。

定義:

SimplePredicate:この要素は単純な、boolean表\記の形のルールを定義することからなり、そのルールは、フィールド、二値比較演算子(booleanOperator)、値からなる。

field:SimplePredicate要素のこの属性はMiningSchemaのminingField要素のうちの1つの名前エントリーです。

operator:SimplePredicateのこの属性は6つのあらかじめ定義された比較オペレーターのうちの一つです。

Operator Math Symbol
equal =
notEqual !=
lessThan <
lessOrEqual <=
greaterThan >
greaterOrEqual>=
value - SimplePredicate要素のこの属性は評価/比較するための情報です。

数学上、規則は「フィールドbooleanOperator値」として表\現されます。すなわち、フィールドは左のオペランドで、値は右のオペランドです。次のサンプルは「年齢 < 30」との等価物を表\わします。


<SimplePredicate field="age" operator="lessThan" 
			value="30" >

<SimplePredicate value="30" operator="lessThan" 
			field="age" >

<SimplePredicate operator="lessThan" value="30" 
			field="age" >


合成述語


<!ELEMENT CompoundPredicate ( %PREDICATE; , (%PREDICATE;)+ >
<!ATTLIST CompoundPredicate
	booleanOperator 	(or|and|xor|surrogate) 		#REQUIRED >

定義:

CompoundPredicate:エンティティ%PREDICATE;で定義されるような2つ以上の要素を組み合わせるためのカプセル化要素(encapsulating element)。booleanOperatorであるこの要素に関連した属性は、以下の論理的な(ブール)オペレーターのうちの1つをとることができます:and、or、xor、surrogate。

booleanOperator:オペレーターand、or、xor、は、通常の意味で、関連する二値オペレーターです。評価の順序は1つの合成述語内におけるどの述語にも無関係です。表\現「surrogate(a,b)」は「もしaが知らないという事ではないならばa、そうでなければb(\'if not unknown(a) then a else b\')」と等価です。

オペレーター「and」は、すべての述語が真であるなら、真である。

オペレーター「or」は、述語のうちどれか一つが真なら、真である。

オペレーター「xor」は2つ命題(arguments)の時のみ使用されます。それぞれの述語が、異なる値(1つが真で1つが偽)を持つ場合でも、それは、真になります。

オペレーター「surrogate」は代理述語(surrogate predicates)を考慮に入れます。それらは、欠損値が、代替述語(alternative predicate)が利用可能\なような親述語の評価に現れる場面で利用されます。

単集合述語


<!ELEMENT SimpleSetPredicate ( %ARRAY; ) >
<!ATTLIST SimpleSetPredicate
	field 			%FIELD-NAME; 	#REQUIRED
	booleanOperator 	(isIn|isNotIn) 	#REQUIRED 
>

定義:

SimpleSetPredicate:フィールド値が集合の要素かどうかチェックします。値の集合は配列によって指定されます。booleanOperatorであるこの要素に関連した属性は、次のブールのオペレーターのうちの1つをとることができます:isIn、isNotIn。

値の集合は内容の中で配列によって指定されます。booleanOperatorであるこの要素に関連した属性は、次のブールのオペレーターのうちの1つをとることができます:isIn、isNotIn。

オペレーターisInは、フィールド値が配列中の値のリストに含まれているなら、真を示します。

オペレーターisNotInは、フィールド値が配列中の値のリストに含まれていないなら、真を示します。


<!ELEMENT True EMPTY>

定義:

True:ブール定数(boolean constant)TRUEを識別する述語要素。


<!ELEMENT False EMPTY>

定義:

False:ブール定数(boolean constant)FALSEを識別する述語要素。


サブ述語(Sub-predicates)(合成述語の枝(siblings))は、ともにグループ化され、共に評価されるべきである。例えば、

( (temperature > 60) and (temperature < 100) and (outlook(景色)=overcast(くもり)) )


<CompoundPredicate booleanOperator="and" >
	<SimplePredicate field="temperature" operator="greaterThan" 
				value="60" />
	<SimplePredicate field="temperature" operator="lessThan" 
				value="100" />
	<SimplePredicate field="outlook" operator="equal" 
				value="overcast"/>
</CompoundPredicate>

合成述語の枝が合成述語である場合、合成述語のそれぞれが共に評価される。例えば、 ( ( (temperature < 90) and (temperature > 50) ) or (humidity(湿度) >=80) )


<CompoundPredicate booleanOperator="or" >
	<CompoundPredicate booleanOperator="and" >
		<SimplePredicate field="temperature" operator="lessThan"
				value="90" />
		<SimplePredicate field="temperature" operator="greaterThan"
				value="50" />
	</CompoundPredicate>
	<SimplePredicate field="humidity" operator="greaterOrEqual"
			value="80" />
</CompoundPredicate>

欠損値値の述語

論理表\記の任意のフィールドの値が欠損していることもありうる。SimplePredicate

FieldOperatorValue (フィールド・オペレーター値)

は、フィールドの値が欠損値なら、評価は「Unknown(未知)」になります。DataDictionaryおよびMiningSchemaが欠損値を扱う方法上の定義、例えば、それを代替値(substitute)に置き換えるといったやり方を含むかもしれないことには注意を払いましょう。その場合では、代替値(substituted value)が述語を評価するために使用されます。

オペレーター「and」「or」をもつCompoundPredicateの結果は次のテーブルで決定される:

P Q P and Q P or Q
TrueTrueTrueTrue
TrueFalseFalseTrue
TrueUnknownUnknownTrue
FalseTrueFalseTrue
FalseFalseFalseFalse
FalseUnknownFalseUnknown
UnknownTrueUnknownTrue
UnknownFalseFalseUnknown
UnknownUnknownUnknownUnknown

オペレーター「surrogate」は、欠損値をもつ論理表\現を扱う特別の手段を提供します。それは述語のシーケンスに適用されます。述語の順序、一番目の述語はprimaryで、2番目の述語はsurrogates。評価順序は左から右です。primaryな述語が「Unknown」の場合、cascadedな述語が適用されます。したがって、代理述語は決定しない(undetermined)述語に、解答を与えます。(値を与えるということ:舟)

例:


<CompoundPredicate booleanOperator="surrogate" >
	<CompoundPredicate booleanOperator="and" >
		<SimplePredicate field="temperature" operator="lessThan"
				value="90" />
		<SimplePredicate field="temperature" operator="greaterThan"
				value="50" />
	</CompoundPredicate>
	<SimplePredicate field="humidity" operator="greaterOrEqual"
			value="80" />
	<False/>
</CompoundPredicate>

primaryな述語は( (temperature < 90) and (temperature > 50) )です。もし、これに、真偽の評価が与えられるなら、これは代理述語の結果です。 temperatureのフィールドが欠損していて、primaryな述語にUnknownの評価が与えられるなら、評価は第2述語(湿度>=80)へと続きます。もし湿度の値が欠損しているなら、最終結果は偽です。


ScoreDistribution

分類木構\造中のPredictor値をリストする方法。


<!ELEMENT ScoreDistribution EMPTY>
<!ATTLIST ScoreDistribution 
value CDATA #REQUIRED
recordCount %NUMBER; #REQUIRED
>

属性定義 (Attribute Definitions)

ScoreDistribution:分類モデルの中でノードが予\測するスコアのセグメントを表\わすノードの要素。ノードが一覧表\を保持するなら、一覧表\の各エントリーは1つのScoreDistribution要素中に格納されます。

value:ScoreDistributionのこの属性は分類モデル中のラベルです。

recordCount:ScoreDistributionのこの属性は値属性に関連したサイズ(レコードの数の中の)です。

ノードが最終ノードとして選択され、そして、このノードがいかなる「score」属性を持たないなら、最も高いrecordCountとScoreDistributionが、どの値が予\測される値として選択されるかを決定する。ノードが、(recordCount_i)が上界である一つ以上のエントリーが存在するようなScoreDistribution要素のシーケンスを含んでいる場合、一番始めのエントリーが選択されます。

注:ノードが属性「score」を持つ場合、この属性値は、ScoreDistributionから予\測された値の計算を無視(override)します。


:

surrogate(代理)を使用する方法

CARTアルゴリズムでは、代理(surrogate)分岐(split)に、この概念があります。ある物がレコードを分類しているとします。彼/彼女は、第一の分岐が「salary <= 35000」であるノードにレコードを落とします(drops the record to)。さらに、普通に起こりうる話として、レコードのsalaryに欠損値が入っているとします。cascade-like fashionにおいて、与えられたレコードが分類できるようになるまで、代理規則(surrogate rules)のシーケンスの適用によって、CARTはこの状況を処理します。0以上の代理分岐が利用可能\かもしれません。私たちの例において、代理として、「age <=28」、「homeowner==0」を持ちます。もし、ageが欠損してないなら、レコードはage値にそって分類されます。もし、ageがmissingなら、homeownerを確認します。もし、「homeowner」もmissingなら、我々は代理(surrogates)を使い果たしてしまい、XMLドキュメントで指定されているように、TrueかFalseを適用します。例えば [(salary <= 35000) surrogate (True)] は、「salaryが欠損してなければ、salaryによってレコードを分類し、salaryが欠損しているなら、どんな場合でも述語は真を返す。」ということを意味している。


例 TreeModel


<?xml version="1.0" ?>
<PMML version="1.1" >
<Header copyright="www.dmg.org" description="A very small 
		binary tree model to show structure."/>
	<DataDictionary numberOfFields="5" >
		<DataField name="temperature" optype="continuous"/>
		<DataField name="humidity" optype="continuous"/>
		<DataField name="windy" optype="categorical" >
			<Value value="true"/>
			<Value value="false"/>
		</DataField>
		<DataField name="outlook" optype="categorical" >
			<Value value="sunny"/>
			<Value value="overcast"/>
			<Value value="rain"/>
		</DataField>
		<DataField name="whatIdo" optype="categorical" >
			<Value value="will play"/>
			<Value value="may play"/>
			<Value value="no play"/>
		</DataField>
	</DataDictionary>
	<TreeModel modelName="golfing" functionName="classification">
		<MiningSchema>
			<MiningField name="temperature"/>
			<MiningField name="humidity"/>
			<MiningField name="windy"/>
			<MiningField name="outlook"/>
			<MiningField name="whatIdo" usageType="predicted"/>
		</MiningSchema>
	<Node score="will play">
		<True/>
		<Node score="will play">
			<SimplePredicate field="outlook" operator="equal" 
				value="sunny"/>
		<Node score="will play">
			<CompoundPredicate booleanOperator="and" >
				<SimplePredicate field="temperature" 
					operator="lessThan" value="90" />
				<SimplePredicate field="temperature" 
					operator="greaterThan" value="50" />
			</CompoundPredicate>
			<Node score="will play" >
				<SimplePredicate field="humidity" 
				operator="lessThan" value="80" />
			</Node>
			<Node score="no play" >
				<SimplePredicate field="humidity" 
				operator="greaterOrEqual" value="80" />
			</Node>
		</Node>
		<Node score="no play" >
			<CompoundPredicate booleanOperator="or" >
				<SimplePredicate field="temperature" 
					operator="greaterOrEqual" value="90"/>
				<SimplePredicate field="temperature" 
					operator="lessOrEqual" value="50" />
			</CompoundPredicate>
		</Node>
	</Node>
	<Node score="may play" >
		<CompoundPredicate booleanOperator="or" >
			<SimplePredicate field="outlook" 
				operator="equal" value="overcast" />
			<SimplePredicate field="outlook" 
				operator="equal" value="rain" />
		</CompoundPredicate>
		<Node score="may play" >
			<CompoundPredicate booleanOperator="and" >
				<SimplePredicate field="temperature" 
					operator="greaterThan" value="60" />
				<SimplePredicate field="temperature" 
					operator="lessThan" value="100" />
				<SimplePredicate field="outlook" 
					operator="equal" value="overcast" />
				<SimplePredicate field="humidity" 
					operator="lessThan" value="70" />
				<SimplePredicate field="windy" 
					operator="equal" value="false" />
			</CompoundPredicate>
		</Node>
		<Node score="no play" >
			<CompoundPredicate booleanOperator="and" >
				<SimplePredicate field="outlook" 
					operator="equal" value="rain" />
				<SimplePredicate field="humidity" 
					operator="lessThan" value="70" />
			</CompoundPredicate>
		</Node>
	</Node>
</Node>
</TreeModel>
</PMML>

得点手続き(Scoring Procedure)

私たちは、得点プロセス(scoring process)で続くステップを例証するために上記の例を使用しましょう。

入力データは以下であると仮定されます:

temperature=75, humidity=55, windy="false", outlook="overcast"

1) ルートノードを選択してください。その述語は定数Trueです。

2) ルートノード(子ノードの順序はドキュメントにおいてtop-downです)で第1の子ノードを選択します。このノード(outlook="sunny")の述語を評価します。そうすると、この述語は偽になります。親ノードに返って、第2の子を選択します。第2の子の述語は(outlook="overcast" or outlook="rain")です。入力 outlook="overcast" で、この述語は真です。このノードでとどまります。

3) currectノードの第1の子を選んでください。以下の述語を評価します。 (temperature > 60 and temperature < 100 and outlook="overcast" and humidity <70 windy="false").
述語は真である。したがって、このノードを選択してください。

4) 最後の選択されたノードが子ノードを持たないので、葉(leaf)ノードが、予\測されたフィールド「whatIdo」に対するスコア値を含みます。最後に、「whatIdo」に対する返されたスコア値は「may play」 である。

適合

次のアイテムがTreeModelのコアではない特徴です:

(a)要素ScoreDistribution

(b)要素CompoundPredicateでの属性booleanOperatorの オペレーター「xor」と「surrogate」