分類木のカテゴリカル予測子の分割
複数レベルの予測子の分割における問題
分類木を成長させるときに,多数のレベルがあるカテゴリカル予測子の最適なバイナリ分割を見つけることは,連続予測子の分割を見つける場合より計算が困難です。連続予測子の場合,隣接する2の一意な予測子の値の中間で木を分割できます。一方,L個のレベルがあるカテゴリカル予測子の厳密で最適なバイナリ分割を見つけるには,分類木に対して2l - 1-1通りの分割を検討しなければなりません。この式を得るには,
L個の異なる値を左右のノ,ドに割り当てる方法の数をカウントします。2l通りの方法があります。
左右を交換できるので,2lを2で除算します。
空のノ,ドが含まれるケ,スを除外します。
回帰問題とバ@ @ナリ分類問題では,計算をショ@ @トカットする厳密な探索アルゴリズムが使用されます[1]。分類木では,平均応答(回帰の場合)またはいずれかのクラス確率(分類の場合)によりカテゴリの順序を決定できます。したがって,最適な分割は順序付きリストのl - 1とおりの分割の1になります。したがって,クラスの個数がK≥3であるデータの分類木を成長させる場合のみ,計算が困難になります。
カテゴリカル予測子の分割アルゴリズム
計算を減らすため,適切な分割を見けるヒュリスティックなアルゴリズムがいくか用意されています。fitctree
を使用して分類木を成長させるときや、アンサンブル分類(fitcensemble
)またはマルチクラスecocモデル(fitcecoc
)のtemplateTree
を使用して分類学習器を作成するときに,名前と値のペアの引数“AlgorithmForCategorical”
を使用して,カテゴリカル予測子を分割するアルゴリズムを選択できます。
アルゴリズムを指定しなかった場合,カテゴリカル予測子の既知のクラス数およびレベル数を使用して,最適なアルゴリズムが各分割について選択されます。予測子のレベルがMaxNumCategories
個以下である場合,厳密探索アルゴリズムを使用してカテゴリカル予測子が分割されます。それ以外の場合,クラスとレベルの個数に基づくヒュ,リスティックな探索アルゴリズムが選択されます。MaxNumCategories
の既定のレベルは10です。プラットフォームによっては,レベル数が32または64を超えるカテゴリカル予測子に対する厳密探索を実行できません。
使用できるヒューリスティックアルゴリズムは,純度による左への引き寄せ,主成分ベースの分割,クラス別の1対他です。
純度による左への引き寄せ
純度による左への引き寄せアルゴリズムでは,はじめにL個のカテゴリカルレベルをすべて右の枝に配置します。その後,このアルゴリズムは以下の処理を行います。
各クラスの最大のクラス確率をもkカテゴリを検査します。
分割基準の最大値をもカテゴリを左枝に移動します。
右側の子に1つのカテゴリしか残らなくなるまで左へのカテゴリの移動を続け,各移動の分割基準を記録します。
このシ,ケンスが完了すると,分割基準が最大になる分割が選択されます。
このアルゴリズムを選択するには,fitctree
またはtemplateTree
で“AlgorithmForCategorical”、“PullLeft”
を指定します。
主成分ベ,スの分割
主成分ベ,スの分割アルゴリズム[2]では,分離超平面を探索することにより,L個の予測子のレベルについて最適に近いバイナリ分割を見つけます。超平面は,センタリングされたクラス確率行列の重み付き共分散行列の1番目の主成分に対して垂直になります。
このアルゴリズムは,見つかった主成分とそのカテゴリのクラス確率のベクトル間の内積として計算されるスコアを各Lカテゴリに割り当てます。その後,分割基準が最大になるl - 1個の分割のうの1が選択されます。
このアルゴリズムを選択するには,fitctree
またはtemplateTree
で“AlgorithmForCategorical”、“主成分分析的
を指定します。
クラス別の1対他
クラス別の1対他アルゴリズムでは,はじめにL個のカテゴリカルレベルをすべて右の枝に配置します。K個のクラスそれぞれにいて,そのクラスの確率に基づいてカテゴリの順序が設定されます。
1番目のクラスにいて,各カテゴリを順番に左の枝に移動し,各移動で分割基準を記録します。その後,このプロセスを残りのクラスにいて繰り返します。このシ,ケンスが完了すると,分割基準が最大になる分割が選択されます。
このアルゴリズムを選択するには,fitctree
またはtemplateTree
で“AlgorithmForCategorical”、“OVAbyClass”
を指定します。
複数レベルのカテゴリカル予測子をもデタの調査
この例では,多数のレベル(カテゴリ)をもつカテゴリカル予測子が含まれているデータセットを調べる方法と,分類用のバイナリ決定木に学習をさせる方法を示します。
標本デ,タの読み込み
census1994
ファ@ @ルを読み込みます。このデータセットは,個人の年収が50000美元を超えるかどうかを予測するための,米国勢調査局の人口統計データから構成されいます。変数名が格納されている文字ベクトルのcell配列を指定します。
负载census1994VarNames = adultdata.Properties.VariableNames;
表格adultdata
内の変数には,名前に_
という文字が含まれているものがあります。_
を空白に置き換えます。
VarNames = strrep(VarNames,“_”,' ');
予測子デ,タ资源描述
と応答ベクトルY
を指定します。
TBL = adultdata(:,1:end-1);Y = categorical(adultdata.salary);
カテゴリカル予測子の調査
一部のカテゴリカル変数には,多数のレベル(カテゴリ)が含まれています。各カテゴリカル予測子のレベルの個数をカウントします。
varfun
とisnumeric
を使用して,表资源描述
内の数値ではないカテゴリカル予測子の@ @ンデックスを求めます。関数varfun
は,表资源描述
の各変数に関数isnumeric
を適用します。
Cat = ~varfun(@isnumeric,tbl,“OutputFormat”,“统一”);
元素个数
と类别
を使用してカテゴリカル予測子内のカテゴリの個数をカウントする無名関数を定義します。
countNumCats = @(var)numel(categories(categorical(var)));
無名関数countNumCats
は予測子を分类配列に変換し,予測子の空でない一意なカテゴリをカウントします。
varfun
とcountNumCats
を使用して,资源描述
内のカテゴリカル予測子のカテゴリの個数をカウントします。
numCat = varfun(@(var)countNumCats(var),tbl(:,cat),“OutputFormat”,“统一”);
各カテゴリカル予測子のカテゴリの個数をプロットします。
图barh (numCat);H = gca;. yticklabel = VarNames(cat);ylabel (“预测”)包含(“类别数量”)
モデルの学習
バイナリ分類の場合,多数のカテゴリをもつカテゴリカル予測子の最適な分割を見つけるために,計算のショートカットが使用されます。クラス数が2を超える分類の場合,fitctree
またはtemplateTree
の名前と値のペアの引数AlgorithmForCategorical”
を使用して,適切な分割を見つけるための厳密なアルゴリズムまたはヒューリスティックなアルゴリズムを選択できます。既定では,カテゴリカル予測子の既知のクラス数およびレベル数を使用して,各分割について最適なアルゴリズムのサブセットが選択されます。
资源描述
とY
を使用して,分類木に学習をさせます。応答ベクトルY
には2つのクラスが含まれているので,カテゴリカル予測子の分割には厳密なアルゴリズムが使用されます。
Mdl = fitctree(tbl,Y)
Mdl = ClassificationTree PredictorNames: {1x14 cell} ResponseName: 'Y' CategoricalPredictors: [2 4 6 7 8 9 10 14] ClassNames: [<=50K >50K] ScoreTransform: 'none' NumObservations: 32561 Properties, Methods
参照
[1]布雷曼,L. J. H.弗里德曼,R. A.奥尔申和C. J.斯通。分类和回归树。佛罗里达州博卡拉顿:查普曼和霍尔,1984年。
[2]铜史密斯D., S. J.洪,J. R. M.霍斯金。“在决策树中划分名义属性”数据挖掘与知识发现,Vol. 3, 1999, pp. 197-217。
参考
fitctree
|fitcensemble
|templateTree
|fitrtree