Работайте с категориальными функциями с помощью множества уникальных нейронных сетей Tensorflow - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь предсказать, какой отель забронирует данный пользователь. У меня есть 12 входных столбцов, которые являются категориальными и имеют формат INT. Я пытаюсь обучить нейронную сеть, используя Tensorflow и Keras для прогнозирования столбца функций hotel_cluster, который имеет 6 возможных уникальных значений.

Распределение данных достаточно равномерно в метке hotel_cluster:

Histogram of Distribution

Проблема 1: одна горячая кодировка

Я думал, что One Hot Encoding нужно было только тогда, когда в категориальных чертах есть строки. Но потом я прочитал, что он используется, когда категориальные особенности ничего не значат при заказе (Аргентина = 1, Чили = 4 не подразумевает Ардженина <Чили). </p>

Итак, я подумал о том, чтобы использовать мои столбцы, но большинство важных столбцов имеют МНОЖЕСТВО уникальных значений (и могут иметь больше, которые не видны во время обучения):

Col Name                   | Number of Unique Values
---------------------------------------------
site_name :                | 42
user_location_country :    | 218
user_location_region :     | 873
user_location_city :       | 20262
srch_adults_cnt :          | 9
srch_children_cnt :        | 10
srch_rm_cnt :              | 8
srch_destination_id :      | 12713
srch_destination_type_id : | 8
is_booking :               | 2
hotel_continent :          | 7
hotel_country :            | 176
  1. Как мне поступить с категориальными числовыми значениями в сценарии DNN?
  2. Как мне работать с категориальными значениями, которые не видели во время тренировки?
  3. Какие существуют методы для подготовки категориальных числовых данных использовать в Tensorflow?
  4. Если категорические числовые данные имеют смысл упорядочены, я должен оставить это как есть?

Справочная информация и соответствующий код

Это проблема Expedia от Kaggle, но она уменьшена до 6 гостиничных кластеров и 510 тыс. Выборок, которые мне дали в качестве задачи предсказания в классе. Задача уже просрочена, но я хочу понять, как сделать эту модель только ради нее.

import tensorflow as tf
tf.enable_eager_execution()
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split


# DATA
to_predict = pd.read_csv('test.csv')
df = pd.read_csv('train.csv')
train, test = train_test_split(df, test_size=.2, train_size=.80)
train, val = train_test_split(train, test_size=.2)

# Features and target:
features = ['site_name', 'user_location_country', 'user_location_region',  'user_location_city', 'srch_adults_cnt', 'srch_children_cnt', 'srch_rm_cnt', 'srch_destination_id', 'srch_destination_type_id', 'is_booking', 'hotel_continent', 'hotel_country']

target = 'hotel_cluster'

# Pre Keras processing
X_train = train[features].values
X_test = test[features].values
X_val = val[features].values

label_bin = LabelBinarizer()
y_train = label_bin.fit_transform(train['hotel_cluster'].values)
y_test = label_bin.transform(test['hotel_cluster'].values)
y_val = label_bin.transform(val['hotel_cluster'].values)

X_to_pred = dft[features].values

# Model and fitting
model = tf.keras.Sequential([
  layers.Dense(128, activation='relu', input_shape=(12,)),
  layers.Dense(64, activation='relu'),
  layers.Dense(len(label_bin.classes_), activation='softmax')
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'], run_eagerly=True)

H = model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=4, batch_size=32)

# Predictions
predictions = model.predict(X_to_pred)

прогнозы выглядят так:

array([[0., 1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.],
       ...,
       [0., 1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.]], dtype=float32)

Ожидаемое поведение

Я ожидаю, что прогнозы будут представлять собой матрицу, полную чисел, которые в каждой строке представляют вероятность того, что метка является каждым из ее уровней. В настоящее время похоже, что модель не работает, и я думаю, что это из-за неправильной предварительной обработки данных.

Я не знаю, как сделать «train.csv» доступным для вас, ребята ...

...