Это 14-й день моего участия в ноябрьском испытании обновлений.Подробности о событии:Вызов последнего обновления 2021 г.
При использовании машинного обучения существуют разные типы функций: непрерывные функции и дискретные функции.
Для непрерывных признаков мы обычно линейно масштабируем их до интервала [-1, 1] или до диапазона, где среднее значение равно 0, а дисперсия равна 1.
Однако признаки не всегда являются непрерывными значениями, а могут быть категориальными значениями или дискретными значениями. Следовательно, нам также необходимо выполнить предварительную обработку данных кодирования признаков для дискретных значений.
Кодирование дискретных признаков делится на два случая:
- Если между значениями дискретных признаков нет существенного размера, например, цвет: [красный, синий, желтый], то используйте горячее кодирование, то есть красный:
1 0 0
,желтый:0 1 0
,синий:0 0 1
. - Если значение дискретного признака имеет значение размера, например, модель одежды: [X, XL, XXL], то для сопоставления значения используйте кодировку метки:
{X:1, XL:2, XXL:3}
.
однократное кодирование
Что такое горячее кодирование
Горячее кодирование, интуитивно говоря, представляет собой кодовую систему, в которой состояний столько, сколько битов, и только один бит равен 1, а все остальные — 0.
Для горячего кодирования столько значений, сколько имеет дискретный признак, признак представлен таким же количеством измерений.
Преимущества и недостатки горячего кодирования
преимущество:
Горячее кодирование решает проблему, заключающуюся в том, что классификатор плохо справляется с обработкой атрибутивных данных, а также в определенной степени играет роль расширения признаков. Его значения только 0 и 1, а разные типы хранятся в вертикальном пространстве.
недостаток:
Когда количество категорий велико, пространство признаков может стать очень большим. В этом случае для уменьшения размерности обычно можно использовать PCA. И комбинация one-hot encoding + PCA тоже очень полезна на практике.
Как определить, следует ли использовать однократное кодирование или нет
использовать:
Горячее кодирование используется для решения проблемы дискретных значений категориальных данных.
Не нужно:
Функция горячего кодирования дискретных признаков состоит в том, чтобы сделать вычисление расстояния более разумным, но если признаки дискретны, и расстояние может быть разумно рассчитано без горячего кодирования, то нет необходимости выполнять однократное кодирование. .
Некоторые древовидные алгоритмы не основаны на метриках векторного пространства при работе с переменными.Значение представляет собой просто символ категории, поэтому однократное кодирование не требуется.
Модель дерева не требует однократного кодирования, для деревьев решений суть однократного кодирования заключается в увеличении глубины дерева.
В общем, если категорий одноразового кодирования не слишком много, рекомендуется отдать приоритет.
Как определить, нужна нормализация или нет
- Требование: для моделей на основе параметров или моделей на основе расстояний требуется нормализация признаков.
- Не требуется: древовидные методы не требуют нормализации функций, таких как случайные леса, бэггинг и бустинг.
образец кода
реализация панд
import pandas as pd
data = pd.Series(list('abca'))
print(data)
print("----------")
# 独热编码
# 参数说明
# data : array-like, Series, or DataFrame ,输入的数据
# prefix : string, list of strings, or dict of strings, default None ,get_dummies转换后,列名的前缀
# columns : list-like, default None,指定需要实现类别转换的列名
# dummy_na : bool, default False,增加一列表示空缺值,如果False就忽略空缺值
# drop_first : bool, default False,获得k中的k-1个类别值,去除第一个
result = pd.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)
print(result)
print("----------")
# 哑编码
result2 = pd.get_dummies(data,drop_first=True)
print(result2)
результат операции:
0 a
1 b
2 c
3 a
dtype: object
----------
a b c
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
----------
b c
0 0 0
1 1 0
2 0 1
3 0 0
Разница и связь между уникальным кодированием и фиктивным кодированием
Интуитивное объяснение кодирования фиктивной переменной состоит в произвольном удалении бита состояния. Взяв приведенный выше пример в качестве примера, мы можем использовать 2 бита состояния для отображения информации о трех вышеуказанных категориях.
«Направление мысли» уникального кодирования и фиктивного кодирования одинаково, но кодирование фиктивной переменной кажется, что уникальное кодирование слишком многословно, поэтому оно настолько очевидно, что его опускают. Нельзя в итоге сказать, хорошо это упрощение или нет, это зависит от сценария использования.
реализация sklearn
from sklearn.preprocessing import OneHotEncoder
import numpy as np
target = np.array([[1],[2],[3],[4]])
ohe = OneHotEncoder()
ohe.fit(target)
print(ohe.get_feature_names())
ohe_r = ohe.transform([[4],[3],[1],[4]]).toarray()
print(ohe_r)
результат операции:
['x0_1' 'x0_2' 'x0_3' 'x0_4']
[[0. 0. 0. 1.]
[0. 0. 1. 0.]
[1. 0. 0. 0.]
[0. 0. 0. 1.]]
Кодирование функций для нескольких функций:
# 多个特征独热编码
from sklearn import preprocessing
import numpy as np
data = np.array([[0, 0, 3],
[1, 1, 0],
[0, 2, 1],
[1, 0, 2]])
enc = preprocessing.OneHotEncoder()
enc.fit(data) # fit来学习编码
enc.transform([[0, 1, 3]]).toarray() # 进行编码
Результаты приведены ниже:
array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])
Приведенный выше код объясняется следующим образом:
Исходная матрица данных 4*3, то есть 4 выборочных данных и 3 измерения признаков.
- Обратите внимание на матрицу данных, первый столбец - это первое измерение функции, и есть два значения 0 \ 1. Таким образом, соответствующие методы кодирования - 10 и 01.
- Точно так же второй столбец — это второе измерение функции, и есть три значения 0\1\2, поэтому соответствующие методы кодирования — 100, 010 и 001.
- Точно так же третий столбец — это третье измерение функции, и есть четыре значения 0\1\2\3, поэтому соответствующие методы кодирования — 1000, 0100, 0010 и 0001.
Давайте посмотрим на параметры, которые нужно закодировать[0 , 1, 3]
, 0, поскольку первая функция кодируется как 10, 1, поскольку вторая функция кодируется как 010, и 3, поскольку третья функция кодируется как 0001.
Таким образом, результат кодирования1 0 0 1 0 0 0 0 1
.
Кодировка тега
Что такое кодировка этикетки
Кодирование метки заключается в назначении числовой метки значению символа в виде строки в соответствии с положением значения символа в последовательности символов, которая используется для предоставления модели обучения на основе числового алгоритма.
использоватьLabelEncoder
Пронумеруйте прерывистые числа или тексты и преобразуйте их в непрерывные числовые переменные.
образец кода
Пример кода для нумерации текстовых меток выглядит следующим образом:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(["Japan", "china", "Japan", "Korea","china"])
print('标签个数:%s' % le.classes_)
print('标签值标准化:%s' % le.transform(["Japan", "china", "Japan", "Korea","china"]))
print('标准化标签值反转:%s' % le.inverse_transform([0, 2 ,0 ,1 ,2]))
результат операции:
标签个数:['Japan' 'Korea' 'china']
标签值标准化:[0 2 0 1 2]
标准化标签值反转:['Japan' 'china' 'Japan' 'Korea' 'china']
Пример кода для нумерации непоследовательных чисел выглядит следующим образом:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
# 对不连续的数字进行编号
le.fit([1,5,67,100])
result = le.transform([1,1,100,67,5])
print(f"编号:{result}")
print("逆过程:%s"%le.inverse_transform([0,0,3,2,1]))
результат операции:
编号:[0 0 3 2 1]
逆过程:[ 1 1 100 67 5]
Бинаризация
что такое бинаризация
Установите условие для классификации дискретных (или непрерывных) данных на две категории. Например, Возраст, больше 30 и меньше 30. Больше 30 равно 1, меньше или равно 30 равно 0.
образец кода
from sklearn.preprocessing import Binarizer
binerize = Binarizer(threshold = 30)
x = np.array([30, 20, 45, 99, 87, 25, 31]) # 提取数据
trans = binerize.fit_transform(x.reshape(-1,1))
trans.tolist()
результат операции:
[[0], [0], [1], [1], [1], [0], [1]]
Справочная документация
- Горячее кодирование OneHotEncoder и кодирование меток LabelEncoder
- Нормализация данных и кодирование общих меток, горячее кодирование
- Предварительная обработка данных: кодирование меток One-Hot Encoding и LabelEncoder
- Метод дискретного кодирования признаков: одноразовые и фиктивные переменные*
- Методы дискретизации характеристик непрерывных данных