例では、X
には34個の予測子が含まれています。予測子には名前がなく、fitctree
は列番号x1, x2, ..., x34
で参照するだけです。表を反転すると、列番号が変更され、その名前が変更されます。従ってx1 -> x34
。 x2 -> x33
など
CARTは常に2つの子ノード間の不純物ゲインを最大にするプレディクタによってノードを分割するので、これは問題ではありません。しかし、時には同じ不純物の増加をもたらす複数の予測因子が存在する。次に、列番号が一番小さいものを選びます。また、予測子を並べ替えることによって列番号が変更されたため、そのノードで別の予測子になります。
など。のは、マークされたスプリットを見てみましょう:
オリジナルオーダー(mdl
):
ひっくり返し順(mdl1
):常に同じ予測変数と値が選択されています。この時点まで ![flip](https://i.stack.imgur.com/bFpqL.jpg)
。注文に応じて名前が変更されました。新しいモデルの古いデータのx5
= x30
。しかし、とx6
は実際には異なる予測変数です。 x6
は、元の順序でx29
です。
もの予測子との間の散布図は、これが起こる可能性を示し:青、シアン線は、そのノードにそれぞれmdl
とmdl1
によって実行される分割をマーク
![complot](https://i.stack.imgur.com/EebI1.jpg)
。わかるように、両方の分割はラベルごとに同じ数の要素を持つ子ノードを生成します!したがって、CARTは2つの予測変数のいずれかを選択することができ、同じ不純物の増加を引き起こします。
その場合は、低い列番号のものを選択するように見えます。フリップされていないテーブルのがx29
の代わりに選択されているので、3 < 29
です。しかし、テーブルを反転すると、はx32
になり、x29
はx6
になります。 6 < 32
以降はx6
となり、元はx29
となります。
最終的にはこれは問題ではありません。反転したテーブルの決定木は良くないか悪いです。これは、ツリーがオーバーフィットし始める下位のノードでのみ発生します。だからあなたは本当に気にする必要はありません。
付録:散布図を生成するための
コード:ラベルを変更しながら
load ionosphere % Contains X and Y variables
Mdl = fitctree(X,Y);
view(Mdl,'mode','graph');
X1=fliplr(X);
Mdl1 = fitctree(X1,Y);
view(Mdl1,'mode','graph');
idx = (X(:,5)>=0.23154 & X(:,27)>=0.999945 & X(:,1)>=0.5);
remainder = X(idx,:);
labels = cell2mat(Y(idx,:));
gscatter(remainder(:,3), remainder(:,(35-6)), labels,'rgb','osd');
limits = [-1.5 1.5];
xlim(limits)
ylim(limits)
xlabel('predictor 3')
ylabel('predictor 29')
hold on
plot([0.73 0.73], limits, '-b')
plot(limits, [0.693 0.693], '-c')
legend({'b' 'g'})
それは並べ替えではないのです。 Xは特徴の行列を表し、Yはクラスラベルの列ベクトルを表す。 ここに簡単な例があります:2つの種類の人がいると仮定しましょう目立つ貪欲な人物5つのリンゴと3つのバナナまたは2つのリンゴと2つのバナナを得ると、最初は幸せになります。バナナや8個のリンゴ、8個のバナナは貪欲です。この場合、トレーニング行列Xは '[5 3]になります。 2 2; 10 9; 8 8]とYは[幸せ幸せ怒り怒り]です。通常、[5 2 10 8] 'と[3 2 9 8]を並べ替えると同じモデルになります – LMarwa
私はあなたのコードを実行すると、かなり似たようなツリーが得られます。私はクラスA = [2 1 2 1]とクラスB = [5 6 5 6]を分けるために(2-5)の間でどこにでも分けることができるので、唯一の違いがあると仮定します。数値ソルバーは真ん中のどこかにあり、正しく分類され、したがって停止します。 –
正常に分類しても、正常に機能の順序と同じモデルを提示する必要はありません。 [2 1 2 1; 5 6 5 6]はY = [A B] 'の訓練行列であるため、[1 1 2 2; 6 6 5 5]同じYのために、正しい? – LMarwa