2016-07-18 8 views
1

私は長い埋込みリストを持っていますが、各埋込みリストは異なる長さまたは要素を持つことができます。私はモデル内のプレディクタとして各変数を使用するためにそれを平坦化したいと思います。ネストされたリストは、次のようになります。私が達成したい何sklearnで使用するネストされたリストを変換するにはどうすればいいですか?

[[u'Burgers',u'Bars'],[u'Local Services', u'Dry Cleaning & Laundry'],[u'Shopping', u'Eyewear & Opticians'],[u'Restaurants'],...] 

私は特にsklearn機械学習では、モデルで予測因子として使用することができるものです。リスト内の要素は、関心のある変数を予測するために使用されるべきであり、それはスコアである。変換の望ましい結果は次のようになります

[[1, 1, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 1], ...] 

誰かが私にこの変換を行う方法を教えてください。私はここでかなり立ち往生している。ありがとうございました。

答えて

1

パンダのアプローチは次のようになります。

import pandas as pd 
L = [['Burgers', 'Bars'], ['Local Services', 'Dry Cleaning & Laundry'], ['Shopping', 'Eyewear & Opticians'], ['Restaurants']] 

ser = pd.Series([';'.join(i) for i in L]).str.get_dummies(';') 

enter image description here

あなたは.valuesで配列を取得することができます

ser.values 
array([[1, 1, 0, 0, 0, 0, 0], 
     [0, 0, 1, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0, 0, 1], 
     [0, 0, 0, 0, 0, 1, 0]], dtype=int64) 

これは、あなたがそれらの文字列で;を持っていないと仮定し - 別のセパレータで変更することができます。 scikit-learnについては通常OneHotEncoderを使用しますが、これにはいくつかの前処理(ラベルエンコードが最初に必要)が必要なので、パンダではより簡単に見えます。

+0

ありがとうございました。これは非常に素晴らしいです! – achimneyswallow

1

あなたが最初から様々なクラスためスコアを構築し、その後リストを平ら(categoryと呼ばれる)指定されたサブリストで見つかった値に1を割り当てることで、ネストされたリスト内包で、リストを平坦化することができますそして0クラスが見つからない場合

Yが予測されるクラスの元のリストです:

from itertools import chain 

Y = [[u'Burgers',u'Bars'],[u'Local Services', u'Dry Cleaning & Laundry'],[u'Shopping', u'Eyewear & Opticians'],[u'Restaurants']] 

classes = list(chain.from_iterable(Y)) 

scores = [[1 if c in category else 0 for c in classes] for category in Y] 
print(scores) 
# [[1, 1, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 1]] 
+0

ありがとうございました。私はこのフォーラムで本当にたくさんのことを学んでいます。非常に多くの才能があります! – achimneyswallow

関連する問題