ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

fitctree

マルチクラス分類用のバイナリ分類決定木の近似

構文

  • tree = fitctree(TBL,ResponseVarName)
  • tree = fitctree(TBL,formula)
  • tree = fitctree(TBL,Y)
  • tree = fitctree(X,Y)
  • tree = fitctree(___,Name,Value)

説明

tree = fitctree(TBL,ResponseVarName) は、テーブル TBL に含まれている入力変数 (予測子、特徴量または属性とも呼ばれます) と ResponseVarName に含まれている出力 (応答またはラベル) に基づいて近似させたバイナリ分類決定木を返します。返される二分木では、TBL の列の値に基づいて分岐ノードが分割されます。

tree = fitctree(TBL,formula) は、テーブル TBL に含まれている入力変数に基づいて近似させたバイナリ分類決定木を返します。formula は、tree のあてはめに使用する TBL 内の応答変数と予測子変数を特定する式の文字列です。返される二分木では、TBL の列の値に基づいて分岐ノードが分割されます。

tree = fitctree(TBL,Y) は、テーブル TBL に含まれている入力変数とベクトル Y に含まれている出力に基づいて近似させたバイナリ分類決定木を返します。返される二分木では、TBL の列の値に基づいて分岐ノードが分割されます。

tree = fitctree(X,Y) は、行列 X に含まれている入力変数と出力 Y に基づいて近似させたバイナリ分類決定木を返します。返される二分木では、X の列の値に基づいて分岐ノードが分割されます。

tree = fitctree(___,Name,Value) は、前の構文のいずれかを使用し、1 つ以上の名前と値のペアの引数で指定されたオプションを追加して、木の近似を行います。たとえば、カテゴリカル予測子での最適な分割の検出、交差検定木の成長、または検証対象の入力データの一部を取得するためのアルゴリズムを指定できます。

すべて折りたたむ

ionosphere データセットを使用して分類木を成長させます。

load ionosphere
tc = fitctree(X,Y)
tc = 

  ClassificationTree
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'b'  'g'}
           ScoreTransform: 'none'
          NumObservations: 351


名前と値のペアの引数 MaxNumSplitsMinLeafSize または MinParentSize を使用すると、木の深さを制御できます。既定では、fitctree は深い決定木を成長させます。モデルの複雑さや計算時間の削減のために、より浅い木を成長させることもできます。

ionosphere データセットを読み込みます。

load ionosphere

分類木を成長させる場合、木の深さの制御に関する既定値は次のとおりです。

  • MaxNumSplitsn - 1n は学習標本のサイズです。

  • MinLeafSize1

  • MinParentSize10

これらの既定値を使用すると、学習標本のサイズが大きい場合に木が深く成長する傾向があります。

木の深さの制御について既定値を使用して、分類木を学習させます。10 分割の交差検定をモデルに対して実行します。

rng(1); % For reproducibility
MdlDefault = fitctree(X,Y,'CrossVal','on');

木に適用される分割数のヒストグラムを描画します。また、木の 1 つを表示します。

numBranches = @(x)sum(x.IsBranch);
mdlDefaultNumSplits = cellfun(numBranches, MdlDefault.Trained);

figure;
histogram(mdlDefaultNumSplits)

view(MdlDefault.Trained{1},'Mode','graph')

分割数の平均は約 15 です。

既定の分割数を使用して学習させたものほど複雑ではない (深くない) 分類木が必要であるとします。最大分割数を 7 に設定して別の分類木を学習させることで、既定値の分類木からの平均分割数が約半分になります。10 分割の交差検定をモデルに対して実行します。

Mdl7 = fitctree(X,Y,'MaxNumSplits',7,'CrossVal','on');
view(Mdl7.Trained{1},'Mode','graph')

モデルの交差検定分類誤差を比較します。

classErrorDefault = kfoldLoss(MdlDefault)
classError7 = kfoldLoss(Mdl7)
classErrorDefault =

    0.1140


classError7 =

    0.1254

Mdl7 は、MdlDefault より大幅に単純化されており、性能は少しだけ低下します。

入力引数

すべて折りたたむ

