2017-09-05 74 views
0

所以,目前我有一堆我正在轉型爲一個熱碼如下從功能獲取映射到一個熱碼尺寸

from sklearn.preprocessing import LabelEncoder, OneHotEncoder 

X_str = np.array([['a', 'dog', 'red'], ['b', 'cat', 'green']]) 
# transform to integer 
X_int = LabelEncoder().fit_transform(X_str.ravel()).reshape(*X_str.shape) 
# transform to binary 
X_bin = OneHotEncoder().fit_transform(X_int).toarray() 

print(X_bin) 
# [[ 1. 0. 0. 1. 0. 1.] 
# [ 0. 1. 1. 0. 1. 0.]] 

此工程串類別特徵。

但是,我試圖找出從特徵,其尺寸被激活

因此,例如映射,「A」被映射到0(如在特徵向量的第0索引被設置爲1 )

「b」被映射到1(作爲特徵向量的第一索引被設置爲1)

「貓」被映射到2(作爲特徵向量的第二索引被設置爲1)

所以,我想要在字典中得到所有這些映射。 什麼是實現這些的好方法。

回答

2

使用LabelEncoder().classes_。這將是它將安排的順序。最可能的是字母。

這意味着您需要保存LabelEncoder()對象。使用這樣的:

le = LabelEncoder() 
X_int = le.fit_transform(X_str.ravel()).reshape(*X_str.shape) 

print(le.classes_) 
#Out:- ['a' 'b' 'cat' 'dog' 'green' 'red'] 

然後,您可以使用:

labels = le.classes_ 

mappings = {} 
for index, label in zip(range(len(labels)), labels): 
    mappings[label]=index 

print(mappings) 
#Out: {'a': 0, 'b': 1, 'dog': 3, 'cat': 2, 'green': 4, 'red': 5} 
+0

謝謝..我有一個跟進..如果我的功能是一樣的東西 'X_str = np.array([1, 'A', '狗', '紅' ],[2,'b','dog','green']])' 現在le只會變換字符串變量,但是然後'onehotencodenc'將會映射第一列以及..如何得到它們的映射? – Fraz

+0

@Fraz我不理解。如果用給定的數據替換X_str,那麼labelEncoder也會對它們進行編碼。檢查輸出: - '{'a':2,'b':3,'dog':4,'1':0,'2':1,'green':5,'red':6} –

+0

@Fraz查看數據中的1和2編碼爲「1」和「2」。這是你想要的嗎 ? –

1

可以使用LabelEncoder法 'classes_' 來完成這件事。事情是這樣的:

#fit, instead of transform and store this 
X_enc = LabelEncoder().fit(X_str.ravel()) 
enc_dct = {} 
for idx,items in enumerate(list(X_enc.classes_)): 
    enc_dct[idx] = items 
print (enc_dct) 
#{0: 'a', 1: 'b', 2: 'cat', 3: 'dog', 4: 'green', 5: 'red'}