предисловие
В предыдущем разделе мы узнали о неконтролируемых методах уменьшения размерности.PCA,изучениеPCAПри вводе данных мы понимаем некоторые методы обработки данных, в том числе методы преобразования неструктурированных данных в структурированные данные, порядковое кодирование, горячее кодирование, двоичное кодирование иencodingкодирование. В этом разделе будет описаноCategorical Embedderметод, как отображать неструктурированные индикаторы в тензоры с плавающей запятой с помощью категориальных переменных кодирования нейронной сети, чтобы удовлетворить входные требования нейронной сети.
1. Предварительная обработка данных нейронной сети
Модели машинного обучения неотделимы от предварительной обработки данных.Предварительная обработка также очень важна для построения сетевых моделей и часто определяет результаты обучения.Для разных наборов данных методы предварительной обработки будут иметь более или менее ограничения и особенности, особенно Да, входные данные нейронной сети поддерживают только тензоры с плавающей запятой. Независимо от того, с какими данными вы имеете дело (звук, изображение или текст), их необходимо преобразовать в тензор, прежде чем передавать их модели нейронной сети. Когда мы сталкиваемся, например, эти данные могут быть закодированы серийными номерами (Ordinal Encoding), однократное кодирование (One-hot Encoding), двоичное кодирование (Binary Encoding) и другие методы преобразования его в число. Далее вводится более продвинутый метод кодирования нейронной сети.
2. Что такое встраивание
embeddingЭто способ преобразования дискретных переменных в непрерывные векторные представления. существуетGoogleОфициальное описание учебникаembeddingОблегчает машинное обучение на больших входных данных, таких как разреженные векторы, представляющие слова. Это может помочь нам преобразовать эти дискретные переменные в числа, чтобы облегчить обучение модели, когда мы изучаем содержимое неструктурированных данных. Например, у компании есть три продукта, и каждый продукт имеет в среднем 50 000 отзывов.Общее количество уникальных слов в корпусе равно100десять тысяч. У нас получится форма (150К, 1М) матрица. Для любой модели эти входные данные очень велики и очень разрежены. Предположим, что мы уменьшаем размерность до 15 (15-значный идентификатор для каждого продукта), берем среднее значение встраивания каждого продукта, а затем раскрашиваем их в соответствии со значением, мы получим следующее изображение; Встраивание означает представление категории с фиксированным набором чисел, и мы можем использовать матрицу (3, 15) для представления степени сходства между каждым продуктом. Больше визуализации также снижает сложность.
Каждый класс сопоставляется с другим вектором, и свойства вектора можно настроить или изучить при обучении нейронной сети. Векторное пространство обеспечивает проекцию категорий, так что те, которые близки или связаны, естественным образом группируются вместе. Чтобы изучить вложения, мы создаем модель, которая использует эти вложения как функции и взаимодействует с другими функциями для изучения вышеуказанной задачи. На этом этапе вам нужно обратиться к понятию: вектор слова.
2.1 Вектор слова
Вектор слова — это вектор вложения для каждого слова языка. Вся идея векторов слов заключается в том, что слова, которые кажутся ближе в предложении, обычно ближе друг к другу. Вложения — это **n** размерные векторы. Каждое измерение фиксирует определенные атрибуты/свойства каждого слова, поэтому ближе к атрибутам, ближе к словам. Чтобы изучить векторы слов, мы создаем набор пар слов, которые появляются в небольшом окне слов (скажем, 5 слов) в качестве положительных примеров, и набор пар слов, которые не отображаются в этом окне, в качестве отрицательных примеров.
Когда мы обучаем приведенную выше нейронную сеть на достаточно большом наборе данных, модель учится предсказывать, связаны ли два слова. Тем не менее, эта модельпобочный продукт- матрица вложения, которая представляет собой информативное векторное представление каждого слова в словаре. (См. Категориальное встраивание и перенос обучения один)
2.2 Традиционные методы
- серийный номер (Ordinal Encoding) порядковое кодирование обычно используется для работы с данными с отношением размера между категориями.
- Горячее кодирование (One-hot Encoding) использовать разреженные векторы для экономии места и выбор объектов для уменьшения размерности
- бинарный код (Binary Encoding) Двоичное кодирование в основном делится на два этапа: во-первых, каждой категории назначается идентификатор категории с кодировкой серийного номера, а затем в качестве результата используется двоичное кодирование, соответствующее идентификатору категории.
2.3 Как работает categorical_embedder
Во-первых, каждая категория категориальных переменных отображаетnразмерный вектор. Это сопоставление изучается нейронной сетью во время стандартного контролируемого обучения. Если мы хотим использовать вышеуказанный 15-мерный идентификатор в качестве признака, то мы будем обучать нейронную сеть контролируемым образом, берем вектор каждого признака и сгенерируем матрицу 3*15, как показано ниже. Как показано на рисунке ниже (нелегко представить слишком много нейронных узлов, рисунок ниже приведен только для справки)
Далее мы заменим каждую категорию соответствующим вектором в данных. Преимущество этого в том, что мы ограничиваем количество столбцов, необходимых для каждой категории. Это полезно, когда столбцы имеют большое количество элементов (количество элементов — это мера количества элементов в коллекции). Генеративные вложения, полученные из нейронных сетей, раскрывают внутренние свойства категориальных переменных. Это означает, что аналогичные категории будут иметь аналогичные вложения.
2.4 Изучение матрицы встраивания
Матрица встраивания представляет собой число с плавающей запятойN*Mматрица. здесьNколичество уникальных категорий,Mявляется размерностью вложения. мы решаемMзначение . обычно будетMустановить равнымNквадратный корень из , а затем увеличить или уменьшить по мере необходимости. По сути, матрица встраивания — это интерполяционная таблица векторов. Каждая строка матрицы вложения — это вектор уникального класса.
Для компании у нее есть три продукта, каждый продукт оценивается как пятьдесят тысяч уникальных значений, для построения категориального встраивания нам необходимо решить осмысленную модель глубокого обучения задачи, в приведенной выше задаче матрица встраивания используется для представления категориальные переменные. Мы используем 15-мерную переменную, чтобы предсказать ассоциации продукта компании. Какой продукт актуален, можно проанализировать по цветовому различию, конечно, это относится к идее анализа системы рекомендаций. Более того, классифицировать атрибуты выборок по категориям для построения соответствующихembeddingматрица, через нихLabel_embeddingматрица, черезFalttenслой, который подается в нейронную сеть для обучения
3 categorical_embedder на основе Python
3.1 Пересчет кода кодирования нейронной сети
pip install categorical_embedder
Примечание. Для этой библиотеки требуетсяtensorflowВерсия ниже 2.1, выше этой версии произойдет неизвестная ошибка.
в этомcategorical_embedderСодержит некоторые важные определения функций, и мы подробно описываем их значение.
- ce.get_embedding_info(data,categorical_variables=None): Цель этой функции — идентифицировать все категориальные переменные в данных и определить размер их внедрения. Размер встраивания для категориальных переменных определяется как минимум 50 или половиной числа. Уникальное значение, т. е. размер встроенного столбца =Мин (50Единственное значение в этом столбце). мы можемcategorical_variablesВ аргументе передается явный список категориальных переменных. Если нет, эта функция автоматически примет все переменные, тип данных которых является объектом.
def get_embedding_info(data, categorical_variables=None):
'''
this function identifies categorical variables and its embedding size
:data: input data [dataframe]
:categorical_variables: list of categorical_variables [default: None]
if None, it automatically takes the variables with data type 'object'
embedding size of categorical variables are determined by minimum of 50 or half of the no. of its unique values.
i.e. embedding size of a column = Min(50, # unique values of that column)
'''
if categorical_variables is None:
categorical_variables = data.select_dtypes(include='object').columns
return {col:(data[col].nunique(),min(50,(data[col].nunique()+ 1) //2)) for col in categorical_variables}
- ce.get_label_encoded_data(data, categorical_variables=None): эта функция кодирует метки (целочисленное кодирование) все категориальные переменные с помощью функции **sklearn.preprocessing.LabelEncoder** и возвращает кадр данных меток для обучения.Keras/TensorFlowИли любая другая библиотека глубокого обучения ожидает, что данные будут в этом формате.
def get_label_encoded_data(data, categorical_variables=None):
'''
this function label encodes all the categorical variables using sklearn.preprocessing.labelencoder
and returns a label encoded dataframe for training
:data: input data [dataframe]
:categorical_variables: list of categorical_variables [Default: None]
if None, it automatically takes the variables with data type 'object'
'''
encoders = {}
df = data.copy()
if categorical_variables is None:
categorical_variables = [col for col in df.columns if df[col].dtype == 'object']
for var in categorical_variables:
#print(var)
encoders[var] = __LabelEncoder__()
df.loc[:, var] = encoders[var].fit_transform(df[var])
return df, encoders
-
ce.get_embeddings(X_train, y_train, categorical_embedding_info=embedding_info, is_classification=True, epochs=100,batch_size=256): эта функция обучает неглубокую нейронную сеть и возвращает вложения для категориальных переменных. На нижнем уровне находится двухслойная архитектура нейронной сети с 1000*500 нейронов с активацией ReLU. требуется четыре обязательных выходаX_train
,
y_train,
categorical_embedding_info: get_embedding_infoВывод функции иis_classification:Trueдля задач классификации; False для задач регрессии.Для классификации:loss = 'binary_crossentropy'; metrics = 'accuracy'для регрессииloss = 'mean_squared_error'; metrics = 'r2'
def get_embeddings(X_train, y_train, categorical_embedding_info, is_classification, epochs=100, batch_size=256):
'''
this function trains a shallow neural networks and returns embeddings of categorical variables
:X_train: training data [dataframe]
:y_train: target variable
:categorical_embedding_info: output of get_embedding_info function [dictionary of categorical variable and it's embedding size]
:is_classification: True for classification tasks; False for regression tasks
:epochs: num of epochs to train [default:100]
:batch_size: batch size to train [default:256]
It is a 2 layer neural network architecture with 1000 and 500 neurons with 'ReLU' activation
for classification: loss = 'binary_crossentropy'; metrics = 'accuracy'
for regression: loss = 'mean_squared_error'; metrics = 'r2'
'''
numerical_variables = [x for x in X_train.columns if x not in list(categorical_embedding_info.keys())]
inputs = []
flatten_layers = []
for var, sz in categorical_embedding_info.items():
input_c = Input(shape=(1,), dtype='int32')
embed_c = Embedding(*sz, input_length=1)(input_c)
flatten_c = Flatten()(embed_c)
inputs.append(input_c)
flatten_layers.append(flatten_c)
#print(inputs)
input_num = Input(shape=(len(numerical_variables),), dtype='float32')
flatten_layers.append(input_num)
inputs.append(input_num)
flatten = concatenate(flatten_layers, axis=-1)
fc1 = Dense(1000, kernel_initializer='normal')(flatten)
fc1 = Activation('relu')(fc1)
fc2 = Dense(500, kernel_initializer='normal')(fc1)
fc2 = Activation('relu')(fc2)
if is_classification:
output = Dense(1, activation='sigmoid')(fc2)
else:
output = Dense(1, kernel_initializer='normal')(fc2)
nnet = Model(inputs=inputs, outputs=output)
x_inputs = []
for col in categorical_embedding_info.keys():
x_inputs.append(X_train[col].values)
x_inputs.append(X_train[numerical_variables].values)
if is_classification:
loss = 'binary_crossentropy'
metrics='accuracy'
else:
loss = 'mean_squared_error'
metrics=r2
nnet.compile(loss=loss, optimizer='adam', metrics=[metrics])
nnet.fit(x_inputs, y_train.values, batch_size=batch_size, epochs=epochs, validation_split=0.2, callbacks=[TQDMNotebookCallback()], verbose=0)
embs = list(map(lambda x: x.get_weights()[0], [x for x in nnet.layers if 'Embedding' in str(x)]))
embeddings = {var: emb for var, emb in zip(categorical_embedding_info.keys(), embs)}
return
Обратите внимание, что эти коды являются исходным кодом библиотеки, просто поймите.
3.2 Практический пример – прогноз цен на подержанные автомобили
На основе предоставленных выборочных данных о сделках с подержанными автомобилями в качестве обучающей, проверочной и тестовой выборки. Построить модель прогнозирования цен розничных продаж подержанных автомобилей. Прежде всего, мы должны посмотреть на структуру всех данных и значение показателей. Наблюдая за данными, мы можем обнаружить, что некоторые индикаторы представляют собой неструктурированные данные, такие как даты, неизвестные функции и т. д. Если мы хотим построить модель машинного обучения (модель нейронной сети).
Нам нужно использоватьcategorical_embeddingМетод преобразует неструктурированные данные, а затем обрабатывает их. Сначала импортируйте соответствующие библиотеки;
import pandas as pd
import numpy as np
import categorical_embedder as ce
from sklearn.model_selection import train_test_split
from keras import models
from keras import layers
import matplotlib.pyplot as plt
import csv
Наблюдайте за формой всего набора данных и выводите содержимое первых пяти строк наблюдаемого набора данных, некоторые из которых показаны ниже;
train_data = pd.read_csv('train_estimate.csv')
train_data.shape
train_data.head()
Мы видим, что такие индикаторы, как «Trade Time» и «anonymousFeature12» неструктурированы.Мы сначала удаляем первый столбец ордера и последний столбец цены, чтобы подготовиться к построению входных данных. Определите категориальные переменные, отобразите неструктурированные данные и используйте функцию ce.get_embedding_info для получения переменных неструктурированных данных.
X = train_data.drop(['carid', 'price'], axis=1)
y = train_data['carid']
embedding_info = ce.get_embedding_info(X)
embedding_info
Результат показан ниже;
Мы можем видеть часть данных, которые нужно закодировать для обучения, а затем нам нужно использоватьce.get_label_encoded_data: этот функциональный тег используетsklearn.preprocessing.LabelEncoderКодируйте все категориальные переменные (целочисленное кодирование) и возвращайте кадр данных с кодировкой метки для обучения.
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y)
# ce.get_embeddings trains NN, extracts embeddings and return a dictionary containing the embeddings
embeddings = ce.get_embeddings(X_train, y_train, categorical_embedding_info=embedding_info, is_classification=True,epochs=100, batch_size=256)
embeddings
Как показано на рисунке выше, мы используем двухуровневую архитектуру нейронной сети с 1000 * 500 нейронов с активацией «ReLU». Мы можем проверить изменения в закодированных данных, как показано на следующем рисунке;
train_data_encoded['tradeTime']
Затем вам нужно преобразовать обученную кодировку данных из словаря в набор данных;
data = ce.fit_transform(X, embeddings=embeddings, encoders=encoders, drop_categorical_vars=True)
data.head()
На этом этапы использования нейросетевого кодирования завершены.Из заголовка данных вы можете ясно видеть, что структура данных была преобразована в тензоры с плавающей запятой, что соответствует входным требованиям машинного обучения. Для дальнейшего повышения производительности модели эффект также необходимо обрабатывать такими методами, как стандартизация.
4 Резюме
Модели машинного обучения чувствительны к числовым переменным и очень медленны к неструктурированным данным. Традиционный метод категориальных переменных в определенной степени ограничивает возможности алгоритма. При правильных условиях мы можем изучить совершенно новые встраивания для улучшения производительности модели. Категориальные вложения обычно работают хорошо и помогают моделям лучше обобщать.
5. Ссылки
- Categorical Embedder: Encoding Categorical Variables via Neural Networks
- A Deep-Learned Embedding Technique for Categorical Features Encoding
- Глубокое встраивание категориальных переменных (Cat2Vec)
- Categorical Embedding and Transfer Learning
Рекомендуемое чтение
- Метод дифференциального оператора
- Использование PyTorch для построения модели нейронной сети для распознавания рукописного ввода
- Используйте PyTorch для построения моделей нейронных сетей и расчетов обратного распространения
- Как оптимизировать параметры модели, ансамблевые модели
- Руководство по тонкой настройке обнаружения объектов TORCHVISION
- Поваренная книга по развитию нейронных сетей
- Шаги метода анализа основных компонентов (PCA) и детали кода