10

記事のセクション 3.4 で、著者は、ツリーの成長に最適な分割候補を検索するときに欠損値を処理する方法を説明しています。具体的には、これらのノードのデフォルトの方向を作成し、分割機能として、現在のインスタンス セットに値が欠落している方向を作成します。予測時に、予測パスがこのノードを通過し、特徴値が欠落している場合、デフォルトの方向に従います。

ただし、特徴値が欠落しており、ノードにデフォルトの方向がない場合、予測フェーズは崩壊します (これは多くのシナリオで発生する可能性があります)。言い換えれば、トレーニング時に設定されたアクティブなインスタンスに行方不明のない分割機能がある場合でも、デフォルトの方向をすべてのノードにどのように関連付けるのでしょうか?

4

3 に答える 3

15

xgboost存在しない場合でも、常に欠損値の分割方向を考慮してトレーニングします。デフォルトはyes分割基準の方向です。次に、トレーニングに存在するかどうかが学習されます

作者 リンクより

ここに画像の説明を入力

これは、次のコードで確認できます

    require(xgboost)

    data(agaricus.train, package='xgboost')

    sum(is.na(agaricus.train$data))
    ##[1] 0  

    bst <- xgboost(data = agaricus.train$data, 
                       label = agaricus.train$label, 
                       max.depth = 4, 
                       eta = .01, 
                       nround = 100,
                       nthread = 2, 
                       objective = "binary:logistic")

dt <- xgb.model.dt.tree(model = bst)  ## records all the splits 

> head(dt)
     ID Feature        Split  Yes   No Missing      Quality   Cover Tree Yes.Feature Yes.Cover  Yes.Quality
1:  0-0      28 -1.00136e-05  0-1  0-2     0-1 4000.5300000 1628.25    0          55    924.50 1158.2100000
2:  0-1      55 -1.00136e-05  0-3  0-4     0-3 1158.2100000  924.50    0           7    679.75   13.9060000
3: 0-10    Leaf           NA   NA   NA      NA   -0.0198104  104.50    0          NA        NA           NA
4: 0-11       7 -1.00136e-05 0-15 0-16    0-15   13.9060000  679.75    0        Leaf    763.00    0.0195026
5: 0-12      38 -1.00136e-05 0-17 0-18    0-17   28.7763000   10.75    0        Leaf    678.75   -0.0199117
6: 0-13    Leaf           NA   NA   NA      NA    0.0195026  763.00    0          NA        NA           NA
   No.Feature No.Cover No.Quality
1:       Leaf   104.50 -0.0198104
2:         38    10.75 28.7763000
3:         NA       NA         NA
4:       Leaf     9.50 -0.0180952
5:       Leaf     1.00  0.0100000
6:         NA       NA         NA

> all(dt$Missing == dt$Yes,na.rm = T)
[1] TRUE

ソースコード https://github.com/tqchen/xgboost/blob/8130778742cbdfa406b62de85b0c4e80b9788821/src/tree/model.h#L542

于 2016-06-03T20:40:50.183 に答える
2

アルゴリズムについての私の理解では、トレーニング時に欠損データが利用できない場合、デフォルトの方向はトレーニング データの分布に基づいて確率論的に割り当てられるということです。すなわち。トレーニング セット内のサンプルの大部分を使用して、その方向に進んでください。実際には、データセットに欠落データがあるのは悪い考えだと思います。一般に、データ サイエンティストが GBM アルゴリズムをトレーニングする前にデータ セットアップを適切にクリーンアップすると、モデルのパフォーマンスが向上します。たとえば、すべての NA を平均値/中央値に置き換えるか、K 個の最近傍を見つけて値を代入し、その機能の値を平均してトレーニング ポイントを代入します。

また、トレーニングではなくテスト時にデータが欠落している理由についても疑問に思っています。これは、データの分布が時間とともに進化していることを示しているようです。ニューラルネットのように、新しいデータが利用可能になったときにトレーニングできるアルゴリズムは、ユースケースでより適切に機能する可能性があります。または、常に専門のモデルを作成することもできます。たとえば、欠落している機能がモデルのクレジット スコアであるとします。一部の人々は、あなたが自分のクレジットにアクセスすることを承認しない可能性があるため. クレジットを使用して 1 つのモデルをトレーニングし、クレジットを使用しないモデルをトレーニングしてみませんか。クレジットを除外してトレーニングされたモデルは、他の相関する機能を使用することで提供されていたリフト クレジットの多くを取得できる可能性があります。

于 2016-06-03T15:49:28.123 に答える
0

@Josiah さん、ご意見をお寄せいただきありがとうございます。はい、データセット内のデータの欠落を回避する方がよいというあなたの意見に完全に同意しますが、それらを置き換えることが最適なソリューションではない場合もあります。また、それらに対応できるGBMなどの学習アルゴリズムがあれば、試してみてはいかがでしょうか。私が考えているシナリオは、欠落がほとんどない (<10%) またはそれ以下の機能がある場合です。

2 番目の点に関して、私が念頭に置いているシナリオは次のとおりです。ツリーはすでにある程度の深さまで成長しているため、インスタンス セットは完全ではありません。新しいノードの場合、最適な候補は、元はいくつかの欠落を含んでいるが、現在のインスタンス セットには含まれていない機能fの値であることがわかります。そのため、デフォルト ブランチは定義されません。したがって、トレーニング データセットにfの欠落が含まれている場合でも、このノードには既定の分岐がありません。ここに落ちるテストインスタンスはスタックします。

おそらくあなたの言う通りで、欠落がない場合、デフォルトのブランチはより多くの例があるブランチになります。著者に連絡を取り、返信があればここに投稿します。

于 2016-06-03T17:01:06.090 に答える