モデルを学習させるために使用する標本データ。テーブルとして指定します。TBL の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。オプションとして、TBL に応答変数用の列を 1 つ追加できます。複数列の変数と、文字列のセル配列ではないセル配列は使用できません。

TBL に応答変数が含まれている場合に TBL 内の他の変数をすべて予測子として使用するには、ResponseVarName を使用して応答変数を指定します。

TBL に応答変数が含まれている場合に TBL 内の他の変数の一部のみを予測子として使用するには、formula を使用して式の文字列を指定します。

TBL に応答変数が含まれていない場合は、Y を使用して応答変数を指定します。応答変数の長さと TBL の行数は、同じでなければなりません。

データ型: table

予測子の値。浮動小数点値の行列として指定します。

fitctree は、XNaN 値を欠損値として認識します。fitctree は、すべての欠損値のある観測を X の近似に使用しません。fitctree は、これらの観測が有効な値をもつ場合に変数の分割を検出するために、一部の欠損値のある観測を X に使用します。

データ型: single | double

応答変数の名前。TBL に含まれている変数の名前として指定します。

ResponseVarName は、文字列として指定しなければなりません。たとえば、応答変数 YTBL.Y として格納されている場合、'Y' として指定します。そうでない場合、モデルを学習させるときに、TBL の列は Y を含めてすべて予測子として扱われます。

応答変数は、カテゴリカル配列、文字配列、論理ベクトル、数値ベクトル、または文字列のセル配列でなければなりません。Y が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

ClassNames 名前と値のペアの引数を使用してクラスの順序を指定することをお勧めします。

モデルの学習で使用する応答変数と予測子変数。'Y~X1+X2+X3' という形式の文字列として指定します。この形式では、Y は応答変数を、X1X2 および X3 は予測子変数を表します。

モデルを学習させるための予測子として、TBL に含まれている変数の一部を指定するには、式の文字列を使用します。式の文字列を指定した場合、formula に現れない TBL の変数はモデルの学習に使用されません。

クラスラベル。数値ベクトル、カテゴリカル ベクトル、論理ベクトル、文字配列 または文字列のセル配列として指定します。X の各行は、X の対応する行の分類を表します。

木を近似させるときに、fitctreeY に含まれている NaN'' (空の文字列) および <undefined> 値を欠損値と見なします。fitctree は、Y に対し欠損値がある観測値を近似において使用しません。

Y が数値の場合は、代わりに fitrtree を使用して回帰木を近似させることを検討してください。

データ型: single | double | char | logical | cell

名前/値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: 'CrossVal','on','MinLeafSize',40 は、葉ごとに最低 40 個の観測値をもつ交差検定分類木を指定します。

すべて折りたたむ

データが K (3 以上) 個のクラスをもつ場合、C 個のレベルをもつカテゴリカル予測子において最適な分割を検出するアルゴリズム。'AlgorithmForCategorical' と次のいずれかで構成されるコンマ区切りのペアとして指定されます。

'Exact'2C–1 – 1 のすべての組み合わせを検討します。
'PullLeft'右枝にあるすべての C カテゴリから開始します。残りのカテゴリにおいて K クラスの最小不純度を実現するように、各カテゴリを左枝に移動することを検討してください。このシーケンスから、最小の不純度をもつ分割を選択します。
'PCA'(中心となるクラス確率行列の) 重み付け共分散行列の最初の主成分とそのカテゴリに対するクラス確率のベクトル間の内積を使用して、各カテゴリのスコアを計算します。スコアを昇順に並べ替え、C - 分割をすべてを検討します。
'OVAbyClass'右枝にあるすべての C カテゴリから開始します。クラスごとに、そのクラスの確率に基づいてカテゴリの順序を設定します。最初のクラスでは、各カテゴリを左枝に順番に移動し、各移動の不純度基準を記録します。残りのクラスに対して同じ作業を繰り返します。このシーケンスから、最小の不純度をもつ分割を選択します。

fitctree により、既知のクラスの数とカテゴリカル予測子のレベルを使用して分割ごとに最適なアルゴリズムのサブセットが自動的に選択されます。K = 2 クラスの場合、fitctree では常に完全一致検索が実行されます。特定のアルゴリズムを指定するには、名前と値のペアの引数 'AlgorithmForCategorical' を使用します。

例: 'AlgorithmForCategorical','PCA'

カテゴリカル予測子のリスト。'CategoricalPredictors' と以下のいずれかで構成される、コンマ区切りペアとして指定します。

  • 1 から p までのインデックスを使用する数値ベクトル。p は、X の列数を示します。

  • 長さ p の論理ベクトル。true のエントリは、対応する X の列がカテゴリカル変数であることを示します。

  • 文字列のセル配列。配列の各要素は、予測子変数の名前です。名前は PredictorNames プロパティの値と一致してなければなりません。

  • 文字行列。行列の各行は、予測子変数の名前です。名前は PredictorNames プロパティの値と一致してなければなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。

  • 'all'、すべての予測子がカテゴリカルであることを示します。

既定の設定では、予測子データが行列 (X) に格納されている場合、どの予測子もカテゴリカルではないと見なされます。予測子データがテーブル (TBL) にあり、論理値、順序付けされていない categorical データ型の値、または文字列のセル配列が含まれている場合、変数はカテゴリカルであると見なされます。

例: 'CategoricalPredictors','all'

データ型: single | double | char

学習に使用するクラスの名前。'ClassNames' とカテゴリカル配列、文字配列、論理ベクトル、数値ベクトル、または文字列のセル配列から構成されるコンマ区切りのペアとして指定します。ClassNames のデータ型は Y と同じでなければなりません。

ClassNames が文字配列の場合、各要素は配列の 1 つの "行" に対応しなければなりません。

ClassNames の使用目的は次のとおりです。

  • 学習時のクラスの順序を指定する。

  • クラスの順序に対応する入力または出力引数の次元の順序を指定する。たとえば、Cost の次元の順序や predict によって返される分類スコアの列の順序を指定するために ClassNames を使用します。

  • 学習用にクラスのサブセットを選択する。たとえば、Y に含まれているすべての異なるクラス名の集合が {'a','b','c'} であるとします。クラス 'a' および 'c' のみの観測値を使用してモデルに学習をさせるには、'ClassNames',{'a','c'} を指定します。

既定の設定は、Y に含まれているすべての異なるクラス名の集合です。

例: 'ClassNames',{'b','g'}

データ型: categorical | char | logical | single | double | cell

点の誤判別のコスト。'Cost' と以下のいずれかで構成されるコンマ区切りペアとして指定されます。

  • 正方行列。Cost(i,j) は真のクラスが i である場合に 1 つの点をクラス j に分類するためのコストです (行は真のクラス、列は予測したクラスに対応します)。Cost の対応する行と列についてクラスの順序を指定するには、名前と値のペアの引数 ClassNames も指定します。

  • 2 つのフィールドをもつ S を構成します。2 つのフィールドは、Y と同じデータ型のグループ名を表す変数が格納されている S.ClassNames と、コスト行列が格納されている S.ClassificationCosts です。

既定値は、i~=j の場合は Cost(i,j)=1i=j の場合は Cost(i,j)=0 です。

データ型: single | double | struct

交差検定決定木を成長させるフラグ。'CrossVal''on' または 'off' で構成されるコンマ区切りのペアとして指定します。

'on' の場合は、fitctree が10 分割交差検定決定木を成長させます。'KFold''Holdout''Leaveout' または 'CVPartition' 名前と値のペアの引数のいずれかを使用してこの交差検定の設定をオーバーライドできます。交差検定木を作成する場合、これらの 4 つの引数のうち 1 つだけを使用できます。

または、crossval メソッドを使用して、後で tree に交差検定を実施します。

例: 'CrossVal','on'

交差検定決定木で使用する分割。'CVPartition' と、cvpartition を使用して作成されるオブジェクトで構成される、コンマ区切りのペアとして指定します。

'CVPartition' を使用する場合は、'KFold''Holdout' または 'Leaveout' 名前と値のペアの引数のいずれも使用できません。

