🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

2回答

7257閲覧

random forestが疎な特徴でうまくいかない理由

nouken

総合スコア369

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/10/02 08:27

編集2019/10/02 08:36

色々調べていると特徴量が高次元で疎な場合はrandom forestなどの木系モデルはうまくいかないことが多く、NNなどを検討した方が良いということを知ったのですが、理由がよくわかりません。

というのも、密でも疎でも、その特徴がそのタスクに有用ならばその特徴で分岐するし、そうじゃないなら分岐しないのでは、と感じているのですが、何か誤解してますでしょうか?

具体的に言えば、例えば100000行のデータがあって、ある特徴量のうち、100行のみが値を持ちそれ以外は0とします。このような場合でも、仮にこの100行の目的変数が十分にその他と異なれば、問題なく分岐されますよね。

(なお、cardinarityが低い特徴が連続値などに比べて重要度が低くなる傾向があることについては理解しています)

*もしこれについて説明している論文、サイトなどご存知なら教えて頂けると幸いです。自分が探した範囲では見つけられませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/10/02 10:54

これだけだと厳しいので、出典を教えて下さい。調べた範囲ではpythonではじめる機械学習にはそういう記述があるようですが、本文を確認していないのでよくわかりません(近日中に確認してみます)
guest

回答2

0

ベストアンサー

一概にそうも言えない気がします。高次元・スパースの程度によるかもしれません。
(たとえば1000次元で1割埋まってるくらいならランダムフォレスト最強かもしれません。タスクによってはそういうことがあります)

それはそれとして、10^4を超えるような高次元スパースデータでランダムフォレスト(と、それ以外の決定木系モデル)を使うのは、あまり良くないかもしれません。


具体的に言えば、例えば100000行のデータがあって、ある特徴量のうち、100行のみが値を持ちそれ以外は0とします。このような場合でも、仮にこの100行の目的変数が十分にその他と異なれば、問題なく分岐されますよね。

これには何通りかの答え方が考えられます。

1.その「ある特徴量」が選ばれさえすれば、という注釈つきで真

木一本で使う特徴量の数の推奨パラメータは典型的にはsqrt(n_features)sklearnの設定)などですから、10^5次元として木一本あたり316くらいの特徴量しか選ばれません。300本の木を作ればぜんぶ入るだろうという考え方もありますが、重複ありランダムサンプリングなので実際にはもっとたくさん要りますね(参考になりそうなもの)。どこかで木が多すぎて使い物にならなくなるでしょう。

まあでも、使う特徴量の数は任意に設定できますから、そうすれば良いのかも知れません。
(ン千も特徴量を入れた決定木がうまく動いてくれる保証はどこにもないが……)

2.「100000行のデータがあって、ある特徴量のうち、100行のみが値を持ち」ってことは、その特徴量でどれだけ頑張っても0.1%のサンプルどうこうという話にしかならない

具体例を示して考えます。

単純に2クラス分類としましょう。ある特徴量が「出現」してたらクラスAの確率が90%くらい、「出現」していなかったらクラスAとクラスBで半々の確率という設定にします。

「出現」してくれた100サンプルはかなりの高確率でクラスAなので万々歳です。しかし、残り99900サンプルに関してはその特徴量では情報は得られなかったことになります。

要するに、スパースな(出現頻度の低い)変数ばかりだと、各変数の寄与がとても小さくなります。決定木の仕組み上、これをなんとかしようと思うとどんどん木を深くするしかないので、計算効率が悪いとか過学習するとかいろいろ問題があると思います。

投稿2019/10/02 11:25

編集2019/10/02 11:27
hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nouken

2019/10/02 12:45

回答ありがとうございました。分岐の条件が全データについての平均の不純度低下量であることちょっとうっかりしていました。スパースな特徴だと、仮に値が出現する行についての情報を与えても、全体としてみると与える情報量が少ないため選ばれにくい(寄与が小さくなりがち)ということですね。したがってこれらの変数が使われうるのは、木の深い部分でデータが少なくなったときということで。ただこれはスパースな分過学習の原因にもなりうると。 こういう場合どのような対処をするものなんでしょうね。NNとかを使え、と言われそうですが。one hot encodingしてあまりにスパースなものは削ってしまうとか、target encodingなど他のcategory encoding手法を検討するとかでしょうか。
hayataka2049

