使用许多独特的Tensorflow神经网络处理分类特征

时间:2019-06-26 00:21:03

标签: python tensorflow keras neural-network deep-learning

我正在尝试预测给定用户将预订哪家酒店。我有12个输入列,它们都是分类的,格式为INT。我正在尝试使用TensorflowKeras训练神经网络,以预测具有6个可能唯一值的特征列hotel_cluster

hotel_cluster标签中的数据分布非常均匀:

Histogram of Distribution

问题1:一次热编码

我认为只有在字符串具有分类功能时才需要“一次热编码”。但是后来我读到,当排序时分类特征不表示任何含义时使用(阿根廷= 1,智利= 4并不意味着阿根廷<智利)。

所以我考虑过对我的专栏进行OHEing操作,但是大多数重要的专栏都有很多独特的值(并且可能会有更多在训练期间看不到的值):

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. 如果分类数字数据合理排序,我该不喜欢 是“按原样”吗?

背景和相关代码

这是来自Kaggle的Expedia问题,但减少到6个酒店群集和510k样本,作为课堂上的预测任务提供给我。该任务已经过期,但是我想了解如何仅出于此目的而制作此模型。

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” ...

0 个答案:

没有答案