содержание
1. Что такое горячее кодирование?
В-четвертых, использование примеров:
1. Что такое горячее кодирование?
Горячее кодирование, также известное как однобитовое эффективное кодирование, в основном использует N-битный регистр состояния дляN состоянияДля кодирования каждое состояние состоит из своих независимых битов регистра, и только один бит является действительным в любой момент времени.
Горячее кодированиеКатегориальные переменныев видедвоичный векторпредставление. Для этого сначала требуется сопоставление категориальных значений с целочисленными значениями. Затем каждое целочисленное значение представляется как двоичный вектор, который имеет нулевое значение, за исключением индекса целого числа, который помечен как 1.
Вкратце в одном предложении:one hot Кодирование — это процесс преобразования категориальных переменных в форму, которая может быть легко использована алгоритмами машинного обучения.
2. Зачем использовать onehot
Предположим, у нас есть мини-набор данных:
название компании | Значение категории | цена |
---|---|---|
Просо | 1 | 5000 |
Хуавей | 2 | 10011 |
ЗТЕ | 3 | 50000 |
ЗТЕ | 3 | 10000 |
В приведенной выше таблице значение категории начинается с 1, что больше соответствует привычкам повседневной жизни. В реальных проектах значения категорий начинаются с 0 (поскольку большинство компьютерных систем считают), поэтому, если имеется N категорий, значения категорий от 0 до N-1.
sklearизLabelEncoderМожет помочь нам завершить эту работу по присвоению значения категории.
Согласно значениям класса, закодированным метками, Xiaomi > Huawei > ZTE в нашем мини-наборе данных. Например, если предположить, что модель вычисляет среднее значение внутри (в нейросети много операций взвешенного усреднения), то 1 + 3 = 4, 4 / 2 = 2. Это означает: VW и Honda в среднем — это Acura. Без сомнения, это плохой план. Предсказания модели подвержены существенной ошибке.
Вот почему мы используем один горячий кодировщик для «бинаризации» категорий, а затем используем их в качестве признаков для обучения модели.
Конечно, если бы мы проектировали сеть с учетом этого и специально относились к значениям класса, закодированным метками, то все было бы хорошо. Однако в большинстве случаев использование одного горячего кодирования является более простым и понятным решением. Следующая таблица:
Просо | Хуавей | ЗТЕ | цена |
---|---|---|---|
1 | 0 | 0 | 5000 |
0 | 1 | 0 | 10011 |
0 | 0 | 1 | 50000 |
0 | 0 | 1 | 10000 |
Примечание: Если исходная кодировка этикетки в порядке, то одна горячая кодировка не подходит - информация о заказе будет утеряна.
3. Когда использовать onehot
Для категориальных типов данных, рекомендуется использовать однократное кодирование. Фиксированный тип представляет собой чистую классификацию, не отсортированную и не имеющую логической связи. Например, пол делится на мужской и женский, между мужчинами и женщинами нет логической связи, нельзя сказать, что мужчины лучше женщин, или наоборот. Кроме того, для классификации провинций и городов в Китае также можно использовать однократное кодирование, так как между провинциями нет логической связи, и в этом случае более подходящим является однократное кодирование. Но обратите внимание, что одна переменная, как правило, отбрасывается.Например, противоположность мужчине определенно женщина, тогда женщина повторяет информацию, поэтому оставьте одну из переменных.
Для упорядоченных типов данных, рекомендуется кодировка метки. Тип упорядочивания также является классификацией, но существует логическое отношение упорядочивания, а уровень выше классификации. Например, образование делится на начальную школу, неполную среднюю школу, среднюю школу, бакалавриат и последипломное образование. Между каждой категорией существует определенная логика. Очевидно, что последипломное образование является высшим, а начальная школа — самым низким. В настоящее время более целесообразно использовать кодировку Label, поскольку пользовательская числовая последовательность не может разрушить исходную логику и соответствовать этой логике.
Модели, чувствительные к размеру, должны использовать однократное кодирование или фиктивное кодирование.. Типичный примерLRиSVM. Функции потерь этих двух чувствительны к размеру значения, а размер значения между переменными имеет смысл. Числовое кодирование кодировки Label не имеет значения числового размера, это просто сортировка, поэтому для этих моделей используется однократное кодирование.
Горячее кодирование не рекомендуется для моделей, нечувствительных к числовому размеру (например, моделей деревьев).. Как правило, такие моделимодель дерева. Если категорий классификации слишком много, то горячее кодирование разделит множество переменных признаков. В настоящее время, если мы ограничим глубину древовидной модели и не сможем разделить ее, некоторые переменные признаков могут быть отброшены и потеряны, поскольку модель не может продолжать разделяться. Следовательно, в этом случае вы можете рассмотреть возможность использования кодировки меток.
В-четвертых, использование примеров:
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
data =[['法师', 40, 14000],
['辅助', 30, 13000],
['坦克', 31, 12000],
['射手', 30, 14000],
['法师', 32, 11000]]
data = pd.DataFrame(data, columns=['role', 'changci', 'output'])
# print (data)
# 在One-Hot编码之前先将带中文的标称属性转换成数值型
# 用简单整数替代
listUniq = data.loc[:, 'role'].unique() # 去重
# 对匹配的元素赋值,不匹配的元素保持原样
for j in range(len(listUniq)):
data.loc[:, 'role'] = data.loc[:, 'role'].apply(lambda x: j if x == listUniq[j] else x)
print(data)
# 用数字给文本属性赋值,保证赋值过的不会重新再赋值
# lambda x:j if x == listUniq[j] else x
# 遍历len(listUniq)次 data.loc[:,'role']
# 发现data.loc[:,'role'] 中有元素与listUniq的元素相同,就赋相对应的整数值
# 开始One-Hot编码
temp = data[['role']]
enc = OneHotEncoder()
enc.fit(temp)
# 将Matrix类型转换为array类型
temp = enc.transform(temp).toarray()
tempdata = pd.DataFrame(temp,columns=['role1','role2','role3','role4'])
tempdata['changci']=data[['changci']]
tempdata['output']=data[['output']]
print(tempdata)
результат операции: