通过map创建单标签分类变量的onehot编码的好方式

众所周知,map函数是python中的一个内置函数,它对指定的函数进行映射返回相应的值。

map(function,iterable)
#function指的就是相应的函数
#iterable则是指所需要处理的序列

其基本用法如下:

def add(x):
    return x**2			#计算x的平方

lists = range(5)       #创建包含 0-4 的列表
a = map(add,lists)      #计算 0-4 的平方,并映射回a
print(a)                # 返回一个迭代器
print(list(a))          # 通过list() 转换为列表。结果为:[0, 1, 4, 9, 16]


# 使用lambda匿名函数的形式复现上面的代码会更简洁一些
print(list(map(lambda x:x**2,range(11))))   # 结果为:[0, 1, 4, 9, 16]

那么该如何使用map函数根据一列分类值创建一个onehot编码呢?该方法是查看GCN的开源代码知道的。

我们以cora数据集为例:

import numpy as np
import scipy.sparse as sp
path="./data/cora/"
dataset = 'cora'
idx_features_labels = np.genfromtxt("{}{}.content".format(path, dataset),dtype=np.dtype(str))#读取txt文件
print(idx_features_labels[0:5])#可以发现最后一列是相应的标签
"""
[['31336' '0' '0' ... '0' '0' 'Neural_Networks']
 ['1061127' '0' '0' ... '0' '0' 'Rule_Learning']
 ['1106406' '0' '0' ... '0' '0' 'Reinforcement_Learning']
 ['13195' '0' '0' ... '0' '0' 'Reinforcement_Learning']
 ['37879' '0' '0' ... '0' '0' 'Probabilistic_Methods']]
"""

我们可以发现该数据集的最后一列是一组分类变量,要将其转化为onehot编码则可以通过如下方式

labels = idx_features_labels[:, -1]#首先读取对应的分类变量
classes = set(labels)#通过set获取其类别
"""
{'Reinforcement_Learning', 'Genetic_Algorithms', 'Probabilistic_Methods', 'Theory', 'Neural_Networks', 'Rule_Learning', 'Case_Based'}
"""
classes_dict = {c: np.identity(len(classes))[i, :] for i, c in enumerate(classes)}
#np.identity会生成一个长度为len(classes)的单位矩阵,不难发现单位矩阵的每一行刚好对应某一分类的onehot编码,通过迭代对其进行分配
"""
{'Reinforcement_Learning': array([1., 0., 0., 0., 0., 0., 0.]), 'Genetic_Algorithms': array([0., 1., 0., 0., 0., 0., 0.]), 'Probabilistic_Methods': array([0., 0., 1., 0., 0., 0., 0.]), 'Theory': array([0., 0., 0., 1., 0., 0., 0.]), 'Neural_Networks': array([0., 0., 0., 0., 1., 0., 0.]), 'Rule_Learning': array([0., 0., 0., 0., 0., 1., 0.]), 'Case_Based': array([0., 0., 0., 0., 0., 0., 1.])}
"""
labels_onehot = np.array(list(map(classes_dict.get, labels)),
                         dtype=np.int32)
借助map通过字典的get函数,通过labels中的原来的文字标签进行查找字典中对应的编码并进行返回

这一整个流程可以通过这一个函数进行实现,传入相应的labels即可获得one_hot编码:

def encode_onehot(labels):
    classes = set(labels)
    classes_dict = {c: np.identity(len(classes))[i, :] for i, c in
                    enumerate(classes)}
    labels_onehot = np.array(list(map(classes_dict.get, labels)),
                             dtype=np.int32)
    return labels_onehot

你可能感兴趣的:(分类,python)