类别型特征的编码方法

news2024/11/18 19:53:18

机器学习模型中除了决策树等少数模型能直接处理字符串形式的类别型特征输入外,逻辑回归、支持向量机等模型的输入必须是数值型特征才能在矩阵上执行线性代数计算,所以参加计算的特征必须是数值型的,对于非数值型的特征需要进行编码处理。对于离散属性(也称为分类变量或类别特征)的编码,我们可以使用5种方式来实现,分别是标签编码、序列编码、独热编码、频数编码和目标编码。

标签编码

标签编码(Label Encoding)将每个类别映射到从0开始的整数值。需满足的条件是,特征值间没有明显的顺序关系,而且转化后的数值没有具体含义,只做类别区分。标签编码是给某一列数据编码,所以常用于给标签(label)编码。
举例来说,性别[‘男’,‘女’]可以编码为[0,1],血型[‘O’,‘A’,‘B’,‘AB’]可以编码为[0,1,2,3]。

sklearn.preprocessing.LabelEncoder实现标签编码

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
city_list = ["paris", "paris", "tokyo", "amsterdam"]
le.fit(city_list)
city_list_encode = le.transform(city_list)  # 进行Encode
city_list_decode = le.inverse_transform(city_list_le)  # 进行decode
print(f'原始数据为:{city_list}')
print(f'list中含有的类别有:{le.classes_}') 
print(f'编码后:{city_list_encode}') 
print(f'解码后:{city_list_decode}') 

原始数据为:[‘paris’, ‘paris’, ‘tokyo’, ‘amsterdam’]
list中含有的类别有:[‘amsterdam’ ‘paris’ ‘tokyo’]
编码后:[1 1 2 0]
解码后:[‘paris’ ‘paris’ ‘tokyo’ ‘amsterdam’]

Pandas.factorize()实现标签编码

import pandas as pd
df = pd.DataFrame(['green','bule','red','bule','green'],columns=['color'])
print(pd.factorize(df['color']))
print("编码后:",pd.factorize(df['color'])[0])
print("类别索引:",pd.factorize(df['color'])[1])

(array([0, 1, 2, 1, 0], dtype=int64), Index([‘green’, ‘bule’, ‘red’], dtype=‘object’))
编码后: [0 1 2 1 0]
类别索引: Index([‘green’, ‘bule’, ‘red’], dtype=‘object’)

序列编码

序列编码(Ordinal Encoding)是一种将离散特征的各个类别映射为整数序列的方法。序列编码适用于有序特征,其中类别之间存在一定的顺序关系,但没有明确的意义。
比如,学历[‘本科’,‘硕士’,‘博士’]存在内在逻辑顺序关系,‘本科’ < ‘硕士’ < ‘博士’,可以编码为[1,2,3],转换后保留了逻辑关系。而对于“颜色”这样的类别,'蓝色’与’绿色’显然是没有逻辑顺序的。

sklearn.preprocessing.OrdinalEncoder实现序列编码

import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
degree_df = pd.DataFrame({'degree':['硕士', '博士', '本科', '硕士']})
degree_categories=['本科','硕士','博士']  # 自定义标签序列,按该顺序从0开始编码
oe = OrdinalEncoder(categories=[degree_categories]) #创建OrdinalEncoder对象
degree_df_encode = oe.fit_transform(degree_df[['degree']])  # 进行Encode
degree_df_decode = oe.inverse_transform(degree_df_encode)  # 进行decode
print('原始数据为:',degree_df['degree'].values)
print('自定义有序类别为:',oe.categories_) 
print('编码后:',degree_df_encode.T) 
print('解码后:',degree_df_decode.T) 

原始数据为: [‘硕士’ ‘博士’ ‘本科’ ‘硕士’]
自定义有序类别为: [array([‘本科’, ‘硕士’, ‘博士’], dtype=object)]
编码后: [[1. 2. 0. 1.]]
解码后: [[‘硕士’ ‘博士’ ‘本科’ ‘硕士’]]

DataFrame.map()实现序列编码

import pandas as pd
degree_list = ["硕士", "博士", "本科", "硕士"]
df = pd.DataFrame(degree_list,columns=['学历'])
ord_map = {'本科':1,'硕士':2,'博士':3}
encode_df = df['学历'].map(ord_map)
print('原始数据为:',df['学历'].values)
print('编码后:',encode_df.values) 

原始数据为: [‘硕士’ ‘博士’ ‘本科’ ‘硕士’]
编码后: [2 3 1 2]

独热编码

