スパースな予測子と応答を使用するCARTのようなメソッドに使用できるライブラリはありますか?


11

私は、Rのgbmパッケージを使用していくつかの大きなデータセットを処理しています。予測子行列と応答ベクトルの両方がかなりスパースです(つまり、ほとんどのエントリがゼロです)。ここで行っように、この疎性を利用するアルゴリズムを使用して決定木を構築したいと思っていました。その論文では、私の状況と同様に、ほとんどのアイテムは多くの可能な機能のほんの一部しか持っていないため、データで明示的に示されていない限り、アイテムに特定の機能がないと想定することで、多くの無駄な計算を回避できました。私の希望は、この種のアルゴリズムを使用して同様の高速化を実現できることです(そして、予測精度を向上させるために、ブースティングアルゴリズムをラップします)。

彼らは自分のコードを公開していないようだったので、この場合に最適化されたオープンソースのパッケージまたはライブラリ(任意の言語)があるかどうか疑問に思っていました。理想的には、RのMatrixパッケージからスパース行列を直接取得できるものを望みますが、取得できるものは取得します。

私は周りを見回しました、そしてこの種のものはそこにあるはずです:

  • 化学者はこの問題に頻繁に遭遇するようです(上でリンクした論文は、新しい薬物化合物を見つけることを学ぶことに関するものでした)。ただし、そのうちの1つを転用することもできます。

  • ドキュメント分類は、スパースフィーチャスペースからの学習が役立つ領域でもあるようです(ほとんどのドキュメントにはほとんどの単語が含まれていません)。たとえば、このペーパーでは、C4.5(CARTのようなアルゴリズム)のスパース実装への斜めの参照がありますが、コードはありません。

  • メーリングリストによると、WEKAはスパースデータを受け入れることができますが、上記でリンクした論文の方法とは異なり、WEKAはCPUサイクルの浪費を回避するという点で実際にそれを利用するように最適化されていません。

前もって感謝します!


2
Rではありませんが、Python scikits.learnはスパース行列のサポートを拡大しています。
2011年

@ ch1ありがとう。彼らはまだツリーメソッドを追加していないようです。 誰かが実装取り組んでいますが、スパースデータを使用できるかどうかはわかりません。ただし、まばらなSVMメソッドは必ず念頭に置いておきます。
デビッドJ.ハリス

「CARTのような」と言うとき、決定木または何らかの予測モデルが特に必要ですか?
マイケルマッゴーワン

@Michael-ブースティング手順にそれらを供給していて、それらに高い分散があるので、木が欲しいです。
David J. Harris

2
ツリーモデルについては知りませんがglmnete1071::svmどちらもスパースMatrixオブジェクトをサポートしています。 GAMboostそしてGLMboost(パッケージからGAMboost)同様に可能性があります。
Zach

回答:


2

rfで使用される最新のCART実装に対するスパース実装のベンチマークを確認してください。この論文は、この分野での進歩という点ではかなり古く、それでも大幅な速度向上が得られたとしたら驚きます。

その理由の一部は、分割検索でQuicksortのような賢いソートアルゴリズムを使用すると、ほぼ一定の機能(スパースな機能を含む)に対してほぼO(n)のパフォーマンスを提供できるためです。高速実装では、ツリーのブランチ内で機能が一定になり、検査する必要がなくなる時期も追跡します。密な機能の表現は、CPUキャッシュにやさしい方法で高速なルックアップを提供するため、CPUサイクルで勝つには、本当に賢い疎な表現が必要です。

これはここここここここで議論さます

私は実際に、rfパッケージCloudForestのある時点でデータのスパースデータ表現を実装しましたが、データの密な表現よりも遅いことがわかり、メモリ上の利点はありましたが、それを放棄しました。

私の推奨は、scikitの学習またはブースト機能に組み込まれたcloudforestを試して、それが十分に高速かどうかを確認することです。標準ではないことをしたい場合は、両方をカスタムのブースティング基準で拡張できます。(私は実際には、あなたが説明しているものと非常によく似た、大規模で高次元の遺伝データセットを扱うために、もともとcloudforestを書きました)。


1

たぶん、それを利用するコードの可能性はほとんどありません-自分で何かを書く必要があるでしょう。
ただし、もう1つのオプションは、データを変換してデータのサイズを縮小し、冗長な情報を削除することです。データに関する情報がないと、どのように判断するのは難しいですが、重複していないことがわかっている機能、PCAの一部、または一部の記述子の表現を変更できる機能をマージできますか?また、応答がまばらであると言う場合、応答で0のオブジェクトをダウンサンプリングするのが妥当でしょうか?


返信いただきありがとうございます。ダウンサンプリングは興味深いアイデアのように聞こえます。現在、私は他の理由でデータのいくつかの側面の重み付けを減らしていますが、それも良い考えかもしれません。しかし、なぜこれのためのコードが存在する可能性が低いと言うのですか?同じ問題に取り組んだと思われる12年前の論文にリンクしました。
デビッドJ.ハリス

@David要するに、私はこれは意味をなさないと感じています-これは「間違った質問」の問題です。スパース性は、データが非常に最適ではない形式であることを示しています。はるかに効果的なアプローチは、データを変換しようとすることです。リンクした論文はもう少し問題があります。

あなたの言っていることが理解できません。データの形式を変換することはまさに私がやりたいことであり、私が知る限り、それはまさにこのペーパーが行うことです。彼らは、各化学物質に欠けていたすべての機能をリストするのではなく、それが持っている機能のみをリストしました。私の場合と同じように、ほとんどの化学物質にはほとんどの機能がないため、これは彼らの状況では理にかなっています。そのため、機能をスパースマトリックスに変換し、そのスパースマトリックスで再帰的な分割アルゴリズムを直接変換しました。私のデータで同じことを行うためのオープンソースの方法を探しています。何が欠けていますか?ありがとう
デビッドJ.ハリス

@David、私はmbqのポイントは、大きな1-of-nコーディング(たとえば、ウェブサイト/顧客などの識別子)または存在する化学物質のリスト)は、学習にとって非常に悪い表現であると思います。「機能」に変更するほうがよいです。たとえば、Webサイトの場合は、カテゴリ化されている可能性があります。ショップ/ニュース/ブログスポーツ/テクノロジーなど
seanv507

1

Rでcaretパッケージを見たことがありますか?それはそれは簡単なよう再帰的分割のためのいくつかを含め、さまざまなモデルを、使用することができますインターフェイスを提供しrpartctreeそしてctree2


私はそれらのパッケージ/関数に精通しており、私が知る限り、それらのどれもスパースデータで動作しません。
David J. Harris

1
Matrixオブジェクトのキャレットサポートはすばらしいですが、現在は存在しません。すべてがdata.frameに強制変換されます。
Zach

あなたは開発者にメールを送って、これについて彼に尋ねることを試みるかもしれません。私は彼に何か他のことをメールしました、そして彼は役に立つ答えを提供しました-max.kuhn [at] pfizer.com
ポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.