web-dev-qa-db-ja.com

pythonを使用してonehotencoderを説明する

私はscikit-learnライブラリーを初めて使用し、株価を予測するためにこれをいじってみました。私はそのドキュメントを調べていて、OneHotEncoder()を説明する部分で行き詰まりました。ここに彼らが使用したコードがあります:

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9])
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

誰かがここで何が起こっているのかを段階的に説明してくれますか? Oneホットエンコーダーがどのように機能するかは明確にわかりますが、このコードがどのように機能するのかわかりません。どんな助けでもありがたいです。ありがとう!

10

まず、あなたが期待することを書き留めることから始めましょう(One Hot Encodingの意味を知っていると仮定)

コードなし

f0 f1 f2
0, 0, 3
1, 1, 0
0, 2, 1
1, 0, 2

エンコード

|f0|  |  f1 |  |   f2   |

1, 0, 1, 0, 0, 0, 0, 0, 1 
0, 1, 0, 1, 0, 1, 0, 0, 0
1, 0, 0, 0, 1, 0, 1, 0, 0
0, 1, 1, 0, 0, 0, 0, 1, 0

取得するにはencoded

enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]),

デフォルトのn_values='auto'を使用する場合。 default = 'auto'を使用する場合、機能(nencodedの列)がとる可能性のある値が、fit

これでenc.n_values_に移動します

ドキュメントから:

フィーチャごとの値の数。

enc.n_values_
array([2, 3, 4])

上記は、f0(列1)が2つの値(0、1)をとることができ、f1が3つの値(0、1、2)をとることができ、f2が4つの値(0、1、2、3)を取ることができることを意味します。

実際、これらはnencoded機能マトリックスの機能f1、f2、f3からの値です。

その後、

enc.feature_indices_
array([0, 2, 5, 9])

ドキュメントから:

特徴範囲のインデックス。元のデータのフィーチャーiは、feature_indices_ [i]からfeature_indices_ [i + 1]までのフィーチャーにマップされます(その後、後でactive_features_によってマスクされる可能性があります)

特徴f1、f2、f3が引き受けることができる位置の範囲(エンコードされた空間)が与えられます。

f1: [0, 1], f2: [2, 3, 4], f3: [5, 6, 7, 8]

ベクトル[0、1、1]を1つのホットエンコードされた空間にマッピングします(enc.fitから取得したマッピングの下)。

1, 0, 0, 1, 0, 0, 1, 0, 0

方法?

位置0にマップするためのf0の最初の機能(要素が0ではなく1の場合、位置1にマップします)。

次の要素1は位置3にマップされます。これは、f1が位置2から始まり、要素1が、f1が取り得る2番目の可能な値であるためです。

最後に、3番目の要素1は6番目の位置をとります。これは、2番目の可能な値f2が位置し、f2が位置5からマップされ始めるためです。

いくつかの問題が解消されることを願っています。

14
parsethis

これらの機能を1つずつ取り上げましょう。

>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])

エンコーダーを、それぞれ3つの機能を持つ4つのベクトルのセットに適合させます。

>>> enc.n_values_
array([2, 3, 4])
  • 最初の機能には、2つの可能な値があります:0、1
  • 2番目の機能には、3つの値があります:0、1、2
  • 3番目の機能には4つの可能な値があります:0、1、2、3

晴れ?

>>> enc.feature_indices_
array([0, 2, 5, 9])

表現は、3つの特徴のベクトルを連結します。 3つの機能があるため、表現には常に3つの「True」エントリ(1)があり、残りは「False」(0)です。

可能な値は2 + 3 + 4であるため、表現は9エントリです。

  • 機能1はインデックス0から始まります
  • 機能2はインデックス2から始まります(F1 start + len(F1))
  • 機能3はインデックス5から始まります(F2 start + len(F2))

インデックス9でバリケードを終了

>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

与えられた値をエンコードすると、値0、1、1の3つの1つのベクトルが単純に連結されます。

  • F1:[1、0]
  • F2:[0、1、0]
  • F3:[0、1、0、0]

それらを端から端までスラップして、指定のfloat形式に変換すると、例に示す配列になります。

14
Prune