ランダムフォレストモデルの最新データの重み付け


14

6つのカテゴリを区別するために、ランダムフォレストで分類モデルをトレーニングしています。私のトランザクションデータには、約60k +の観測値と35の変数があります。これがおおよそどのように見えるかの例を次に示します。

 _________________________________________________
|user_id|acquisition_date|x_var_1|x_var_2| y_vay  |
|-------|----------------|-------|-------|--------|
|111    | 2013-04-01     | 12    | US    | group1 |
|222    | 2013-04-12     | 6     | PNG   | group1 |
|333    | 2013-05-05     | 30    | DE    | group2 |
|444    | 2013-05-10     | 78    | US    | group3 |
|555    | 2013-06-15     | 15    | BR    | group1 |
|666    | 2013-06-15     | 237   | FR    | group6 |

モデルが作成されたら、過去数週間の観測値を記録したいと思います。システムに変更が加えられたため、最近の観測値は、私が予測したい現在の観測値の環境により近くなります。したがって、ランダムフォレストが最近の観測をより重視するように、重み変数を作成します。

RのrandomForestパッケージが観測ごとの重みを処理できるかどうかは誰にもわかりますか?

また、重み変数を作成するための適切な方法を教えてください。たとえば、私のデータは2013年のものなので、日付から月の数を重みとして使用できると考えていました。誰でもこの方法に問題がありますか?

事前に感謝します!


スタックオーバーフローに関する質問の投稿を検討してください。彼らは実装の問題であなたをもっと助けます。このサイトの焦点は、より理論に基づいています。
アレックスウィリアムズ14年

私の執筆ではおそらく十分に明確ではありませんが、私の質問は実装の問題に関するものではありません。たとえば、重み変数の作成について尋ねている部分では、Rのどのコマンドがそれを助けてくれるかを尋ねるつもりはありません。それによって、ランダムフォレストの仮定のいずれかに違反するのではないかと単純に思っていました。
ニコライネノフ14年

1
答えはノーです、私は信じています。以下の回答で説明したように、異なるグループに重みを割り当てることができます。私はこれがあなたが興味を持っているものではないことを理解していますが、それは同様の考えです。私が提案するように、重複する観測を使用してみてください。
アレックスウィリアムズ14年

回答:


5

比較的新しいrangerR のパッケージ(pdf)がこれを行います。ランダムフォレストのレンジャー実装には、case.weights個別のケース/観測値の重みを持つベクトルを取る引数があります。


きちんとした!私が探していた解決策のような継ぎ目。case.weightsの確率の計算方法の詳細へのリンクはありますか?
ニコライネノフ

1
私は彼らが確率をどのように計算するか100%は確信していません-しかし、あなたが始めたいなら、この論文を見てください:Malley、JD、Kruppa、J.、Dasgupta、A.、Malley、KG、およびZiegler 、A。(2012)。確率機械:ノンパラメトリック学習機械を使用した一貫した確率推定。方法Inf Med 51:74-81。dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries

7

データをリサンプリングして、より新しいデータポイントを過剰に表すことができます。とにかくRfにはサンプルと置換のステップが含まれ、アンバランスクラスの「大まかにバランスの取れたバギング」はサンプリングを使用してマイノリティクラスを過剰に表し、私の経験ではクラスウェイトランダムフォレストと同等以上の結果を生成します。

バギング中ではなく、トレーニングマトリックス(reference)を構築するレベルでリサンプリングして実装を容易にすることもできますが、その場合は何度も繰り返すことをお勧めします。

内部的には、scikit-learnを含むランダムフォレストのいくつかの実装では、実際にサンプルの重みを使用して、各サンプルがバッグに入れられている回数を追跡します。これは、相互検証で、バギングレベルでのオーバーサンプリングと同等で、トレーニングレベルでのオーバーサンプリングに近いはずです


4

「classwt」パラメーターを調べる必要があります。これはあなたが直接興味を持っていることではないようですが、あなたがやりたいことの感覚をあなたに与えるかもしれません。

こちらをご覧ください:Stack Exchangeの質問#1

そしてここ:Stack Exchangeの質問#2

重み付きランダムフォレストに関する記事:PDF

基本的な考え方は、めったに観察されないグループ/分類がブートストラップサンプルで選択される可能性が高くなるようにクラスに重みを付けることです。これは不均衡なデータに役立ちます(異なるクラスの事前確率が大きく異なる場合)。

似たようなことをしたいのですが、最近のイベント(特定のグループ/分類ではない)にしたいようです。これを行う簡単な方法は、最近の観測値に対して重複する観測値を作成することです(つまり、同じ行を繰り返し配置します)。ただし、これは潜在的に非効率的です。Rの各観測値を直接重み付けする方法はわかりませんが、気づかない可能性があります。

Cなどの代替実装を探してみてください。最悪の場合、これらは少しのコーディングでカスタマイズできます。


1
リンクをありがとう、アレックス。このペーパーでは、分類器に重みを付けたい場合の良い例を示しています。ただし、分類子の重み付け以外に「classwt」パラメータを使用できないため、これは機能していません。つまり、クラスごとに1つの重みが必要です。そうでない場合、randomForestはエラーを返します。
ニコライネノフ14年

1
はい、「classwt」を直接使用できるとは思わない。「observationweights」のようなパラメータが必要ですが、存在するとは思いません。
アレックスウィリアムズ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.