独热编码(One-Hot Encoding)将每个离散属性的每个类别创建一个新的二进制特征。对于每个样本,只有一个二进制特征为1,表示它属于对应的类别,其他特征为0。这种方法适用于具有有限数量的类别。适合于分类属性中的各个特征值彼此间无序、无关联,且特征值的取值数量较少的情况。
比如颜色特征有3种:红色、绿色和黄色,转换成独热编码分别表示为:001, 010, 100。

优缺点:
优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。使回归的距离计算更合理。
缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。

sklearn.preprocessing.OneHotEncoder实现独热编码

from sklearn.preprocessing import OneHotEncoder
import numpy as np
city_arr = np.array(["苏州", "无锡", "苏州", "上海"])
city_df = city_arr.reshape(-1,1)
ohe = OneHotEncoder()
city_enc = ohe.fit_transform(city_df)    # fit来学习编码,返回稀疏矩阵
print('原始数据为:',city_arr)
print('编码后:',city_enc.toarray())
print('含有的类别有:',ohe.categories_)
print('OneHot的类别有:',ohe.get_feature_names())

原始数据为: [‘苏州’ ‘无锡’ ‘苏州’ ‘上海’]
编码后: [
[0. 0. 1.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]]
含有的类别有: [array([‘上海’, ‘无锡’, ‘苏州’], dtype=‘<U2’)]
OneHot的类别有: [‘x0_上海’ ‘x0_无锡’ ‘x0_苏州’]

Pandas.get_dummies()实现独热编码

import pandas as pd
df = pd.DataFrame([
    ['green', 'BMW', 2017],
    ['blue', 'BMW', 2015],
    ['yellow', 'Lexus', 2018],
])
df.columns = ['color', 'make', 'year']
df_processed = pd.get_dummies(df, prefix_sep="_", columns=df.columns[:-1])
print('编码后:\n',df_processed)

请添加图片描述

频数编码

频数编码(Count Encoding)将每个类别替换为该类别在数据集中的频数或出现次数。这种编码方法可以提供关于类别的频率信息,但可能引入一定的信息泄漏。若类别的频数可能与目标变量之间存在相关性,则适合使用频数编码。如不同城市的人爱吃辣的程度:四川地区选择爱吃辣的频数>江苏地区选择爱吃辣的频数。

优点:

  1. 信息保留:频数编码将分类特征转换为数值特征,可以帮助模型更好地理解分类特征之间的关系,同时保留了部分类别信息。
  2. 提供有用的统计信息:频数编码利用了每个类别在数据集中的频次信息,不仅提供了类别本身的信息,还提供了关于类别分布的统计信息。这有助于模型更好地理解数据。
  3. 处理缺失数据和噪声鲁棒性:相对于独热编码等编码方法,频数编码更具有噪声鲁棒性,因为它将类别信息转换为连续的数值特征,并减少了维度空间的需求。这可能有助于减少过拟合和处理缺失数据的影响。
  4. 离群值敏感:对离群值很敏感,所以结果可以归一化或者转换一下(例如使用对数变换)。未知类别可以替换为1。

缺点:

  1. 引入偏见:频数编码会将分类特征的不同类别替换为它们在数据集中出现的频次,如果某个类别在数据集中的频次很高,可能会导致该类别的编码过大,从而引入偏见。
  2. 处理高基数特征的挑战:当分类特征具有高基数(即类别数目非常多)时,频数编码可能引入过多的维度,从而增加模型的复杂度和计算成本。
  3. 丢失部分信息:频数编码通过将类别信息转换为数值特征来进行编码,可能会丢失一部分类别本身的信息。这可能会影响模型对某些类别的学习能力。

category_encoders.CountEncoder()实现频数编码

import category_encoders as ce
citys = ['Peking', 'Peking', 'Shanghai', 'Peking', 'Guangzhou', 'Shanghai']
count_enc = ce.CountEncoder()
df_count = count_enc.fit_transform(citys)
print('编码后:',df_count.values.T)

编码后: [[3 3 2 3 1 2]]

DataFrame.groupby()实现频数编码

import pandas as pd
data = pd.DataFrame([
    ['green', 'Chevrolet', 2017],
    ['blue', 'BMW', 2015],
    ['yellow', 'Lexus', 2018],
    ['yellow', 'audi', 2023]
])
data.columns = ['color', 'make', 'year']
data_count = data.groupby(by='color',as_index=False)['color'].agg(['count'])
print(data_count)

color   count
blue     1
green   1
yellow   2

目标编码

目标编码(Target Encoding)将离散属性的每个类别编码为其在目标变量上的平均值或其他统计信息。目标编码能够捕获类别与目标变量之间的关联性,但需要注意信息泄漏和过拟合的问题。
若分类编码与目标遍历间具有一定关联性,则适合使用目标编码,如一个城市的房价与其所处的区域有很大关系,使用目标编码计算同一个区域的平均房价来代替区域属性上的离散值:上海黄埔区的目标编码>上海嘉定区的目标编码。

优点:

  1. 信息丰富性:目标编码能够捕获分类变量与目标变量之间的关联性,将目标变量的统计信息编码为数值型特征。这样,模型可以利用更多的相关信息进行训练,提高模型的性能。
  2. 保留类别信息:相比于使用独热编码或标签编码等方法,目标编码能够保留原始的类别信息。这对于一些具有有序关系的分类变量,如年龄组、评级等,能够提供更具有解释性的特征表示。
  3. 处理高基数分类变量:对于具有大量类别的分类变量(高基数),独热编码会导致高维度的稀疏特征表示,而目标编码可以使用目标变量的统计信息来代替,从而减少特征的维度。

缺点:

  1. 信息泄漏:在目标编码中,使用了目标变量的统计信息作为编码依据,因此可能会导致信息泄漏。即使在交叉验证中也有可能出现该问题。在进行目标编码时,需要小心处理,确保不将测试集中的信息泄漏到训练集中。
  2. 过拟合风险:目标编码过于依赖于目标变量的统计信息,可能导致在训练集上过拟合。特别是当类别数量较少或数据量较少时,过拟合风险更高。为了解决这个问题,可以使用平滑技术(如平均值编码、贝叶斯平滑等)来减轻过拟合风险。
  3. 对异常值敏感:如果分类变量中存在异常值,目标编码可能会受到影响。异常值的存在可能导致目标变量的统计指标产生偏移,从而影响编码结果。因此,在应用目标编码之前,需要先进行异常值处理。

category_encoders TargetEncoder()实现目标编码

from category_encoders import TargetEncoder
import pandas as pd
from sklearn.datasets import load_boston
# prepare some data
bunch = load_boston()
y_train = bunch.target[0:250]
y_test = bunch.target[250:506]
X_train = pd.DataFrame(bunch.data[0:250], columns=bunch.feature_names)
X_test = pd.DataFrame(bunch.data[250:506], columns=bunch.feature_names)
# use target encoding to encode two categorical features
enc = TargetEncoder(cols=['CHAS', 'RAD'])
# transform the datasets
training_numeric_dataset = enc.fit_transform(X_train, y_train)
testing_numeric_dataset = enc.transform(X_test)
print(training_numeric_dataset)
print(testing_numeric_dataset)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1367954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【全栈开发|Fresh框架】Fresh环境安装与快速体验Fresh全栈开发

文章目录 前言一、环境配置1. 安装Deno2. 安装idea插件 二、Hello World1.创建项目2.项目结构3. 创建一个路由4. 创建一个动态路由5. 自定义handlers1. 自定义响应头2. 随即生成uuid 6. 表单提交7. 部署到生产环境1. 将代码上传到github2. 在Deno控制面板创建一个项目 总结 前言…

【IEEE会议征稿通知】第五届计算机视觉、图像与深度学习国际学术会议(CVIDL 2024)

第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09; 2024 5th International Conference on Computer Vision, Image and Deep Learning 第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09;定于2024年4月19-21日…

美国成人便携式床护栏ASTMF3186–17安全标准详解

2023年7月21日&#xff0c;美国消费品安全委员会(CPSC)发布了最终规则16CFR1270&#xff0c;建立了成人便携式床栏(APBR)的安全标准&#xff0c;旨在减少与APBR夹住和其他危险相关的不合理的伤害和死亡风险。该规则纳入了ASTMF3186–17&#xff08;成人便携式床栏及相关产品的标…

普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

PY32C642 单片机采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围。嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器&#xff0c;最高工作频率 24 MHz。包含多种不同封装类型产品。工作温度范围为-40C ~ 85C&#xff0c;工作电压范围 1.7 V ~ 5.5 V。1 路 12 位A…

sketchup 和 solidworks 的区别

两种软件都用过&#xff0c;sketchup 几百兆&#xff0c; solidworks十几个G。 sketchup不愧为草图大师&#xff0c;画立体草图思路简洁&#xff0c;速度很快&#xff0c;总的作图思路是一笔一笔精确的画。我用它设计过很复杂很精确的路灯产品和机械产品&#xff0c;可…

Plotly.js 热力图与折线结合

上次记录了Echarts热力图与折线图的结合&#xff0c;但其效果不是很自然。后又找到了Plotly.js库&#xff0c;发现其效果不错。在此整理下实现过程。这里面涉及到自定义工具栏、自定义工具图标等等 配置工具栏显示的工具图标 let config {locale: zh-cn, // 设置本地语…

STM32F103GPIO工作模式及原理

