Как я могу хранить одно горячее кодирование как объект? - PullRequest
0 голосов
/ 23 сентября 2019

Для начала немного об архитектуре моей модели.

Входные данные для моей модели keras довольно просты:

  • Категориальная переменная A
  • Категориальная переменная B
  • Числовой вход C надиапазон [0,1].

Модель имеет один выход:

  • число на [0,1]

При обучении модели мой вводdata - это фрейм данных, полученный из базы данных SQL с использованием pd.read_sql().Я однозначно кодирую категориальные переменные A и B (которые находятся в col1 adn col2 кадра данных original_data соответственно) с помощью следующей функции:

from keras import utils as np_utils

def preprocess_categorical_features(self):
        col1 = np_utils.to_categorical(np.copy(self.original_data.CURRENT_RTIF.values))
        col2 = np_utils.to_categorical(np.copy(self.original_data.NEXT_RTIF.values))
        cat_input_data = np.append(col1,col2,axis=1)
        return cat_input_data

Позже, когдаМне нужно делать прогнозы из этой модели, входные данные поступают из прямой трансляции из RabbitMQ в форме словаря.Эти данные RabbitMQ должны обрабатываться собственной (другой) функцией reprocess_categorical_features().

. Это подводит меня к моему вопросу: как я могу гарантировать, что одноразовые кодировки точно совпадают, независимо от того,m предварительная обработка данных из базы данных или канала rabbitMQ?

Кодирование One-Hot для A, применяемое к данным базы данных:

|---------------------|------------------|
|          A          | One-Hot-Encoding |
|---------------------|------------------|
|       "coconut"     |      <0,1,0,0>   |
|---------------------|------------------|
|       "apple"       |      <1,0,0,0>   |
|---------------------|------------------|
|       "quince"      |      <0,0,0,1>   |
|---------------------|------------------|
|       "plum"        |      <0,1,0,0>   |
|---------------------|------------------|

Кодирование One-Hot для A, применяемое кДанные RabbitMQ (они должны быть одинаковыми):

|---------------------|------------------|
|          A          | One-Hot-Encoding |
|---------------------|------------------|
|       "coconut"     |      <0,1,0,0>   |
|---------------------|------------------|
|       "apple"       |      <1,0,0,0>   |
|---------------------|------------------|
|       "quince"      |      <0,0,0,1>   |
|---------------------|------------------|
|       "plum"        |      <0,1,0,0>   |
|---------------------|------------------|

Можно ли мне сохранить кодировки в виде фрейма данных, numpy ndarray или словаря, чтобы я мог передать кодировки из функциичто предварительно обрабатывает мои тренировочные данные, до функции, которая предварительно обрабатывает мои входные данные?Я открыт для использования других библиотек, кроме Keras, для OHE, но мне интересно узнать, есть ли способ сделать это, используя функцию keras ' to_categorical , которую я сейчас использую.

1 Ответ

0 голосов
/ 24 сентября 2019

Вместо того, чтобы полагаться на метод * keras utils.to_categorical, я решил использовать sklearn.preprocessing.OneHotEncoder.Это позволило мне объявить объект горячего кодирования, self.encoder при работе с обучающими данными:

class TrainingData:
    def preprocess_categorical_features(self):
        # declare OneHotEncoder object to save for later
        self.encoder = OneHotEncoder(sparse=False)

        # fit encoder to data
        self.encoder.fit(self.original_data.CURRENT_RTIF.values.reshape(-1,1))

        # perform one-hot-encoding on columns 1 and 2 of the training data
        col1 = self.encoder.transform(self.original_data.CURRENT_RTIF.values.reshape(-1,1))
        col2 = self.encoder.transform(self.original_data.NEXT_RTIF.values.reshape(-1,1))

        # return on-hot-encoded data as a numpy ndarray
        cat_input_data = np.append(col1,col2,axis=1)
        return cat_input_data

Позже я мог бы повторно использовать этот кодер (передав его в качестве аргумента,training_data_ohe_encoder) к методу, который обрабатывает входные данные, необходимые для окончательного прогнозирования.

class LiveData:
    def preprocess_categorical_features(self, training_data_ohe_encoder):
        # notice the training_data_ohe_encoder parameter; this is the 
        # encoder attribute from the Training Data Class.

        # one-hot-encode the live data using the training_data_ohe_encoder encoder
        col1 = training_data_ohe_encoder.transform(np.copy(self.preprocessed_data.CURRENT_RTIF.values).reshape(-1, 1))
        col2 = training_data_ohe_encoder.transform(np.copy(self.preprocessed_data.NEXT_RTIF.values).reshape(-1, 1))

        # return on-hot-encoded data as a numpy ndarray
        cat_input_data = np.append(col1,col2,axis=1)
        return cat_input_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...