機械学習で階層/ネストされたデータを処理する方法


29

例で問題を説明します。いくつかの属性(年齢、性別、国、地域、都市)を与えられた個人の収入を予測するとします。あなたはそのようなトレーニングデータセットを持っています

train <- data.frame(CountryID=c(1,1,1,1, 2,2,2,2, 3,3,3,3), 
             RegionID=c(1,1,1,2, 3,3,4,4, 5,5,5,5), 
             CityID=c(1,1,2,3, 4,5,6,6, 7,7,7,8), 
             Age=c(23,48,62,63, 25,41,45,19, 37,41,31,50), 
             Gender=factor(c("M","F","M","F", "M","F","M","F", "F","F","F","M")),
             Income=c(31,42,71,65, 50,51,101,38, 47,50,55,23))
train
   CountryID RegionID CityID Age Gender Income
1          1        1      1  23      M     31
2          1        1      1  48      F     42
3          1        1      2  62      M     71
4          1        2      3  63      F     65
5          2        3      4  25      M     50
6          2        3      5  41      F     51
7          2        4      6  45      M    101
8          2        4      6  19      F     38
9          3        5      7  37      F     47
10         3        5      7  41      F     50
11         3        5      7  31      F     55
12         3        5      8  50      M     23

ここで、City 7に住んでいる新しい人の収入を予測したいとします。私のトレーニングセットには、City 7の人々との3つのサンプルがあります(これが多いと仮定します)。この新しい個人の収入を予測します。

次に、City 2に住んでいる新しい人の収入を予測したいとします。私のトレーニングセットにはCity 2のサンプルが1つしかないため、City 2の平均収入はおそらく信頼できる予測子ではありません。しかし、おそらく地域1の平均収入を使用できます。

この考えを少し外挿すると、トレーニングデータセットを次のように変換できます。

    Age Gender CountrySamples CountryIncome RegionSamples RegionIncome CitySamples CityIncome
 1:  23      M              4         52.25             3        48.00           2    36.5000
 2:  48      F              4         52.25             3        48.00           2    36.5000
 3:  62      M              4         52.25             3        48.00           1    71.0000
 4:  63      F              4         52.25             1        65.00           1    65.0000
 5:  25      M              4         60.00             2        50.50           1    50.0000
 6:  41      F              4         60.00             2        50.50           1    51.0000
 7:  45      M              4         60.00             2        69.50           2    69.5000
 8:  19      F              4         60.00             2        69.50           2    69.5000
 9:  37      F              4         43.75             4        43.75           3    50.6667
10:  41      F              4         43.75             4        43.75           3    50.6667
11:  31      F              4         43.75             4        43.75           3    50.6667
12:  50      M              4         43.75             4        43.75           1    23.0000

したがって、目標は、平均的なCityIncome、RegionIncome、CountryIncomeを何らかの方法で組み合わせながら、それぞれのトレーニングサンプルの数を使用して各値に重み/信頼性を与えることです。(理想的には、年齢と性別からの情報も含まれています。)

このタイプの問題を解決するためのヒントは何ですか?ランダムフォレストや勾配ブースティングのようなツリーベースのモデルを使用することを好みますが、これらをうまく機能させるのに苦労しています。

更新

この問題を解決しようとする人のために、ここで提案されたソリューションをテストするためのサンプルデータを生成しまし


7
階層ベイジアンモデルは、データに記述されている構造を活用するのに非常に自然です。ラドン汚染モデリングの古典的な例をご覧くださいmc-stan.org/documentation/case-studies/radon.html
Vladislavs Dovgalecs

:このKaggle入門チュートリアルの挑戦を見てくださいkaggle.com/c/titanicを。同様の問題、つまり、性別、チケットタイプなど、人に関するさまざまな属性を与えられた人がタイタニック災害を生き延びたかどうかを予測することを扱います。など
ビハリピラトラ16

6
@VihariPiratla入力に感謝しますが、私はタイタニックのデータセットと課題に精通しており、私が尋ねたネストされたデータの問題にどのように関係するのかわかりません。
ベン

これらのモデルにL2 / L1正則化を使用する(たとえば、ロジスティック回帰/ SVMを実行する)のが役立つはずです(貧弱な階層型ベイ)。事実上、係数にペナルティを課します。したがって、係数が大幅に(つまり、大量のデータで)エラーを改善しない限り、ゼロに近い値に設定されます。あなたはpenalisationのレベルを決定するためにクロスバリデーションを使用
seanv507

また、都市9に住んでいる人の収入を予測できるようにしたいですか?
jan-glx

回答:


14

私はこのサイトに関する以下の質問からインスピレーションを得て、この問題についてしばらくの間考えてきました。

最初に、階層的/ネストされたデータの混合効果モデルを紹介し、単純な2レベルモデル(都市内でネストされたサンプル)から始めましょう。番目の都市の番目のサンプルでは、共変量の関数として結果を記述します(性別と年齢を含む変数のリスト)、 ここでは各都市のランダムな切片、です。とが平均0と分散と正規分布に従うと仮定した場合i y i jjiyijxij

yij=f(xij)+ui+ϵij,
uij=1,,niuiϵijσu2σ2、の経験的ベイジアン(EB)推定はここで、我々が扱う場合 OLS(通常最小二乗)の推定値として、次いでEB推定値は0とOLS推定値の重み付き合計であり、重みはサンプルサイズ増加関数です。最終的な予測はここで、ui
u^i=σu2σu2+σ2/ni(y¯i.f(x¯i.)),
y¯i.=1niiniyijf(x¯i.)=1niinif(xij).(y¯i.f(x¯i.))uini
f^(xij)+u^i,
f^(xij)は、線形回帰またはランダムフォレストのような機械学習法による固定効果の推定値です。これは、都市、地域、国の順にネストされたサンプルなど、あらゆるレベルのデータに簡単に拡張できます。ツリーベースの方法以外に、SVMに基づく方法があります。