目录 GPIO简介GPIO工作模式输入模式输出模式输出速度 GPIO框图和电路解析电路标识电路元件 GPIO工作模式电路解析浮空输入上拉输入下拉输入模拟输入开漏输出推挽输出推挽式复用功能开漏式复用功能 IO工作模式的选取输入模式输出模式 GPIO简介 GPIO&#xff0c;全称为通用输入输…

眼镜用超声波清洗机洗会有伤害吗?这些超声波清洗机适合清洗眼镜

用超声波清洗机洗眼镜是一种非常好的选择&#xff0c;超声波清洗机通过高频振动&#xff0c;将眼镜上的污渍、灰尘等清洗干净&#xff0c;比手洗更彻底、更高效。然而&#xff0c;有些人担心超声波清洗机会对眼镜造成伤害。实际上&#xff0c;这种担心是多余的。超声波清洗机在…

python基础教程八(循环1)

1. while循环 为避免多次重复的代码&#xff0c;我们会用到循环 while (condition): 执行语句 while循环的结构非常简单只要条件满足就一直循环直到&#xff0c;条件不满足为止。 例子如下&#xff1a; x1 while x<100:print(x)x1结果就是最简单的输出1-100的数字 while…

【Internal Server Error】pycharm解决关闭flask端口依然占用问题

Internal Server Error The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. 起因&#xff1a; 我们在运行flask后&#xff0c;断开服务依然保持运行&#xff0…

Java中SpringBoot组件集成接入【MQTT中间件】

Java中SpringBoot组件集成接入【MQTT中间件】 1.MQTT介绍2.搭建MQTT服务器1.Windows2.Ubuntu3.Docker4.其他方式3.mqtt可视化客户端MQTTX及快速使用教程4.SpringBoot接入MQTT1、maven依赖2、MQTT配置3、MQTT组件具体代码1.定义通道名字2.消息发布器3.MQTT配置、生产者、消费者4…

基于Java SSM框架实现班级同学录管理系统项目【项目源码】

基于java的SSM框架实现高校校园点餐系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(2)

前言 前文介绍了 NXP S32K3 以太网 RMII 接口调试的开发环境搭建&#xff0c;下面开始详解软件调试步骤。没看过第一节的小伙伴请移步《【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试&#xff08;1&#xff09;》&#xff0c;话不多说我们直接进入正题。 lwip Stack 介绍 …

oracle 19c容器数据库数据加载和传输-----SQL*Loader(一)

目录 数据加载 &#xff08;一&#xff09;控制文件加载 1.创建用户执行sqlldr 2.创建文本文件和控制文件 3.查看表数据 4.查看log文件 &#xff08;二&#xff09;快捷方式加载 1.system用户执行 2.查看表数据 3.查看log文件 外部表 数据加载和传输的工具&#xff1…

Vue3---安装路由

介绍 在Vue3项目中安装路由 示例 第一步&#xff1a;执行npm命令安装路由 npm install vue-router4第二步&#xff1a;在项目的src文件夹下创建router子文件夹 第三步&#xff1a;创建index.js和routes.js文件&#xff0c;以下为文件的代码 //通过vue-router插件实现模板…

docker打包介绍

最近在做一个开源项目&#xff0c;遇到开发者问各种问题&#xff0c;发现都是系统和软件版本的差异引起的。于是了解了一下docker的使用&#xff0c;发现docker真是个好东东&#xff0c;基本解决了各种版本差异的问题&#xff0c;真正做到了一键部署使用。 先熟悉一下docker里…

VS2022 | 显示Unreal Engine日志

VS2022 | 显示Unreal Engine日志 视图 -> 其他窗口 -> Unreal Engine日志 视图 -> 其他窗口 -> Unreal Engine日志

ORACLE体系结构逻辑结构-表空间、段、区和数据块

实例 实例是指在内存中分配的一块共享内存区域&#xff08;SGA&#xff09;和一组后台进程&#xff08;或线程&#xff09;&#xff0c;它们用于访问和控制数据库。3实例是Oracle数据库的运行时环境&#xff0c;它是数据库的动态部分&#xff0c;它可以启动和关闭&#xff0c;…

本地部署 big-AGI

本地部署 big-AGI 1. big-AGI 介绍2. Github 地址3. 本地部署 big-AGI4. 访问 big-AGI5. 配置 API key6. 测试一下 1. big-AGI 介绍 欢迎使用 big-AGI &#x1f44b;&#xff0c;这是一款面向需要功能、形式、简单性和速度的专业人士的 GPT 应用程序。 big-AGI 由 10 个供应商…

静态网页设计——崩坏3(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; 使用技术&#xff1a;HTMLCSSJS&#xff08;静态网页设计&#xff09; 主要内容&#xff1a;对游戏崩坏3进行简单介绍。 https://www.bilib…