ホールドアウト検定に使用されるデータの比率。'Holdout' と、[0,1] の範囲内のスカラー値から成るコンマ区切りのペアとして指定します。ホールドアウト検定は、データの指定部分をテストし、データの残りの部分を学習に使用します。

'Holdout' を使用する場合は、'CVPartition''KFold' または 'Leaveout' 名前と値のペアの引数のいずれも使用できません。

例: 'Holdout',0.1

データ型: single | double

交差検定分類器で使用する分割の数。'KFold' と 1 より大きい正の整数から構成されるコンマ区切りのペアとして指定します。たとえば、'KFold',k を指定した場合、以下が行われます。

  1. データを無作為に k 個のセットに分割する

  2. 各セットについて、そのセットを検証データとして予約し、他の k – 1 個のセットを使用してモデルを学習させる

  3. k 個のコンパクトな学習済みモデルを、交差検定対象モデルの Trained プロパティに含まれている k 行 1 列のセル ベクトルのセルに格納する。

交差検定対象モデルを作成するために使用できるオプションは、'CVPartition''Holdout''KFold''Leaveout' のいずれかのみです。

例: 'KFold',8

データ型: single | double

Leave-one-out 法の交差検定のフラグ。'Leaveout''on' または 'off' で構成されるコンマ区切りのペアとして指定します。Leave-one-out 法の交差検定を使用する場合は、'on' を指定します。

'Leaveout' を使用する場合は、'CVPartition''Holdout' または 'KFold' 名前と値のペアの引数のいずれも使用できません。

例: 'Leaveout','on'

カテゴリ レベルの最大数。'MaxNumCategories' と非負のスカラー値で構成されるコンマ区切りのペアとして指定します。予測子が分割ノードで最大 MaxNumCategories 個のレベルをもつ場合、fitctree は、完全一致検索アルゴリズムを使用してカテゴリカル予測子を分割します。それ以外の場合、fitctree はあいまいアルゴリズムのいずれかを使用して最適なカテゴリカル分割を見つけます。

小さい値を渡すと精度が失われる可能性があり、大きい値を渡すと計算時間が長くなり、メモリ オーバーロードが発生する可能性があります。

例: 'MaxNumCategories',8

決定分割 (分岐ノード) の最大数。'MaxNumSplits' と正の整数をコンマ区切りのペアとして指定します。fitctree では、分岐ノードの数が MaxNumSplits 以下になるように分割します。分割の動作についての詳細は、「アルゴリズム」を参照してください。

例: 'MaxNumSplits',5

データ型: single | double

葉マージ フラグ。'MergeLeaves''on' または 'off' で構成されるコンマ区切りのペアとして指定します。

MergeLeaves'on' の場合は、fitctree は以下の手順に従います。

  • 同じ親ノードから派生して、親ノードに関連するリスク以上のリスク値の合計を得る葉をマージします

  • 枝刈りされた部分木の最適シーケンスを推定するが、分類木は枝刈りしません

それ以外の場合、fitctree は葉をマージしません。

例: 'MergeLeaves','off'

葉ノードの観測値の最小数。'MinLeafSize' と正の整数値で構成されるコンマ区切りのペアとして指定します。各葉には少なくともツリー葉あたり MinLeafSize の観測値があります。MinParentSizeMinLeafSize の両方を指定した場合、fitctree では葉の数が多くなる方の設定を使用します。MinParentSize = max(MinParentSize,2*MinLeafSize)

例: 'MinLeafSize',3

データ型: single | double

分岐ノードの観測値の最小数。'MinParentSize' と正の整数値で構成されるコンマ区切りのペアとして指定します。ツリーの各分岐ノードには少なくとも MinParentSize の観測値があります。MinParentSizeMinLeafSize 両方を指定した場合、fitctree では葉の数が多くなる方の設定を使用します。MinParentSize = max(MinParentSize,2*MinLeafSize)

例: 'MinParentSize',8

データ型: single | double

分割ごとにランダムに選択する予測子の数。'NumVariablesToSample' と正の整数値で構成されるコンマ区切りのペアとして指定します。'all' を指定すると、使用可能なすべての予測子が使用されます。

