2017-02-22 7 views
4

Учитывая список особенностей длины варианта:Как использовать функции длины одного горячего кодирования?

features = [ 
    ['f1', 'f2', 'f3'], 
    ['f2', 'f4', 'f5', 'f6'], 
    ['f1', 'f2'] 
] 

, где каждый образец имеет вариант количество функций и функцию dtype является str и уже один горячий.

Для того, чтобы использовать мнемонические утилиты sklearn, я должен преобразовать features в 2D-массив, который выглядит как:

f1 f2 f3 f4 f5 f6 
s1 1 1 1 0 0 0 
s2 0 1 0 1 1 1 
s3 1 1 0 0 0 0 

Как я могу добиться этого с помощью sklearn или NumPy?

ответ

7

Вы можете использовать MultiLabelBinarizer присутствующую в scikit, который специально используется для этого.

Код для вашего примера:

features = [ 
      ['f1', 'f2', 'f3'], 
      ['f2', 'f4', 'f5', 'f6'], 
      ['f1', 'f2'] 
      ] 
from sklearn.preprocessing import MultiLabelBinarizer 
mlb = MultiLabelBinarizer() 
new_features = mlb.fit_transform(features) 

Выход:

array([[1, 1, 1, 0, 0, 0], 
     [0, 1, 0, 1, 1, 1], 
     [1, 1, 0, 0, 0, 0]]) 

Это также может быть использован в трубопроводе, наряду с другими feature_selection утилитами.

2

Вот один подход с методами NumPy и вывода, как панд dataframe -

import numpy as np 
import pandas as pd 

lens = list(map(len, features)) 
N = len(lens) 
unq, col = np.unique(np.concatenate(features),return_inverse=1) 
row = np.repeat(np.arange(N), lens) 
out = np.zeros((N,len(unq)),dtype=int) 
out[row,col] = 1 

indx = ['s'+str(i+1) for i in range(N)] 
df_out = pd.DataFrame(out, columns=unq, index=indx) 

вход образца, выход -

In [80]: features 
Out[80]: [['f1', 'f2', 'f3'], ['f2', 'f4', 'f5', 'f6'], ['f1', 'f2']] 

In [81]: df_out 
Out[81]: 
    f1 f2 f3 f4 f5 f6 
s1 1 1 1 0 0 0 
s2 0 1 0 1 1 1 
s3 1 1 0 0 0 0 
Смежные вопросы