ドキュメンテーション

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

fitrtree

バイナリ回帰決定木の近似

構文

  • tree = fitrtree(tbl,ResponseVarName)
  • tree = fitrtree(tbl,formula)
  • tree = fitrtree(tbl,y)
  • tree = fitrtree(x,y)
  • tree = fitrtree(___,Name,Value)

説明

tree = fitrtree(tbl,ResponseVarName) は、テーブル tbl に含まれている入力変数 (予測子、特徴量または属性とも呼ばれます) と tbl.ResponseVarName に含まれている出力 (応答) に基づいて回帰木を返します。tree は、tbl の列の値に基づいて各分岐ノードが分割されている二分木です。

tree = fitrtree(tbl,formula) は、テーブル tbl に含まれている入力変数に基づいて回帰木を返します。formula は、学習に使用する tbl 内の応答変数および予測子変数を特定する式の文字列です。

tree = fitrtree(tbl,y) は、テーブル tbl に含まれている入力変数と y に含まれている出力に基づいて回帰木を返します。

tree = fitrtree(x,y) は、入力変数 x と出力 y に基づいて回帰木を返します。tree は、x の列の値に基づいて各分岐ノードが分割されている二分木です。

tree = fitrtree(___,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加のオプションを使用してツリーを近似します。たとえば、観測値の重みを指定したり、交差検定モデルを学習させることができます。

次の 5 つのオプションのいずれかを使用する場合は、tree はクラス RegressionPartitionedModel です。それらは、'CrossVal''KFold''Holdout''Leaveout' または 'CVPartition' です。それ以外の場合、tree はクラス RegressionTree です。

すべて折りたたむ

標本データを読み込みます。

load carsmall;

標本データを使用して回帰木を構築します。

tree = fitrtree([Weight, Cylinders],MPG,...
                'categoricalpredictors',2,'MinParentSize',20,...
                'PredictorNames',{'W','C'})
tree = 

  RegressionTree
           PredictorNames: {'W'  'C'}
             ResponseName: 'Y'
    CategoricalPredictors: 2
        ResponseTransform: 'none'
          NumObservations: 94


気筒数が 4、6 および 8 で、重さが約 1.8t (4,000 ポンド) の車の燃費を予測します。

mileage4K = predict(tree,[4000 4; 4000 6; 4000 8])
mileage4K =

   19.2778
   19.2778
   14.3889

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

carsmall データセットを読み込みます。DisplacementHorsepower および Weight が応答 MPG の予測子であると考えます。

load carsmall
X = [Displacement Horsepower Weight];

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

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

  • MinLeafSize1

  • MinParentSize10

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

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

rng(1); % For reproducibility
MdlDefault = fitrtree(X,MPG,'CrossVal','on');

木に適用される数のヒストグラムを描画します。適用される分割数は、葉の数より 1 つ小さい値です。また、木の 1 つを表示します。

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

figure;
histogram(mdlDefaultNumSplits)

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

分割数の平均は 14 ~ 15 です。

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

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

各モデルの交差検定 MSE を比較します。

mseDefault = kfoldLoss(MdlDefault)
mse7 = kfoldLoss(Mdl7)
mseDefault =

   27.7277


mse7 =

   28.3833

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

入力引数

すべて折りたたむ

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

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

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

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

データ型: table

予測子の値。浮動小数点値の行列として指定します。x の各列が 1 つの変数を表し、各行が 1 つの観測値を表します。

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

データ型: single | double

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

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

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

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

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

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

応答データ。x と同じ行数の数値列ベクトルとして指定します。y の各エントリは x の対応する行のデータに対する応答です。

fitrtreeyNaN 値を欠損値として認識します。fitrtree は近似において y に欠損値のある観測を使用しません。

データ型: single | double

名前/値のペアの引数

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

例: 'CrossVal','on','MinParentSize',30 は、分岐ノードごとに最低 30 個の観測値をもつ交差検定回帰木を指定します。

すべて折りたたむ

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

  • 1 から p までのインデックスをもつ数値ベクトル。p は、x または tbl の列数です。

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

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

  • 文字行列。行列の各行は、予測子変数の名前です。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。

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

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

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

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

'on' の場合は、fitrtree が10 分割交差検定決定木を成長させます。'KFold''Holdout''Leaveout' または 'CVPartition' 名前と値のペアの引数のいずれかを使用してこの交差検定の設定をオーバーライドできます。交差検定木を作成する場合、一度に使用できるのは 4 つのオプション ('KFold''Holdout''Leaveout' および 'CVPartition') のいずれか 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' を使用する場合は、'CVPartition''Holdout' または 'Leaveout' 名前と値のペアの引数のいずれも使用できません。

例: 'KFold',8

データ型: single | double

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

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

例: 'Leaveout','on'

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

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

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

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

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

例: 'MergeLeaves','off'

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

例: 'MinLeafSize',3

データ型: single | double

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

例: 'MinParentSize',8

データ型: single | double

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

例: 'NumVariablesToSample',3

データ型: single | double

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

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

データ型: cell

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

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

学習させた回帰木を枝刈りするには、回帰木を prune に渡します。

例: 'Prune','off'

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

例: 'PruneCriterion','error'

ノードあたりの二次誤差の許容誤差。'QuadraticErrorTolerance' と正のスカラー値で構成されるコンマ区切りのペアとして指定します。ノードあたりの二次誤差が QuadraticErrorTolerance*QED より小さくなるとノード分割を停止します。ここで QED は決定木が成長する前に計算された全データの二次誤差です。

例: 'QuadraticErrorTolerance',1e-4

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

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

例: 'ResponseName','Response'

データ型: char

生の応答値を変換するための応答変換関数。'ResponseTransform' と、関数ハンドルまたは 'none' で構成されるコンマ区切りのペアとして指定します。この関数ハンドルでは、応答値の行列を受け入れて同じサイズの行列を返さなければなりません。既定の文字列 'none' は、@(x)x または変換なしを表します。

ドット表記を使用して関数 ResponseTransform を追加または変更します。

tree.ResponseTransform = @function

データ型: function_handle

分割条件。'SplitCriterion''MSE' (二乗平均誤差) で構成されるコンマ区切りのペアとして指定します。

例: 'SplitCriterion','MSE'

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

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

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

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

サロゲート分割を使用すると、欠損値をもつデータの予測精度が改善されます。また、予測子同士の関連性予測尺度も計算できます。

例: 'Surrogate','on'

データ型: single | double

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

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

fitrtree は、合計が 1 になるように各クラスの重みを正規化します。

データ型: single | double

出力引数

すべて折りたたむ

回帰木。回帰木オブジェクトとして返します。'Crossval''KFold''Holdout''Leaveout' または 'CVPartition' オプションを使用すると、クラス RegressionPartitionedModel の木が生成されます。予測に分割されたツリーは使用できないため、この種類のツリーには predict メソッドがありません。

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

詳細

すべて折りたたむ

関連性予測尺度

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

アルゴリズム

ノード分割規則

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

  1. fitrtree は、次の式を使用してノード t における応答の重み付き二乗平均誤差 (MSE) を計算します。

    εt=jTwj(yjy¯t)2.

    wj は観測値 j の重み、T はノード t におけるすべての観測値のインデックスの集合です。Weights を指定しない場合、wj = 1/n になります。n は、標本サイズです。

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

    P(T)=jTwj.

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

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

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

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

      • xi に欠損値が含まれていない場合、現在の分割候補における MSE の減少は次のようになります。

        ΔI=P(T)εtP(TL)εtLP(TR)εtR.

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

        ΔIU=P(TTU)εtP(TL)εtLP(TR)εtR.

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

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

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

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

        3. fitrtree は、xi についてサロゲート分割を使用して、欠損値が含まれている観測値を子ノードに割り当てます。サロゲート予測子にも欠損値が含まれている場合、fitrtree は他のサロゲートがなくなるまで、尺度が 2 番目に大きいものから順番に決定分割を使用します。fitrtree は、ノード 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. fitrtree は、適切な MSE の減少の式を使用します。つまり、fitrtree がサロゲート分割を使用して、ノード t に含まれているすべての欠損観測値を子ノードに割り当てることができない場合、MSE の減少は ΔIU になります。そうでない場合、fitrtree は MSE の減少に ΔI を使用します。

    3. fitrtree は、MSE の減少が最大になる候補を選択します。

fitrtree は、MSE の減少が最大になる切り取り点で予測子変数を分割します。

木の深さの制御

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

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

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

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

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

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

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

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

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

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

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

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

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

並列化

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

参照

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

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