例: 'NumVariablesToSample',3

データ型: single | double

予測子変数名。'PredictorNames' と文字列のセル配列から構成されるコンマ区切りのペアとして指定します。文字列のセル配列には、X または TBL に現れる順序で予測子変数の名前を含めます。

予測子をテーブル (TBL) として指定する場合、PredictorNamesTBL に含まれている変数名のサブセットでなければなりません。この場合、PredictorNames に含まれている変数のみがモデルの近似に使用されます。式を使用してモデルを指定する場合、名前と値のペア PredictorNames は使用できません。

例: 'PredictorNames',{'PetalWidth','PetalLength'}

各クラスの事前確率。'Prior' と以下のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 文字列:

    • 'empirical'Y のクラスの頻度からクラス確率を決定します。観測値の重みを渡す場合、fitctree はこの重みを使用してクラス確率を計算します。

    • 'uniform' はすべてのクラス確率を均等に設定します。

  • ベクトル (クラスごとに 1 つのスカラー値)。Prior の対応する要素についてクラスの順序を指定するには、名前と値のペアの引数 ClassNames も指定します。

  • 構造体 S には 2 つのフィールドがあります。

    • Y と同じ型の変数としてクラス名を含む S.ClassNames

    • 対応する確率のベクトルを含む S.ClassProbs

weightsprior の両方に値を設定した場合は、重みは再正規化され、それぞれのクラスの事前確率の値に加算されます。

例: 'Prior','uniform'

枝刈りされた部分木の最適なシーケンスを推定するフラグ。'Prune''on' または 'off' で構成されるコンマ区切りのペアとして指定します。

Prune'on' の場合、fitctree は枝刈りを行わずに分類木を成長させますが、枝刈りされた部分木の最適なシーケンスの推定は行います。それ以外の場合は、fitctree は分類木を成長させますが、枝刈りされた部分木の最適シーケンスを推定しません。

学習済みの ClassificationTree モデルに対して枝刈りを行うには、モデルを prune に渡します。

例: 'Prune','off'

枝刈り条件。'PruneCriterion' および 'error' または 'impurity' で構成されるコンマ区切りのペアとして指定します。

例: 'PruneCriterion','impurity'

応答変数名。'ResponseName' と応答変数の名前を表す文字列から構成されるコンマ区切りのペアとして指定します。

入力引数 ResponseVarName または formula を使用した場合、この名前と値のペアは無効になります。

例: 'ResponseName','IrisType'

スコア変換関数。'ScoreTransform' と、スコアを変換するための関数ハンドルで構成される、コンマ区切りのペアとして指定します。この関数は、行列 (元のスコア) を受け入れて同じサイズの行列 (変換したスコア) を返さなければなりません。

または、組み込み変換関数を表す次の文字列のいずれかを指定することもできます。

文字列
'doublelogit'1/(1 + e–2x)
'invlogit'log(x / (1–x))
'ismax'最大のスコアをもつクラスのスコアを 1 に設定し、それ以外のクラスのスコアを 0 に設定します。
'logit'1/(1 + e–x)
'none' または 'identity'x (変換なし)
'sign'x < 0 のとき –1
x = 0 のとき 0
x > 0 のとき 1
'symmetric'2x – 1
'symmetriclogit'2/(1 + e–x) – 1
'symmetricismax'最大のスコアをもつクラスのスコアを 1 に設定し、それ以外のクラスのスコアを -1 に設定します。

例: 'ScoreTransform','logit'

分割条件。'SplitCriterion' と、'gdi' (ジニ多様性指数)、Twoing 規則の 'twoing'、最大逸脱度減少量 (クロス エントロピーともいう) の 'deviance' のいずれかで構成される、コンマ区切りのペアとして指定します。

例: 'SplitCriterion','deviance'

