Python 将DICT作为值的DICT列表转换为ML功能

Python 将DICT作为值的DICT列表转换为ML功能,python,machine-learning,scikit-learn,feature-extraction,feature-engineering,Python,Machine Learning,Scikit Learn,Feature Extraction,Feature Engineering,我想将Google Vision API人脸识别的输出转换为ML分类器的特征集。对于每个训练实例,我会得到一个预测人脸列表,该列表表示为一个字典列表,其中值本身就是字典,这些“值字典”的值本质上是分类的,如下所示: $ faces[191:197] [{'face_1': {'joy': 'VERY_UNLIKELY', 'surprise': 'UNLIKELY', 'anger': 'VERY_UNLIKELY', 'sorrow': 'VERY_UNLIKELY',

我想将Google Vision API人脸识别的输出转换为ML分类器的特征集。对于每个训练实例,我会得到一个预测人脸列表,该列表表示为一个字典列表,其中值本身就是字典,这些“值字典”的值本质上是分类的,如下所示:

$ 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'}}]
我的目标是将其转换为ML可读格式。我想使用这样的编码(n是整个数据集中预测面的最大数量):


我使用了sklearn dictVectorizer和labelEncoder作为其他功能,这些功能是dict列表,但这些dict没有像此数据源那样将dict作为值。

我不知道有什么东西可以在处理顺序值映射的框外工作(
不太可能
,…,
很可能
)以用户定义的方式转换为整数,同时处理字典中可能的键

下面的内容可能是最简单的:

#包括来自问题的dicts的'images'列表
#images=[{'face_1':{'joy':'非常不可能',
#            ...]
将numpy作为np导入
观察结果=[“高兴”、“惊讶”、“愤怒”、“悲伤”、“戴帽子”]
级别={
“不太可能”:0,
“不太可能”:1,
“可能”:2,
“可能”:3,
“很有可能”:4,
}
N_IMAGES=len(图像)
N_观测值=len(观测值)
N_人_每张图像=2
向量=np.0((N张图像,N张人物/N张图像*N张观察值))
对于i,枚举中的图像(图像):
对于j,枚举中的面(图像):
如果不是正面:
持续
其他:
t=(j*N_观测值)
e=(j*N_观测)+N_观测
obs_矢量=[观测中obs的级别[图像[面部][obs]]
向量[i][t:e]=obs_向量
打印(矢量)
结果:

[[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\u PER_image=8

来轻松扩展。能否详细说明所需输出中的行表示什么?是否要将
faces
中的每个值转换为一行?@alexander.Hayes每行表示通过Google Vision API解析的图像。对于图像中的每个人脸,GVA引擎为以下5个字段“喜悦/惊讶/愤怒/悲伤/头饰”中的每一个字段生成分数。预测分数分为“非常不可能/不可能/可能/可能/非常可能”类别。这些类别不是独立的,因此希望将它们转换为0-5之间的分数(0表示“未观察到”,5表示“极有可能”)。每个图像中有0-8张脸,因此我将以40个特征结束(8张潜在脸中的每一张都有5个面部表情)。希望它有意义吗?总之,是的,所需输出中的每一行代表一个图像。您可以做两件事。将dict转换为dataframe。然后使用分类编码器将stings编码为整数。首先将其转换为df。然后通过简单的谷歌搜索可以生成编码解决方案。非常感谢Alexander!这看起来是一个不错的方法关于它。我会马上试用。/UlrikUpdate:效果很好,Alexander。再次感谢。很好!如果它解决了问题,请随意接受答案。如果您更喜欢
pandas.DataFrame
路线,可能会有一个很好的替代解决方案(就我个人而言,对于这类问题,我更喜欢
numpy
,但
pandas
确实使一些下游分析更容易)。
[[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.]]