-
标签编码LabelEncoder
若原数据有n个不同的元素,则将原数据中的元素按一定规律(如字典序)映射为[0, n)内的一个整数。例如,数据有三个不同元素,‘autumn’–0,‘spring’–1,‘summer’–2
-
独热编码OneHotEncoder
若原数据有n个不同的元素,则将原数据的元素映射为n维向量,向量中只有一位1,其余全0,这个“1”在向量中的位置索引就是标签编码的值。例如,
‘autumn’-–0–100,
‘spring’–—1–010,
‘summer’–2–001
当然,因为元素之间没有关系才采用独热编码,那么1所在的位置肯定不必按照标签编码的顺序,可以任意指定顺序,只需要不同元素1的位置不同就行。
注意全0的one-hot编码向量代表缺失。
示例:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2021/1/2 15:22
# @Author : Jin Echo
"""
fit_transform与fit、tranform区别
1. fit_transform 一步到位,输入所有原编码数据,输出新编码数据
2. fit:将原编码去重,并拟合出原编码到新编码的对应关系,相当于得到映射关系
transform:由fit得到映射关系后,就可以输入原编码,得到对应的新编码
显然transform输入的原编码不能是fit所没有的
方法二更灵活
注意:fit之后,再用fit_transform会进行覆盖
"""
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
data = ['spring', 'summer', 'autumn', 'spring']
data = np.array(data)
print(data)
# label encode标签编码(0, n-1)
label_encoder = LabelEncoder()
label_encoder.fit(data)
print(label_encoder.classes_) # 对原始编码去重,相当于np.array(set(data))
integer_encoded = label_encoder.transform(data) # 对原数据编码
print(integer_encoded)
print(label_encoder.transform(['summer', 'spring'])) # 对指定数据编码
# print(label_encoder.transform(['winter'])) # 错误,fit的时候原数据没有winter
print('---------------------------------------------------------')
# one hot encode独热编码
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1) # 将标签编码排成列
onehot_encoded = onehot_encoder.fit_transform(integer_encoded) # 先得到标签编码,再将标签编码转换为one hot编码
print(onehot_encoded) # shape=(4, 3)
# print(label_encoder.transform(label_encoder.classes_))
print(onehot_encoder.fit_transform(label_encoder.transform(label_encoder.classes_).reshape(3, 1)))
inverted = label_encoder.inverse_transform([np.argmax(onehot_encoded[2, :])]) # argmax找到1所在的位置索引
print(inverted)
封装成函数:
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
def one_hot(x):
"""
:param x: 输入待编码的数据(列表或一维ndarray数组)
:return: 编码后的数据,映射关系字典
"""
label_encoder = LabelEncoder()
label_encoder.fit(x)
integer_encoded = label_encoder.transform(x) # 对原数据进行标签编码
x_set = label_encoder.classes_
integer_encoded_set = label_encoder.transform(x_set) # 对原数据去重后进行标签编码
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
# 对原数据在标签编码的基础上进行独热编码
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
integer_encoded_set = integer_encoded_set.reshape(len(integer_encoded_set), 1)
# 对去重数据,在标签编码的基础上进行独热编码
onehot_encoded_set = onehot_encoder.fit_transform(integer_encoded_set)
# 设计字典
x_set_dict = dict(zip(x_set, onehot_encoded_set))
return onehot_encoded, x_set_dict
data = ['spring', 'summer', 'autumn', 'spring']
data = np.array(data)
data_onehot, data_dict = one_hot(data)
print(data_onehot)
print(data_dict)
print(data_dict['spring'])