2019/10/02 13:33

・スパースすぎる特徴を落とす タスクによります。スパースでない部分の特徴で十分できるタスクならそれでも良いです。 ・低ランク近似する 主成分の次元削減とかも含まれます。ただ、ぶっちゃけ個人的には(固有ベクトルを使ったりするような)次元削減手法は機械学習の前処理としてはそこまで良い印象はありません。 ・線形モデルにする ロジスティック回帰とか、線形SVMとか、単語文書行列なら多項ナイーブベイズとか。 線形ではないけどそれに近いものとして、汎化性能重視のパラメータにチューニングしたrbfカーネルのSVM、中間層少なめ(1層で10ユニットとか)のNNなどがあります。
hayataka2049

2019/10/02 13:51

これはアバウトというか経験的なことなので話半分程度に読んでいただきたいのですが、高次元データに対しては線形モデルでも特徴量の数だけパラメータがあるので、とても複雑なモデルを使っていることになります。また、おそらく球面集中現象なども関係して、高次元の問題はだいたいlinear separableになります。 非線形モデルを使っても過学習したりしてあまりいいことはないので、線形モデルで、更に正則化などがかかって各特徴量の効果をまともに見積もれるようなものが向いています。
nouken

2019/10/02 14:00

ついつい木系のモデルとかdeepとかやってしまいがちなんですが、状況に応じてロジスティック回帰など古典的な手法も試してみたいと思います。ありがとうございました!
guest

0

random forestは木が分岐に使う変数を乱数に基づいて決めるから,
有効な変数が極端に少ない場合,分岐にその変数が採用される確率が低い→まともな決定木が生成される確率が低い
的な話でしょうか.

投稿2019/10/02 10:10

fana

総合スコア11987

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nouken

2019/10/02 10:30

回答ありがとうございます。自分の理解では、木に使う変数はランダムですが、分岐に使われる変数は不純度をもっとも下げるものが選ばれるはずで、feature_fractionを0.8などに設定したとしても、多くの場合、有用な特徴は候補に入っているはずで、それならば疎か密かに関わらず有用なものが選ばれるのでは?と考えているのですが、どうでしょうか?
fana

2019/10/03 01:12

RandomForestは画像認識用にゼロから実装した経験があるだけなので,他の一般(?)用途での話にはちょっと疎いのですが… 木の各分岐に使う特徴を決定する際は「使える全特徴N個のうちのn個をランダムで選択し,その中で最もサンプルをよく分類できる特徴を選択する」という話なので, (本件の話のように有用な特徴の個数が少ない場合だと) Nに対してnが非常に小さいとき,有用な特徴が候補に選ばれる率は非常に低くなり,結果として無意味な分類を行うだけのノードがひたすら生成されると覆います. Nに対してのnが十分に大きい(極端な話,N=n)ならば,有用な特徴が候補に入ってきてそれが選ばれることになりそうですが,それだと複数の木がみんな似通ったものになりそうな気がするので,RandomForestを使う意義が薄れそうに思います.
nouken

2019/10/03 03:45

若干議論がずれましたが、元々の質問の意図は全体の行数の中で値をもつ行が少ないような変数がなぜrandom forestでは好まれないのはなぜか、というもので、そのような変数は全体の平均としてみると与える情報が少ないからということで理解できました。でなぜ、こういう疑問を持ったのかと言えば、randomfoestではなくGBDT系の手法では各木に使われる変数の割合がデフォルトで1(全部)とかなので、じゃあ選ばれるのでは?と思ってましたが、結局は上の議論のように私が誤解しておりました。 結論としては、こういった特徴は有用な変数になりにくく過学習等に繋がりかねないため、線形モデルなどの’利用を検討した方がよいようです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問