文章目录
一、One-Hot 简介
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
二、小案例
2.1 加载库
import random
import pandas as pd
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
2.2 随机生成数据集 --> dataframe
# 随机生成数据集 --> dataframe
n = 5
data = pd.DataFrame([random.choice(['点赞','收藏','关注']) for i in range(n)],columns=['一键三连'])
2.3 通过 LabelEncoder 将分类变量打上数值标签
# 通过 LabelEncoder 将分类变量打上数值标签
x = data['一键三连']
lb = LabelEncoder() # 初始化
x_pre = lb.fit_transform(x) # 模型拟合
x_dict = dict([[i,j] for i,j in zip(x,x_pre)]) # 生成编码字典--> {'收藏': 1, '点赞': 2, '关注': 0}
print("生成的编码字典:",x_dict)
data['一键三连_number'] = [x_dict[i] for i in x] # 通过 LabelEncoder 将分类变量转为数值型
2.4 进行one-hot编码
enc = OneHotEncoder() # 初始化
enc.fit(data[['一键三连']]) # 模型拟合。注意:data[['一键三连']]是一个dataframe,与data['一键三连']是一个series不同
array_data = enc.transform(data[['一键三连']]).toarray() # one-hot 编码后的结果,二维数组形式
2.5 转成 dataframe 形式
df = pd.DataFrame(array_data)
2.6 columns 重命名
inverse_dict = dict([val,key] for key,val in x_dict.items()) # 反转 x_dict 的键、值
df.columns = [inverse_dict[i] for i in df.columns] # columns 重命名
三、自定义 OneHot 函数
def OneHot(x):
'''
功能:one-hot 编码
传入:需要编码的分类变量
返回:返回编码后的结果,形式为 dataframe
'''
# 通过 LabelEncoder 将分类变量打上数值标签
lb = LabelEncoder() # 初始化
x_pre = lb.fit_transform(x) # 模型拟合
x_dict = dict([[i,j] for i,j in zip(x,x_pre)]) # 生成编码字典--> {'收藏': 1, '点赞': 2, '关注': 0}
x_num = [[x_dict[i]] for i in x] # 通过 x_dict 将分类变量转为数值型
# 进行one-hot编码
enc = OneHotEncoder() # 初始化
enc.fit(x_num) # 模型拟合
array_data = enc.transform(x_num).toarray() # one-hot 编码后的结果,二维数组形式
# 转成 dataframe 形式
df = pd.DataFrame(array_data)
inverse_dict = dict([val,key] for key,val in x_dict.items()) # 反转 x_dict 的键、值
df.columns = [inverse_dict[i] for i in df.columns] # columns 重命名
return df
if __name__ == "__main__":
# 随机生成数据集 --> dataframe
n = 5
data = pd.DataFrame([random.choice(['点赞','收藏','关注']) for i in range(n)],columns=['一键三连'])
df = OneHot(data['一键三连'])
分类变量 data:
one-hot 结果:
- 参考:《 python sklearn preprocessing LabelEncoder 标签编码》 https://blog.csdn.net/small__roc/article/details/122882592?spm=1001.2014.3001.5501
- 参考:《python 中one—hot 三种编码方式》 https://blog.csdn.net/gdh756462786/article/details/79161525