1

私はsklearn LabelEncoderを使用しています。私は1次元配列のためにそれを使用する方法を知っている、しかし、のような私のユースケースは、次のとおりです。私は効果的に分類子になど各テキストラベルu'a'u'b'を割り当てる私のコストである。このようなdictsの複数のアレイを(持っている辞書にラベルエンコーダを使用する

辞書内)、全:

{'open_model':  
[ 
    {u'a': 47502.125, u'c': 45.3, u'd': 2.3, u'e': 0.45}, 
    {u'b': 121, u'a': 1580.5625, u'c': 12, u'e': 62,u'd':0.343}, 
    {u'e': 12321, u'b': 4, u'a': 0.1112} 
    ], 
'closed_model': 
[ 
    {u'a': 1231.22, u'c': 43.1}, 
    {u'b': 342.2, u'a': 121.1, u'c': 343}, 
    {u'b': 14.2, u'a': 53.2} 
    ] 
} 

Iは、例えば、数値ラベルにこれを符号化し、再度それらの全てをデコードするのでできるようにする必要があります。私が生成するために有効に使用

[ 
    {1: 47502.125, 3: 45.3, 4: 2.3, 5: 0.45}, 
    {2: 121, 1: 1580.5625, 3: 12, 5: 62, 4: 0.343}, 
    {5: 12321, 2: 4, 1: 0.1112} 
    ] 

eの最良のラベルの予測そのACH行は、:辞書の配列に、私は同じLabelEncoder機能を取得できますか

[u'e',u'd', u'a'] perhaps in this case. 

しかしfit_transformに:

[5, 4, 1] perhaps in this case. 

私は何をする必要があることは背中にこれをデコードすることができることですどこのdictキーが私のラベルですか?

dictsの配列内のdictは異なる長さですが、私はすべての潜在的なラベル、つまりopen_modelラベルset([u'a',u'b',u'c',u'd',u'e'])とclosed_modelラベルのリストを持っています:set([u'a',u'b',u'c'])

答えて

1

それはすでに実装される機能を使用することをお勧めしますが、あなたは簡単にカップルでこれを達成できますコード行のあなたのリストの入力を考える:

dico = [ 
{u'a': 47502.125, u'b': 1580.5625, u'c': 45.3, u'd': 2.3, u'e': 0.45}, 
{u'b': 121, u'a': 1580.5625, u'c': 12, u'e': 62, u'd': 0.343}, 
{u'e': 12321, u'b': 4, u'd': 5434, u'c': 2.3, u'a': 0.1112} 
] 

あなたは、単にによりラベルのセットを取得することができます:

for inner_dict in dico: 
    for key in inner_dict.keys(): 
     inner_dict[mapping[key]] = inner_dict.pop(key) 
print dico 

keyset = set(dico[0].keys()) #Get the set of keys assuming they all appear in each list item. 
mapping = { val:key+1 for key,val in enumerate(list(keyset))} # Create a mapping from int -> str 
inv_mapping = { key+1:val for key,val in enumerate(list(keyset))} # Create a mapping from str:int. 

は、あなたがして、データの表現を変更することができinv_mappingmappingを有し、かつ、

これはあなたに[{1: 47502.125, ...}]を与え、次に必要ならば:

for inner_dict in dico: 
    for key in inner_dict.keys(): 
     inner_dict[inv_mapping[key]] = inner_dict.pop(key) 
print dico 

初期バージョンを取得する。また

、そしておそらくより密接にあなたが簡単で、それを変換することができ[5, 4, 1]あなたの出力を有し、あなたの問題に関連:私は好き

print [inv_mapping[i] for i in x] 
+0

、この溶液を理解しています。しかし、修正された質問を参照してください(既存のものはあまりにも小さすぎます)。 –

+0

あなたのメソッドは動作しますが、インプレースを変更すると 'KeyError'が発生します。私のキーは' u '/ location/statistical_region/size_of_armed_forces''の代わりに 'u'a''のようなものです。 –

+0

ソートされました! 'pop 'の私のprintステートメントは値をポップして削除していたので、再割り当てすると消えてしまったということを意味していました。 –

1

あなたはいつも 'a'、 'b'、 'c'、 'd'、 'e'のようです。これが当てはまる場合は、パンダのデータフレームを使用してエンコーダについて忘れるのはなぜですか?あなたはちょっと使っている辞書のキーを書き直す必要があるので、とにかくそれは面倒です!

import pandas as pd 
i = [ 
{u'a': 47502.125, u'b': 1580.5625, u'c': 45.3, u'd': 2.3, u'e': 0.45}, 
{u'b': 121, u'a': 1580.5625, u'c': 12, u'e': 62, u'd': 0.343}, 
{u'e': 12321, u'b': 4, u'd': 5434, u'c': 2.3, u'a': 0.1112} 
] 
# transform to data frame 
df = pd.DataFrame(i) 
print df 
      a   b  c   d   e 
0 47502.1250 1580.5625 45.3  2.300  0.45 
1 1580.5625 121.0000 12.0  0.343  62.00 
2  0.1112  4.0000 2.3 5434.000 12321.00 

# create a mapping between columns and encoders 
mapping = dict((k, v) for k, v in enumerate(df.columns)) 

# rename columns 
df.columns = range(len(df.columns)) 

# print your new input data 
print df.to_dict(orient='records) 
[{0: 47502.125, 1: 1580.5625, 2: 45.3, 3: 2.3, 4: 0.45}, 
{0: 1580.5625, 1: 121.0, 2: 12.0, 3: 0.343, 4: 62.0}, 
{0: 0.1112, 1: 4.0, 2: 2.3, 3: 5434.0, 4: 12321.0}] 

# translate prediction 
prediction = [3, 4, 1] 
print [mapping[k] for k in prediction] 
[u'd', u'e', u'b'] 

それはまっすぐではないのですが、私はそれがエンコーダを使用するよりも時間がかかるだろうと思います:)

関連する問題