質問

私は、決定ツリー/ランダムフォレストの適用についていくつかの問題を抱えています。私は、機能として数字と文字列(国名など)を備えた問題を適合させようとしています。今図書館、 Scikit-Learn 数字のみをパラメーターとして取得しますが、文字列を注入するだけでなく、かなりの量の知識を掲載したいと思います。

そのようなシナリオをどのように処理しますか?

Pythonでのハッシュなど、いくつかのメカニズムによって文字列を数字に変換できます。しかし、私は決定ツリーの問題で文字列がどのように処理されるかについてのベストプラクティスを知りたいと思います。

役に立ちましたか?

解決

確立された機械学習システムのほとんどでは、カテゴリ変数が自然に処理されます。たとえば、Rでは要因を使用します。Wekaでは、名目変数を使用します。これは、Scikit-Learnではそうではありません。 Scikit-Learnで実装された決定ツリーは数値的特徴のみを使用しており、これらの機能は常に次のように解釈されます 連続数値変数.

したがって、単に文字列をハッシュコードに置き換えることを避ける必要があります。なぜなら、使用するコーディングが連続的な数値機能と見なされると、データに単に存在しない順序が誘発されるためです。

1つの例は、['red'、 'green'、 'blue']を[1,2,3]でコーディングすることです。「赤」が「青」よりも低く、平均「赤」のような奇妙なものが生成されます。そして、「青」で「緑」が得られます。 [1,2,3]で['low'、 'medium'、 'high']をコーディングすると、もう1つのより微妙な例が発生する可能性があります。後者の場合、理にかなっている順序があるかもしれませんが、「低」と「高」の中央にない「中」が「中」に起こると、いくつかの微妙な矛盾が発生する可能性があります。

最後に、あなたの質問に対する答えは、カテゴリの特徴をにコーディングすることにあります 複数のバイナリ機能. 。たとえば、['red'、 'green'、 'blue']を3つの列でコーディングする場合があります。1つはカテゴリごとに1つ、カテゴリが一致するときは1つ、それ以外の場合は0があります。これは呼ばれます 1ホットエンコード, 、バイナリエンコーディング、of-of-k-encodingなど。ここでドキュメントを確認できます カテゴリ機能のエンコード特徴抽出 - ハッシュとdicts. 。明らかに、1ホットエンコードはスペース要件を拡大し、パフォーマンスも損なう場合があります。

他のヒント

SCI-KitがMLアルゴリズムに使用できる数値機能として、文字列をエンコードする必要があります。この機能は、プリプロセシングモジュールで処理されます(例を参照 sklearn.preprocessing.labelencoder 例として)。

通常はそうする必要があります ワンホットエンコード ランダムフォレストを含むScikit-Learnモデルのカテゴリ変数。ランダムフォレストは、多くの場合、1ホットのエンコードなしで問題なく動作しますが、通常、1ホットのエンコードを行うとパフォーマンスが向上します。このコンテキストでは、1ホットのエンコードと「ダミー」変数は同じことを意味します。 Scikit-Learnは持っています sklearn.preprocessing.onehotencoder そしてパンダは持っています pandas.get_dummies これを達成するために。

ただし、代替手段があります。記事 Kdnuggetsの「1ホットを超えて」 カテゴリ変数と1ホットのエンコーディングの代替をエンコードする必要がある理由を説明する素晴らしい仕事をしています。

RやH2Oなどの1ホットのエンコードを必要としないランダムフォレストの代替実装があります。 Rの実装はです 計算的に高価です機能に多くのカテゴリがある場合、機能しません. 。 H2Oは、多数のカテゴリで動作します。 Continuumが作成しました Anaconda Pythonで利用可能なH2O。

あります Scikit-Learnをカテゴリー機能を直接処理するための継続的な努力.

この記事 H2Oで使用されているアルゴリズムの説明があります。アカデミックペーパーを参照します ストリーミング並列決定ツリーアルゴリズム そしてa より長いバージョン 同じ紙の。

2018アップデート!

カテゴリ変数のための埋め込み(密なベクトル)スペースを作成できます。皆さんの多くは、Word2VecとFastextに精通しており、意味のある密なベクトル空間に単語を埋め込みました。ここで同じアイデア - あなたのカテゴリ変数は、何らかの意味を持つベクトルにマッピングされます。

から グオ/ベルカーン紙:

エンティティは、メモリの使用量を削減し、1ホットのエンコーディングと比較してニューラルネットワークを高速化するだけでなく、埋め込み空間で互いに近い類似の値をマッピングすることにより、カテゴリ変数の固有の特性を明らかにすることです。最近のKaggleコンペティションで正常に適用し、比較的単純な機能で3番目のポジションに到達することができました。

著者らは、このようにカテゴリ変数を表すことで、ランダムフォレストを含むテストされたすべての機械学習アルゴリズムの有効性が改善されることを発見しました。

最良の例はあるかもしれません Pinterestのテクニックの適用 関連するピンをグループ化する:

enter image description here

Fastaiの人々はカテゴリの埋め込みを実装し、とても素敵なものを作成しました ブログ投稿 仲間と デモノートブック.

追加の詳細と説明

ニューラルネットは、埋め込みを作成するために使用されます。つまり、各カテゴリ値にベクトルを割り当てます。ベクトルを取得したら、数値を受け入れるモデルでそれらを使用できます。ベクトルの各コンポーネントは入力変数になります。たとえば、3Dベクターを使用して色のカテゴリリストを埋め込んだ場合、Red =(0、1.5、-2.3)、Blue =(1、1、0)などのようなものが得られる場合があります。 3つのコンポーネントに対応するランダムフォレストの入力変数。赤いものの場合、C1 = 0、C2 = 1.5、およびC3 = -2.3。青いものの場合、C1 = 1、C2 = 1、およびC3 = 0。

あなたは実際にはありません 必要 ニューラルネットワークを使用して埋め込みを作成するには(ただし、テクニックから遠ざかることはお勧めしません)。可能であれば、手または他の手段で独自の埋め込みを自由に作成できます。いくつかの例:

  1. 色の色をRGBベクターにマップします。
  2. LAT/LONG VECTORSへの場所をマップします。
  3. 米国の政治モデルでは、都市を左/右のアライメント、税負担などを表すいくつかのベクターコンポーネントにマッピングします。

このようなシナリオでは、ダミー変数を使用できます。パンダと panda.get_dummies 決定ツリーまたはランダムフォレストに入れたい文字列のダミー変数を作成できます。

例:

import pandas as pd
d = {'one' : pd.Series([1., 2., 3.,4.], index=['a', 'b', 'c','d']),'two' :pd.Series(['Paul', 'John', 'Micheal','George'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

df_with_dummies= pd.get_dummies(df,columns=["two"],drop_first=False)
df_with_dummies

たとえば、ユニークな国のassingnユニークな数字(1,2,3、...など)の場合、数字に変換します。

あなたも しないでください 使用する必要があります ワンホットエンコーディング (別名ダミー変数)ランダムフォレストで作業する場合、木は他のアルゴリズム(線形/ロジスティック回帰など)のように機能しないため、遠くに動作しません(それらはあなたの機能に適した分割を見つけることに取り組んでいます) 必要なし 1ホットのエンコーディング用

ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top