Одно горячее кодирование означает, что вы создаете векторы из единицы и нуля. Так что порядок не имеет значения. В sklearn
сначала нужно закодировать категориальные данные в числовые данные, а затем передать их в OneHotEncoder
, например:
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
S = np.array(['b','a','c'])
le = LabelEncoder()
S = le.fit_transform(S)
print(S)
ohe = OneHotEncoder()
one_hot = ohe.fit_transform(S.reshape(-1,1)).toarray()
print(one_hot)
что приводит к:
[1 0 2]
[[ 0. 1. 0.]
[ 1. 0. 0.]
[ 0. 0. 1.]]
Но pandas
напрямую преобразует категориальные данные:
import pandas as pd
S = pd.Series( {'A': ['b', 'a', 'c']})
print(S)
one_hot = pd.get_dummies(S['A'])
print(one_hot)
который выводит:
A [b, a, c]
dtype: object
a b c
0 0 1 0
1 1 0 0
2 0 0 1
как вы можете видеть во время сопоставления, для каждого категориального объекта создается вектор. Элементы векторов равны единице в месте расположения категориального признака и нулю везде, где еще нет. Вот пример, когда в сериале всего две категориальные особенности:
S = pd.Series( {'A': ['a', 'a', 'c']})
print(S)
one_hot = pd.get_dummies(S['A'])
print(one_hot)
приводит к:
A [a, a, c]
dtype: object
a c
0 1 0
1 1 0
2 0 1
ИЗМЕНЕНИЯ ДЛЯ ОТВЕТА НА НОВЫЙ ВОПРОС
Начнем с вопроса: почему мы выполняем одно горячее кодирование? ЕСЛИ вы кодируете категориальные данные, такие как ['a', 'b', 'c'], в целые числа [1,2,3] (например, с LableEncoder), в дополнение к кодированию ваших категориальных данных вы бы дали им некоторые веса как 1 ‹2‹ 3. Этот способ кодирования подходит для некоторых методов машинного обучения, таких как RandomForest. Но многие методы машинного обучения предполагают, что в этом случае '‹' b '‹' c ', если вы закодируете их с помощью 1, 2, 3 соответственно. Чтобы избежать этой проблемы, вы можете создать столбец для каждой уникальной категориальной переменной в ваших данных. Другими словами, вы создаете новую функцию для каждой категориальной переменной (здесь один столбец для «a», один для «b» и один для «c»). Значения в этих новых столбцах устанавливаются равными единице, если переменная находилась в этом индексе, и нулю в других местах.
Для массива в вашем примере одним горячим кодировщиком будет:
features -> A B C D
[[ 1. 0. 0. 0.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]]
У вас есть 4 категориальных переменных: «A», «B», «C», «D». Следовательно, OneHotEncoder заполнит ваш массив (4,) до (4,4), чтобы иметь один вектор (или столбец) для каждой категориальной переменной (что будет вашими новыми функциями). Поскольку «A» является элементом 0 вашего массива, индекс 0 вашего первого столбца установлен на 1, а остальные - на 0. Аналогично, второй вектор (столбец) принадлежит элементу «B», а поскольку «B» был в индексе 1 вашего массива индекс 1 вектора "B" установлен в 1, а остальные равны нулю. То же самое относится и к остальным функциям.
Позвольте мне изменить ваш массив. Возможно, это поможет вам лучше понять, как работает кодировщик этикеток:
S = np.array(['D', 'B','C','A'])
S = le.fit_transform(S)
enc = OneHotEncoder()
encModel = enc.fit_transform(S.reshape(-1,1)).toarray()
print(encModel)
теперь результат следующий. Здесь первый столбец - это «A», и поскольку он был последним элементом вашего массива (индекс = 3), последний элемент первого столбца будет равен 1.
features -> A B C D
[[ 0. 0. 0. 1.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 1. 0. 0. 0.]]
Что касается вашего фрейма данных pandas, dataFeat
, вы ошибаетесь даже на первом этапе того, как LableEncoder
работает. Когда вы применяете LableEncoder
, он подходит к каждому столбцу и кодирует его; затем он переходит к следующему столбцу и подгоняет его под этот столбец. Вот что должно получиться:
from sklearn.preprocessing import LabelEncoder
df = pd.DataFrame({'Feat1': ['A','B','D','C'],'Feat2':['B','B','D','C'],'Feat3':['A','C','A','A'],
'Feat4':['A','C','A','A'],'Feat5':['A','C','B','A']})
print('my data frame:')
print(df)
le = LabelEncoder()
intIndexed = df.apply(le.fit_transform)
print('Encoded data frame')
print(intIndexed)
полученные результаты:
my data frame:
Feat1 Feat2 Feat3 Feat4 Feat5
0 A B A A A
1 B B C C C
2 D D A A B
3 C C A A A
Encoded data frame
Feat1 Feat2 Feat3 Feat4 Feat5
0 0 0 0 0 0
1 1 0 1 1 2
2 3 2 0 0 1
3 2 1 0 0 0
Обратите внимание, что в первом столбце Feat1
'A' закодировано в 0, а во втором столбце Feat2
элемент 'B' равен 0. Это происходит, поскольку LableEncoder
подходит для каждого столбца и преобразует его отдельно. Обратите внимание, что во втором столбце среди ('B', 'C', 'D') переменная 'B' по алфавиту выше.
И, наконец, вот что вы ищете с sklearn
:
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
label_encoder = LabelEncoder()
data_lable_encoded = df.apply(label_encoder.fit_transform).as_matrix()
data_feature_onehot = encoder.fit_transform(data_lable_encoded).toarray()
print(data_feature_onehot)
что дает вам:
[[ 1. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 0.]
[ 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
[ 0. 0. 0. 1. 0. 0. 1. 1. 0. 1. 0. 0. 1. 0.]
[ 0. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 1. 0. 0.]]
если вы используете pandas
, вы можете сравнить результаты и, надеюсь, лучше интуитивно понимаете:
encoded = pd.get_dummies(df)
print(encoded)
результат:
Feat1_A Feat1_B Feat1_C Feat1_D Feat2_B Feat2_C Feat2_D Feat3_A \
0 1 0 0 0 1 0 0 1
1 0 1 0 0 1 0 0 0
2 0 0 0 1 0 0 1 1
3 0 0 1 0 0 1 0 1
Feat3_C Feat4_A Feat4_C Feat5_A Feat5_B Feat5_C
0 0 1 0 1 0 0
1 1 0 1 0 0 1
2 0 1 0 0 1 0
3 0 1 0 1 0 0
что в точности то же самое!
person
MhFarahani
schedule
17.08.2016