如何将具有混合数据类型的3D数组加载到Tensorflow中进行训练?

时间:2019-01-31 23:17:18

标签: python tensorflow data-science

我正在使用看起来像这样的数据集-

PERSON1 = [["Person1Id", "Rome", "Frequent Flyer", "1/2/2018"],["Person1Id", "London", "Frequent Flyer", "3/4/2018"],["Person1Id", "Paris", "Frequent Flyer", "2/4/2018"], ...]
PERSON2 = [["Person2Id", "Shenzen", "Frequent Flyer", "1/2/2018"],["Person2Id", "London", "Frequent Flyer", "2/6/2018"],["Person2Id", "Hong Kong", "Not Frequent Flyer", "1/3/2017"], ...]
PERSON3 = [["Person3Id", "Moscow", "Frequent Flyer", "1/2/2018"],["Person3Id", "London", "Frequent Flyer", "3/4/2018"],["Person3Id", "Paris", "Frequent Flyer", "2/4/2018"], ...]
...

TRAIN_X = [ 
    PERSON1, PERSON2, PERSON3, ..., PERSONN
]

TRAIN_Y = [
    1, 0, 1, ..., 1
]

根据训练数据,有些人属于1类,有些人属于0类。 (实际使用的数据数组更长,这是简化版本。)

我的问题是-给定这种数据结构-如何正确将其加载到Tensorflow中以训练神经网络系统?我已经使用了诸如Iris数据集,MNIST等更简单的数据集。我不知道如何处理像这样的更复杂的真实数据,而且我似乎找不到任何文档/资源/示例代码做类似的事情。

我认为这里的第一步是需要对数据进行平整,规范化等操作-但是,我不确定如何进行处理。

2 个答案:

答案 0 :(得分:1)

您需要对该数据进行一些更重的预处理。神经网络无法直接处理文本数据,因此您需要进行一些嵌入。

根据特征向量的类型,您可能需要对数据进行某种类型的编码为数字by onehot or label encoding或将其转换为地理坐标(如果对任务有意义)。

您可能会对城市名称使用一键编码,因为它们是分类数据,但是您希望将有序数据(例如日期)转换为数字。 并考虑哪些数据对任务有用。例如。如果您要使用NN解决的问题是否使用了人员ID。

此外,在输入处理之后,您可能会拥有不同形状的张量,因此最好将输入拆分为多个变量(例如,如果您将某些特征编码为“一键通”,而有些则没有)。

还要记住,您需要normalize inputs到网络,因此请相应地选择表示形式。

恐怕没有为此的即插即用解决方案。

答案 1 :(得分:0)

您似乎拥有分类数据。并假设这就是您想要的样子。

如果给定您的数据量,这可以用纯python进行预处理(例如,运行一次预处理并保存预处理的数据,而不是每次都进行重新处理)。这将意味着具有以下内容:

import numpy as np

def one_hot(index, max_dim):
    return np.eye(max_dim)[index]

destinations = {
    "Moscow": 0,
    "London": 1,
    # etc.
}
one_hot_destinations = {
    k: one_hot(v, len(destinations)) 
    for k, v in destinations.items()
}
def process_loc(loc):
    return one_hot_destinations[loc]

# do some similar processing to other properties of a "PERSON"
# so that you represent them in a vector / scalar way then:

def process_person(person_item):
    pid, loc, status, date = person
    return np.concatenate(
        [
            process_pid(pid), 
            process_loc(loc), 
            process_status(status), 
            process_date(date)
        ],
        axis=0)

TRAIN_X = [[process_person(item) for item in p] for p in PERSONS]

或者您可以使用tensorflow即时用C ++处理它 因此,您可以做的是table_lookup,就像查看字典一样:

dictionary = tf.contrib.lookup.index_table_from_file(dictionary, num_oov_buckets=0)

您必须了解,鉴于给定的上下文和代码量,与MatějRačinský相比,我很难尝试进一步帮助您。例如,我们不知道您的下游任务是什么。

如果您想做一些与NLP相关的事情,也许您可​​以看一下我几个月前写的博客文章:Multi-label Text Classification with Tensorflow,其中包括使用table_lookup进行数据预处理