python sklearn preprocessing OneHotEncoder 独热编码 One-Hot

文章目录

  • 一、One-Hot 简介
  • 二、小案例
    • 2.1 加载库
    • 2.2 随机生成数据集 --> dataframe
    • 2.3 通过 LabelEncoder 将分类变量打上数值标签
    • 2.4 进行one-hot编码
    • 2.5 转成 dataframe 形式
    • 2.6 columns 重命名
  • 三、自定义 OneHot 函数

一、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=['一键三连'])

python sklearn preprocessing OneHotEncoder 独热编码 One-Hot_第1张图片

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 将分类变量转为数值型

python sklearn preprocessing OneHotEncoder 独热编码 One-Hot_第2张图片

2.4 进行one-hot编码

enc = OneHotEncoder()          # 初始化
enc.fit(data[['一键三连']])    # 模型拟合。注意:data[['一键三连']]是一个dataframe,与data['一键三连']是一个series不同
array_data = enc.transform(data[['一键三连']]).toarray()  # one-hot 编码后的结果,二维数组形式

python sklearn preprocessing OneHotEncoder 独热编码 One-Hot_第3张图片

2.5 转成 dataframe 形式

df = pd.DataFrame(array_data)

python sklearn preprocessing OneHotEncoder 独热编码 One-Hot_第4张图片

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 重命名

python sklearn preprocessing OneHotEncoder 独热编码 One-Hot_第5张图片

三、自定义 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:
python sklearn preprocessing OneHotEncoder 独热编码 One-Hot_第6张图片
one-hot 结果:
python sklearn preprocessing OneHotEncoder 独热编码 One-Hot_第7张图片

  • 参考:《 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

你可能感兴趣的:(python,sklearn,机器学习)