決定木のサロゲート分割フラグ。'Surrogate''on''off''all' または正の整数値から構成されるコンマ区切りのペアとして指定します。

  • 'on' に設定すると、fitctree は各分岐ノードで最大 10 のサロゲート分割を検出します。

  • 'all' に設定すると、fitctree は各分岐ノードですべてのサロゲート分割を検出します。'all' に設定すると、処理時間およびメモリ使用量が非常に増加する可能性があります。

  • 正の整数値に設定すると、fitctree は各分岐ノードで最大指定された数のサロゲート分割を検出します。

サロゲート分割を使用すると、欠損値をもつデータの予測精度が改善されます。また、予測子同士の関連性予測尺度も計算できます。詳細は、ノード分割規則を参照してください。

例: 'Surrogate','on'

観測値の重み。'Weights' とスカラー値のベクトルで構成されるコンマ区切りのペアとして指定します。X または TBL の各行に含まれている観測値には、Weights の対応する値で重みが付けられます。Weights のサイズは、X または TBL の行数と同じでなければなりません。

入力データをテーブル TBL として指定した場合、Weights は数値ベクトルが含まれている TBL 内の変数の名前にすることができます。この場合、Weights は変数名の文字列として指定しなければなりません。たとえば、重みのベクトル WTBL.W として格納されている場合、'W' として指定します。そうでない場合、モデルを学習させるときに、TBL の列は W を含めてすべて予測子として扱われます。

fitctree は、合計がクラスの事前確率の値になるように各クラスの重みを正規化します。

データ型: single | double

出力引数

すべて折りたたむ

分類木。分類木オブジェクトとして返します。

'CrossVal''KFold''Holdout''Leaveout' または 'CVPartition' オプションを使用すると、クラス ClassificationPartitionedModel の木が生成されます。予測に分割されたツリーは使用できないため、この種類のツリーには predict メソッドがありません。代わりに、kfoldpredict を使用して、学習に使用しない観測値の応答を予測します。

それ以外の場合、treeClassificationTree クラスです。predict メソッドを使用して予測を行うことができます。

詳細

すべて折りたたむ

不純度とノード誤差

ClassificationTree は、"不純度" または "ノード誤差" に基づいてノードを分割します。

不純度とは、SplitCriterion 名前と値のペアの引数によって、次のいずれかの意味を表します。

  • ジニ多様性指数 (gdi) — ノードのジニ指数は、次の式で表されます。

    1ip2(i),

    ここで、合計はノードのクラス i 全体が対象であり、p(i) は、ノードに到達したクラス i をもつ観測クラスの割合です。クラスを 1 つだけもつノード ("純粋" ノード) のジニ指数は 0 です。それ以外のノードでは、ジニ指数は正の値です。したがって、ジニ指数はノードの不純度の基準です。

  • 逸脱度 ('deviance') — ノードの逸脱度は、ジニ指数と同様に定義された p(i) を用いて次の式で表されます。

    ip(i)logp(i).

    純粋ノードの逸脱度は 0 です。それ以外のノードでは、逸脱度は正の値です。

  • Twoing 規則 ('twoing') — Twoing はノードの純粋度の基準ではありませんが、ノードの分割を判断するための別の基準の 1 つです。L(i) は、分割後の左側の子ノードのクラス i のメンバーの割合を示し、R(i) は分割後の右側の子ノードのクラス i のメンバーの割合を示すとします。最大化するための分割基準を選択します。

    P(L)P(R)(i|L(i)R(i)|)2,

    ここで、P(L) および P(R) は、それぞれ左側と右側に分割された観測値の割合を表します。式が大きい場合は、分割によって各子ノードの純粋度は高くなります。同様に、式が小さい場合には、分割によって各子ノードは互いに類似するようになり、さらに親ノードとも類似するようになります。そのため、分割によってノードの純粋度は高くはなりませんでした。

  • ノード誤差 — ノード誤差はノードで誤判別されたクラスの割合です。j がノードで最大の学習標本数をもつクラスである場合は、ノード誤差は次のように表されます。

    1 – p(j).

関連性予測尺度

"関連性予測尺度" は、観測値を分割する決定規則間の類似度を示す値です。(木を成長させることによって求められる) 最適な分割に対して比較される、可能なすべての決定分割の中で、最適な決定木のサロゲート分割は関連性予測尺度が最大になります。2 番目に最適なサロゲート分割は、関連性予測尺度が 2 番目に大きくなります。

