2017-02-03 17 views
0

Я хотел бы оцифровать некоторые категориальные данные, чтобы построить тестовую и тестовую матрицы.Как векторизовать категориальные данные

У меня есть 85 городов, и я хотел бы получить матрицу с 282520 строк, каждая строка является вектором, как

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

Я хотел бы иметь вектор для каждой строки с 1 или 0 в зависимости от города , так что, следовательно, каждый город должен быть столбец:

print(df['city']) 
0   METROPOLITANA DE SANTIAGO 
1   METROPOLITANA DE SANTIAGO 
2   METROPOLITANA DE SANTIAGO 
3   METROPOLITANA DE SANTIAGO 
4       COQUIMBO 
5       SANTIAGO 
6       SANTIAGO 
7   METROPOLITANA DE SANTIAGO 
8   METROPOLITANA DE SANTIAGO 
9   METROPOLITANA DE SANTIAGO 
10       BIO BIO 
11       COQUIMBO 
...        ... 
282520 METROPOLITANA DE SANTIAGO 
Name: city, dtype: object 

Это то, что я пробовал:

from sklearn import preprocessing 

list_city = getList(df,'city') 
le = preprocessing.LabelEncoder() 
le.fit(list_city) 

print(le.transform(['AISEN'])) 
print(le.transform(['TARAPACA'])) 
print(le.transform(['AISEN DEL GENERAL CARLOS IBANEZ DEL CAMP'])) 

Я получаю следующий результат:

[0] 
[63] 
[1] 

Проблема заключается в том, что я просто получаю индекс города, я ищу предложения как векторизации данных.

+0

Вы уверены, что вы не ищете для [OneHotEncoder] (http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing .OneHotEncoder)? Это похоже на то, что вы ищете для меня. – patrick

ответ

3

Один из вариантов: pd.get_dummies (который полностью находится за пределами экосистемы sklearn).

df = pd.DataFrame(['METROPOLITANA DE SANTIAGO', 'COQUIMBO', 'SANTIAGO', 'SANTIAGO'], 
        columns=['city']) 
pd.get_dummies(df) 
city_COQUIMBO city_METROPOLITANA DE SANTIAGO city_SANTIAGO 
0    0        1    0 
1    1        0    0 
2    0        0    1 
3    0        0    1 

Если вам нужен массив NumPy, просто возьмите values.

pd.get_dummies(df).values 
[[0 1 0] 
[1 0 0] 
[0 0 1] 
[0 0 1]] 

Другой подход заключается в использовании комбинации LabelEncoder и OneHotEncoder. Как вы заметили, LabelEncoder вернет категориальные индексы для массива произвольных меток. OneHotEncoder перевернут эти индексы в схему кодирования one-k-k.

le = LabelEncoder() 
enc = OneHotEncoder(sparse=False) 
enc.fit_transform(le.fit_transform(df.city.values).reshape(-1, 1)) 
[[ 0. 1. 0.] 
[ 1. 0. 0.] 
[ 0. 0. 1.] 
[ 0. 0. 1.]] 

Еще один вариант DictVectorizer.

dv = DictVectorizer(sparse=False) 
dv.fit_transform(df.apply(dict, 1)) 
[[ 0. 1. 0.] 
[ 1. 0. 0.] 
[ 0. 0. 1.] 
[ 0. 0. 1.]] 
+0

спасибо за поддержку, это очень помогает, но это даст мне 85 столбцов, тогда мне нужно будет найти способ конвертировать эти 85 столбцов в массив numpy для построения матрицы – neo33

+0

@neo Я отредактировал свой ответ, чтобы показать как извлечь «ndarray» из результата 'pd.get_dummies', а также еще два подхода. –

+0

@thanks за помощью, я очень ценю поддержку, спасибо большое – neo33