sklearn 独热编码onehot、标签编码(代码示例)

  1. 标签编码LabelEncoder

    若原数据有n个不同的元素,则将原数据中的元素按一定规律(如字典序)映射为[0, n)内的一个整数。例如,数据有三个不同元素,‘autumn’–0,‘spring’–1,‘summer’–2

  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'])
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值