xj と xk がそれぞれ予測子変数 j および k であり、j ≠ k であるとします。ノード t における最適な分割 xj < u とサロゲート分割 xk < v の間の関連性予測尺度は、次のようになります。

λjk=min(PL,PR)(1PLjLkPRjRk)min(PL,PR).

  • PL は、ノード t において xj < u となる観測値の割合です。添字 L は、ノード t の左の子を表します。

  • PR は、ノード t において xj ≥ u となる観測値の割合です。添字 R は、ノード t の右の子を表します。

  • PLjLk は、ノード t において xj < u および xk < v となる観測値の割合です。

  • PRjRk は、ノード t において xj ≥ u および xk ≥ v となる観測値の割合です。

  • xj または xk について欠損値がある観測値は、割合の計算に使用されません。

λjk は、(-∞,1] の値になります。λjk > 0 の場合、xk < v は xj < u のサロゲート分割として価値があります。

決定木のサロゲート分割

"決定木のサロゲート分割" は、決定木の特定のノードにおける最適な決定分割の代わりになります。最適な分割は、木を成長させることによって求められます。サロゲート分割では、類似する予測子変数または相関関係がある予測子変数と分割基準を使用します。

ある観測値について最適な分割予測子の値が欠損している場合、その観測値は最適なサロゲート予測子を使用して左または右の子ノードに送られます。観測値について最適なサロゲート予測子の値も欠損している場合、その観測値は 2 番目に最適なサロゲート予測子を使用して左または右の子ノードに送られます。3 番目以降についても同様です。分割候補は、関連性予測尺度の降順で並べ替えられます。

ヒント

既定では Prune'on' です。ただし、この仕様は分類木を枝刈りしません。学習させた分類木を枝刈りするには、分類木を prune に渡します。

アルゴリズム

ノード分割規則

fitctree は以下のステップに従い、ノード t の分割方法を決定します。すべての予測子 xi (i = 1,...,p) について

  1. fitctree は、ノード t の重み付き不純度 it を計算します。サポートされる不純度の尺度については、SplitCriterion を参照してください。

  2. fitctree は、次の式を使用して、観測値がノード t に含まれる確率を推定します。

    P(T)=jTwj.

    wj は観測値 j の重み、T はノード t に含まれているすべての観測値のインデックスの集合です。PriorWeights のいずれも指定しなかった場合、wj = 1/n になります。ここで、n は標本サイズです。

  3. fitctree は、xi を昇順で並べ替えます。並べ替えられた予測子の各要素は、分割候補または切り取り点です。fitctree は、欠損値に対応するインデックスを、分割されない集合 TU に格納します。

  4. fitctree は、すべての分割候補で不純度ゲイン (ΔI) を最大化することにより、xi を使用してノード t を分割する最適な方法を決定します。つまり、xi に含まれているすべての分割候補について、

    1. fitctree は、ノード t に含まれている観測値を左と右の子ノード (それぞれ tL および tR) に分割します。

    2. fitctree は ΔI を計算します。特定の分割候補について、集合 TL および TR 内の観測値のインデックスがそれぞれ tL および tR に含まれていると仮定します。

      • xi に欠損値が含まれていない場合、現在の分割候補の不純度ゲインは次のようになります。

        ΔI=P(T)itP(TL)itLP(TR)itR.

      • xi に欠損値が含まれている場合、観測値はランダムに欠損していると仮定され、不純度ゲインは次のようになります。

        ΔIU=P(TTU)itP(TL)itLP(TR)itR.

        T - TU は、ノード t に含まれている、欠損していないすべての観測値のインデックスの集合です。

      • 決定木のサロゲート分割を使用する場合、次のようになります。

        1. fitctree は、決定分割 xj < u と可能なすべての決定分割 xk < v (j ≠ k) の間で関連性予測尺度 を計算します。

        2. fitctree は、最適な分割となる関連性予測尺度の降順に、可能な代替決定分割を並べ替えます。サロゲート分割は、尺度が最大になる決定分割です。

        3. fitctree は、xi についてサロゲート分割を使用して、欠損値が含まれている観測値を子ノードに割り当てます。サロゲート予測子にも欠損値が含まれている場合、fitctree は他のサロゲートがなくなるまで、尺度が 2 番目に大きいものから順番に決定分割を使用します。fitctree は、ノード t で 2 つの異なるサロゲート分割を使用して 2 つの異なる観測値を分割することができます。たとえば、ノード t で予測子 xi (i ∉ {1,2}) について、予測子 x1 および x2 がそれぞれ最適および 2 番目に最適なサロゲートであるとします。予測子 xi の観測値 m が欠損しており (つまり、xmi が欠損)、xm1 は欠損していない場合、x1 は観測値 xmi のサロゲート予測子になります。観測値 x(m + 1),i と x(m + 1),1 が欠損しており、x(m + 1),2 は欠損していない場合、x2 は観測値 m + 1 のサロゲート予測子になります。

        4. fitctree は、適切な不純度ゲインの式を使用します。つまり、fitctree がサロゲート分割を使用して、ノード t に含まれているすべての欠損観測値を子ノードに割り当てることができない場合、不純度ゲインは ΔIU になります。そうでない場合、fitctree は不純度ゲインに ΔI を使用します。

    3. fitctree は、不純度ゲインが最大になる候補を選択します。

