将包含字典值的字典列表转换为机器学习特征

我想将Google Vision API面部识别的输出转换为机器学习分类器的特征集。对于每个训练实例,我得到一个预测面部的列表,这些面部以字典列表的形式表示,其中值本身是字典,而这些“值字典”的值是分类性质的,如下所示:

$ faces[191:197][{'face_1': {'joy': 'VERY_UNLIKELY',   'surprise': 'UNLIKELY',   'anger': 'VERY_UNLIKELY',   'sorrow': 'VERY_UNLIKELY',   'headwear': 'VERY_UNLIKELY'}}, {}, {}, {'face_1': {'joy': 'VERY_LIKELY',   'surprise': 'LIKELY',   'anger': 'VERY_UNLIKELY',   'sorrow': 'VERY_UNLIKELY',   'headwear': 'VERY_UNLIKELY'},  'face_2': {'joy': 'VERY_UNLIKELY',   'surprise': 'VERY_UNLIKELY',   'anger': 'VERY_UNLIKELY',   'sorrow': 'VERY_UNLIKELY',   'headwear': 'VERY_LIKELY'}}, {'face_1': {'joy': 'VERY_LIKELY',   'surprise': 'VERY_UNLIKELY',   'anger': 'VERY_UNLIKELY',   'sorrow': 'VERY_UNLIKELY',   'headwear': 'VERY_UNLIKELY'},  'face_2': {'joy': 'POSSIBLE',   'surprise': 'VERY_UNLIKELY',   'anger': 'VERY_UNLIKELY',   'sorrow': 'VERY_UNLIKELY',   'headwear': 'VERY_UNLIKELY'}}]

我的目标是将其转换为机器学习可读的格式。我希望使用如下所示的编码(n是整个数据集中预测面部的最大数量):

         joy_1  surprise_1 , ...., anger_n    sorrow_n    headwear_nimg_1      1       2       , ....,  0           0            0img_2      0       0       , ....,  0           0            0img_3      0       0       , ....,  0           0            0img_4      5       4       , ....,  0           0            0  .  .  .

我曾使用sklearn的dictVectorizer和labelEncoder处理其他特征,这些特征是以字典列表的形式存在的,但那些字典的值不是字典,而这个数据源的情况不同。


回答:

我不知道有什么现成的方法可以按用户定义的方式将顺序值(VERY_UNLIKELY,…,VERY_LIKELY)映射到整数,同时还能处理字典中的可能键。

类似下面的方法在这里可能会最简单:

# Include `images` list-of-dicts from question# images = [{'face_1': {'joy': 'VERY_UNLIKELY',#            ...]import numpy as npobservations = ["joy", "surprise", "anger", "sorrow", "headwear"]levels = {    "VERY_UNLIKELY": 0,    "UNLIKELY": 1,    "POSSIBLE": 2,    "LIKELY": 3,    "VERY_LIKELY": 4,}N_IMAGES = len(images)N_OBSERVATIONS = len(observations)N_PEOPLE_PER_IMAGE = 2vector = np.zeros((N_IMAGES, N_PEOPLE_PER_IMAGE * N_OBSERVATIONS))for i, image in enumerate(images):    for j, face in enumerate(image):        if not face:            continue        else:            t = (j * N_OBSERVATIONS)            e = (j * N_OBSERVATIONS) + N_OBSERVATIONS            obs_vector = [levels[image[face][obs]] for obs in observations]            vector[i][t:e] = obs_vectorprint(vector)

结果:

[[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [4. 3. 0. 0. 0. 0. 0. 0. 0. 4.] [4. 0. 0. 0. 0. 2. 0. 0. 0. 0.]]

如果每张图片中最多有8张面孔,可以通过设置N_PEOPLE_PER_IMAGE = 8来轻松扩展这一点。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注