Предварительная обработка данных для дискретных функций: горячее кодирование, кодирование меток и бинаризация.

scikit-learn pandas
Предварительная обработка данных для дискретных функций: горячее кодирование, кодирование меток и бинаризация.

Это 14-й день моего участия в ноябрьском испытании обновлений.Подробности о событии:Вызов последнего обновления 2021 г.

При использовании машинного обучения существуют разные типы функций: непрерывные функции и дискретные функции.

Для непрерывных признаков мы обычно линейно масштабируем их до интервала [-1, 1] или до диапазона, где среднее значение равно 0, а дисперсия равна 1.

Однако признаки не всегда являются непрерывными значениями, а могут быть категориальными значениями или дискретными значениями. Следовательно, нам также необходимо выполнить предварительную обработку данных кодирования признаков для дискретных значений.

Кодирование дискретных признаков делится на два случая:

  1. Если между значениями дискретных признаков нет существенного размера, например, цвет: [красный, синий, желтый], то используйте горячее кодирование, то есть красный:1 0 0,желтый:0 1 0,синий:0 0 1.
  2. Если значение дискретного признака имеет значение размера, например, модель одежды: [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]]

Справочная документация