fitctree は、不純度ゲインが最大になる切り取り点で予測子変数を分割します。

木の深さの制御

  • MergeLeaves'on' および PruneCriterion'error' (これらの名前と値のペアの引数の既定値) の場合、枝刈りは分類誤差を使用して葉のみに適用されます。この仕様はツリー葉あたり最も一般的なクラスを共有する葉のマージになります。

  • MaxNumSplits に対応するため、fitctree は現在の "レイヤー" に含まれているすべてのノードを分割してから分岐ノードの数をカウントします。レイヤーとは、ルート ノードから同じ距離にあるノードの集合です。分岐ノードの数が MaxNumSplits を超えた場合、fitctree は以下の手順に従います。

    1. 現在のレイヤーに含まれている分岐ノードが、最大でも MaxNumSplits になるように、分割を解除する数を判断する。

    2. 不純度順に分岐ノードを並べ替える。

    3. 適切ではない分岐の分割を解除する。

    4. それまでに成長させた決定木を返す。

    この手順に従うと、バランスが最大の木が生成されます。

  • 次の条件のいずれかが満たされるまで、分岐ノードをレイヤー単位で分割します。

    • MaxNumSplits 個の分岐ノードが存在している。

    • 推奨されている分割を行うと、少なくとも 1 つの分岐ノードで観測値の数が MinParentSize より少なくなる。

    • 推奨される分割を行うと、少なくとも 1 つの葉ノードで観測値の数が MinLeafSize より少なくなる。

    • レイヤー内で適切な分割を検出できない。つまり、現在の枝刈り基準 (PruneCriterion 参照) では、レイヤー内で推奨されている分割を行っても状況が改善されない。すべてのノードが純粋 (ノード内のすべての観測値が同じクラス) になるのは特殊なケースです。

    MaxNumSplitsMinLeafSize は、既定値で行われる分割に影響を与えません。'MaxNumSplits' を設定した場合、MaxNumSplits 回の分割が発生する前に、MinParentSize の値が原因となって分割が停止することもあります。

並列化

デュアルコア以上のシステムの場合、fitctree では Intel® スレッディング ビルディング ブロック (TBB) を使用して決定木の学習を並列化します。Intel TBB についての詳細は、https://software.intel.com/en-us/intel-tbb を参照してください。

参照

[1] Coppersmith, D., S. J. Hong, and J. R. M. Hosking. “Partitioning Nominal Attributes in Decision Trees.” Data Mining and Knowledge Discovery, Vol. 3, 1999, pp. 197–217.

[2] Breiman, L., J. Friedman, R. Olshen, and C. Stone. Classification and Regression Trees. Boca Raton, FL: CRC Press, 1984.

この情報は役に立ちましたか?