ランダムフォレストベースの方法については、CRANのMixRF()RパッケージMixRFで試すことができます。


インターセプトがによって変化することが許可されている理由を説明してもらえますが、はすべてのに対して単一のパラメーターセットがありますか?過剰適合を回避するか、問題を扱いやすくすることは、単純化された仮定ですか?ifi
user20160

@ user20160はい、部分を固定効果部分、をランダム効果と呼びます。また、ようなランダムな勾配を持つこともできますが、ランダムな勾配の数を制限する必要があります。構造化されていない場合の変量効果の共分散行列。fuixijui,
ランデル

6

2つの変数と簡単なネストしかない場合、階層ベイズモデルについて言及している他の人のコメントをエコーし​​ます。ツリーベースのメソッドの設定について言及していますが、これには特別な理由がありますか?予測子の数が最小限であれば、線形性は多くの場合有効な有効な仮定であり、モデルの仕様の誤りは残差プロットによって簡単に確認できます。

予測子が多数ある場合、@ Randelが言及したEMアプローチに基づいたRFの例は確かに選択肢になります。私がまだ見たことのないもう1つのオプションは、モデルベースのブースティングを使用することです(Rのmboostパッケージで利用可能)。基本的に、このアプローチにより、さまざまなベース学習器(線形および非線形)を使用して固定効果の関数形式を推定でき、ランダム効果の推定値は、その特定の要因のすべてのレベルに対してリッジベースのペナルティを使用して近似されます。このペーパーは非常に優れたチュートリアルです(ランダム学習の基本学習者については、11ページで説明します)。

サンプルデータを見てみましたが、City、Region、Countryの変量効果変数しか持っていないようです。この場合、予測因子とは無関係に、これらの要因の経験的ベイズ推定値を計算することのみが有用です。それは実際には一般的に最初から始めるのに良い練習かもしれません。より高いレベル(国など)で結果に説明される分散が最小限である可能性があるため、モデルに追加する価値はおそらくないでしょう。


1
mboostパッケージを紹介するための+1 。
ランデル

本当の私が働いているデータは、より多くの私の簡単な例(例えば、非直線性、共依存、欠損値、カテゴリ値、など)によってピックアップされていない現実世界の混乱の多くを追加二つの変数よりもたくさん持っています。私の経験では、ツリーベースの学習者は、現実世界の混乱をすべて処理するのに最高の仕事をします。(XGBoostがKaggleのほぼすべての構造化データコンペティションに勝つ理由があります。) mboostおもしろそう-見てみましょう。ありがとう
ベン

1
私は、そのような状況で木が確かに役立つことができることに同意しました。その場合、@ Randelの提案に固執するのが良い選択肢です。Mboostにはツリーベース学習器もあります。これは、ランダム効果ベース学習器と組み合わせて使用​​すると有用であることがわかります。
-dmartin

3

これは答えというよりもコメントや提案に過ぎませんが、ここで重要な質問をしたいと思います。マルチレベルデータのみを扱う人として、マルチレベルデータを使用した機械学習についてはほとんど発見していないと言えます。しかし、バージニア大学で定量心理学の最近の博士号を取得したダンマーティンは、マルチレベルデータを使用した回帰ツリーの使用に関する論文を発表しました。以下は、これらの目的のために彼が書いたRパッケージへのリンクです。

https://github.com/dpmartin42/mleda/blob/master/README.md

また、あなたは彼の論文をここで見つけることができます:

http://dpmartin42.github.io/about.html


2
参照してくれてありがとう、エリック!私の論文で心に留めておくべきことの1つは、マルチレベルのデータ構造にさらされたときに、フォレストメソッドが「そのまま」実行される方法のみを評価したことです。@Randelが言及した方法は、第3章で文献レビューとして説明されていますが、シミュレーション研究では、主にブライマンの元のアルゴリズムと条件付き推論の木/森を調査しました。
-dmartin

1

RFcluster()Rのgamclassパッケージの関数は、「クラスター化されたカテゴリの結果データを使用して(不器用で非効率的ではあるが)ランダムフォレストを適応させる」。次の例は、ヘルプページからのものですRFcluster

 library(randomForest)
 library(gamclass)
 data(mlbench::Vowel)
 RFcluster(formula=Class ~., id = V1, data = Vowel, nfold = 15,
           tree=500, progress=TRUE, printit = TRUE, seed = 29)

これにより、OOB精度(「バッグ」は個々のスピーカーサンプルのバッグではなく、スピーカーのバッグ)が返されます。


0

metboostを見てみたいと思うかもしれません:Miller PJ et al。metboost:階層的にクラスター化されたデータを使用した探索的回帰分析.arXiv:1702.03994

要約からの引用:階層的にクラスター化されたデータのmetboostと呼ばれるブーストされた決定ツリーへの拡張を提案します。各ツリーの構造をグループ間で同じになるように制約することにより機能しますが、端末ノードは異なることを意味します。これにより、予測子と分割点が各グループ内で異なる予測を導き、非線形グループ固有の効果を近似します。重要なことに、metboostは、欠損値を含む可能性のある数千の観測値と数百の予測値に対して計算上実行可能なままです。

Rパッケージmvtboostに実装されています


1
リンクは死ぬことができるよう、(特にあなたの最初のリンクのため)だけではなく、リンクの参照を提供してください
アントワーヌ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.