【火炉炼AI】机器学习002-标记编码方法

470 阅读2分钟

【火炉炼AI】机器学习002-标记编码方法

(本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

监督学习中的标记的形式有各种各样,比如对于人脸识别的标记,可能是[“小红”,“小花”,“翠花”。。。],这些标记对于机器学习来说,如同天书一般,故而为了让机器学习“看懂”这些标记,需要将这些文本类的标记进行一定的编码,形成比如【3,2,4,0,…】等形式.


1. 编码方法

有很多python模块可以实现对标记进行编码,此处使用scikit-learn模块中的preprocessing包来进行编码。Talk is cheap, just show me the code….

# *****************对label进行编码********************************
from sklearn import preprocessing

# 构建编码器
encoder=preprocessing.LabelEncoder() # 先定义一个编码器对象
raw_labels=['翠花','张三','王宝强','芙蓉姐姐','凤姐','王宝强','凤姐']
encoder.fit(raw_labels) # 返回自己的一个实例
print('编码器列表:{}'.format(encoder.classes_)) # 返回编码器中所有类别,已经排除了重复项
for index,item in enumerate(encoder.classes_):
    print('{} --> {}'.format(item,index))
    
# 使用编码器来编码新样本数据
need_encode_labels=['王宝强','芙蓉姐姐','翠花']
# need_encode_labels=['王宝强','芙蓉姐姐','翠花','无名氏'] 
# '无名氏'不存在编码器列表中,会报错
encoded_labels=encoder.transform(need_encode_labels)
print('\n编码之前的标记:{}'.format(need_encode_labels))
print('编码之后的标记:{}'.format(encoded_labels))

# 使用编码器将编码数字解码成原来的文本标记,注意最大值不能超过编码器中的长度
encoded=[1,3,0,4]
# encoded=[1,3,0,4,5] # 5不存在与编码器中,故报错
decoded_labels=encoder.inverse_transform(encoded)
print('\n已经编码的标记代码:{}'.format(encoded))
print('解码后的标记:{}'.format(decoded_labels))

-------------------------------------输---------出--------------------------------

编码器列表:['凤姐' '张三' '王宝强' '翠花' '芙蓉姐姐'] 凤姐 --> 0 张三 --> 1 王宝强 --> 2 翠花 --> 3 芙蓉姐姐 --> 4

编码之前的标记:['王宝强', '芙蓉姐姐', '翠花'] 编码之后的标记:[2 4 3]

已经编码的标记代码:[1, 3, 0, 4] 解码后的标记:['张三' '翠花' '凤姐' '芙蓉姐姐']

--------------------------------------------完-------------------------------------

########################小**********结###############################

1,使用sklearn的preprocessing模块对标记进行编码是非常简单的,首先构建一个基于所有标记数据的编码器,然后使用该编码器进行编码或解码

2,需要注意,在编码时,如果遇到编码器中没有的标记时会报错,在解码时也一样。

#################################################################


注:本部分代码已经全部上传到(我的github)上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译