当前位置: 首页 > news >正文

【机器学习】在 scikit-learn 中,有哪些特征编码方法?分布详细举例列出

一、在scikit-learn中,有多种特征编码方法可以用来处理分类数据,以下是一些常见的编码方法及其示例:

  1. One-Hot Encoding (独热编码):

    • 使用 OneHotEncoder 类将分类特征转换为二进制向量。
    • 例如,对于颜色特征 ['red', 'blue', 'green'],编码后可能变成 [1, 0, 0], [0, 1, 0], [0, 0, 1]
  2. Label Encoding (标签编码):

    • 使用 LabelEncoder 类将分类特征的每个类别映射到一个整数。
    • 例如,对于性别特征 ['male', 'female'],编码后可能变成 [0, 1]
  3. Ordinal Encoding (序数编码):

    • 将分类特征的每个类别映射到一个有序的整数。
    • 这种方法可能会引入不存在的顺序关系,因此使用时需要谨慎。
  4. Binary Encoding:

    • 将分类特征转换为二进制数,然后将这些二进制数拆分成多个二进制特征。
  5. Feature Hashing (特征哈希):

    • 使用 FeatureHasher 类通过哈希函数将类别映射到一个固定大小的空间中。
  6. Target Encoding (目标编码):

    • 基于特征和目标值之间的对应关系进行编码,通常用于监督学习。
  7. Custom Encoding (自定义编码):

    • 可以创建自定义的编码方案,例如,根据特定的业务逻辑或模型需求。
  8. Leave-One-Out Encoding:

    • 类别特征的每个值被替换为目标变量在该值出现时的平均值。
  9. HashingVectorizer:

    • 用于文本数据,通过哈希函数将文本转换为固定长度的数字向量。
  10. DictVectorizer:

    • 将字典形式的数据转换为矩阵,适用于文本数据。
  11. CountVectorizer:

    • 用于文本数据,计算每个词在文档中出现的次数。
  12. TfidfVectorizer:

    • 用于文本数据,计算每个词的TF-IDF值。

这些方法中,OneHotEncoderLabelEncoder 是最常用的。OneHotEncoder 适用于模型需要处理二进制特征的情况,而 LabelEncoder 适用于模型可以处理整数特征的情况。其他编码方法则根据特定的数据和模型需求选择使用。

二、One-Hot Encoding 处理非数值型特征

eg1:

在scikit-learn中,使用OneHotEncoder类可以对非数值型(分类)特征进行One-Hot Encoding处理。以下是具体的步骤和示例代码:

步骤 1: 导入OneHotEncoder

首先,你需要从sklearn.preprocessing模块导入OneHotEncoder类。

from sklearn.preprocessing import OneHotEncoder

步骤 2: 创建OneHotEncoder实例

创建OneHotEncoder的实例。你可以设置一些参数,例如:

  • sparse:默认为True,返回稀疏矩阵;如果设置为False,返回密集数组。
  • drop:默认为None,不丢弃任何特征;可以设置为’first’来丢弃每个特征的第一个类别,有时用于减少多重共线性。
encoder = OneHotEncoder(sparse=False, drop=None)

步骤 3: 拟合编码器

使用你的数据(特征)来拟合编码器。这一步会识别数据中存在的所有不同的类别。

encoder.fit([['low', 'medium', 'high'],['medium', 'high', 'low'],['high', 'low', 'medium']])

步骤 4: 转换数据

使用transform方法将分类特征转换为One-Hot编码格式。

encoded_data = encoder.transform([['high', 'medium', 'low']])

步骤 5: 查看结果

如果你设置了sparse=False,你可以直接打印或者查看转换后的数组。如果是稀疏矩阵,可以使用.toarray()方法转换为密集数组。

print(encoded_data)
# 或者如果是稀疏矩阵
print(encoded_data.toarray())

完整示例代码

from sklearn.preprocessing import OneHotEncoder# 创建OneHotEncoder实例
encoder = OneHotEncoder(sparse=False)# 拟合数据
encoder.fit([['low', 'medium', 'high'],['medium', 'high', 'low'],['high', 'low', 'medium']])# 转换数据
encoded_data = encoder.transform([['high', 'medium', 'low']])# 查看转换后的数据
print(encoded_data)

输出

[[0. 0. 1. 1. 0. 0. 0. 1. 0.]]

在这个示例中,我们有三个分类特征,每个特征有三个可能的类别(‘low’, ‘medium’, ‘high’)。One-Hot Encoding后,每个特征都被转换为三个二进制特征,其中一个是1(表示类别),其他是0。

请注意,如果你的数据集很大或者分类特征的类别非常多,One-Hot Encoding可能会导致特征数量急剧增加,从而增加模型的复杂性和计算负担。在这种情况下,可能需要考虑其他编码方法,如目标编码或嵌入编码。

eg2:

OneHotEncoder 是 scikit-learn 库中的一个类,用于对分类特征进行编码,将其转换为机器学习模型可以处理的格式。这种编码方式称为“独热编码”(One-Hot Encoding),它将分类变量的每个类别转换为一个二进制向量,其中一个元素设为 1,其余元素设为 0。

以下是 OneHotEncoder 的一些关键参数和属性:

参数:

  • categories: 指定每个特征的类别。可以是 ‘auto’(默认),让编码器自动从数据中确定类别,或者是一个列表的列表,其中每个子列表包含一个特征的所有预期类别。
  • drop: 指定是否删除每个特征的第一个类别,以减少特征数量并避免多重共线性。可以是 ‘first’、‘if_binary’ 或 None(默认)。
  • sparse: 布尔值,指定输出格式是否为稀疏矩阵(True 默认)或密集数组。
  • dtype: 输出的数据类型,默认为 numpy.float64
  • handle_unknown: 指定在转换期间如何处理未知类别。可以是 ‘error’(默认,如果遇到未知类别则抛出错误)、‘ignore’ 或 ‘infrequent_if_exist’。

属性:

  • categories_: 存储在拟合过程中确定的每个特征的类别列表。
  • drop_idx_: 如果使用了 drop 参数,这个属性会存储每个特征被删除类别的索引。

方法:

  • fit: 计算并存储每个特征的类别。
  • transform: 将独热编码应用于数据。
  • inverse_transform: 将独热编码的数据转换回原始类别。
  • get_feature_names_out: 获取转换后的特征名称。

示例代码:

from sklearn.preprocessing import OneHotEncoder# 创建 OneHotEncoder 实例
encoder = OneHotEncoder(sparse=False)# 拟合数据
encoder.fit([['low', 'medium', 'high'],['medium', 'high', 'low'],['high', 'low', 'medium']])# 转换数据
encoded = encoder.transform([['high', 'medium', 'low']])# 查看转换后的数据
print(encoded)# 查看每个特征的类别
print(encoder.categories_)# 获取转换后的特征名称
print(encoder.get_feature_names_out(['feature1', 'feature2', 'feature3']))

输出:
在这里插入图片描述
放大版输出:

[[1. 0. 0. 0. 0. 1. 0. 1. 0.]]
[array(['high', 'low', 'medium'], dtype=object), array(['high', 'low', 'medium'], dtype=object), array(['high', 'low', 'medium'], dtype=object)]
['feature1_high' 'feature1_low' 'feature1_medium' 'feature2_high''feature2_low' 'feature2_medium' 'feature3_high' 'feature3_low''feature3_medium']

在这个例子中,OneHotEncoder 将三个特征的类别学习为 ['high', 'low', 'medium'],并将其转换为独热编码格式。如果设置了 sparse=Falsetransform 方法将返回一个密集的 NumPy 数组。通过 get_feature_names_out 方法可以获取转换后的特征名称。

eg3:独热编码(One-Hot Encoding)

独热编码将每个类别转换为一个二进制向量,其中每个类别对应一个维度。适用于无序类别。

使用方法:

from sklearn.preprocessing import OneHotEncoder# 示例数据
categories = [['apple'], ['banana'], ['orange'], ['banana'], ['apple']]# 创建 OneHotEncoder 实例
one_hot_encoder = OneHotEncoder(sparse=False)# 拟合并转换数据
one_hot_encoded = one_hot_encoder.fit_transform(categories)
print(one_hot_encoded)  # 输出: [[1. 0. 0.]#        [0. 1. 0.]#        [0. 0. 1.]#        [0. 1. 0.]#        [1. 0. 0.]]

三、标签编码(Label Encoding)处理非数值型特征

标签编码(Label Encoding)
标签编码将每个类别映射为一个唯一的整数。这种方法适用于有序类别,但对于无序类别可能导致模型误解类别间的关系。

使用方法:

from sklearn.preprocessing import LabelEncoder示例数据
categories = ['apple', 'banana', 'orange', 'banana', 'apple']创建 LabelEncoder 实例
label_encoder = LabelEncoder()拟合并转换数据
encoded_labels = label_encoder.fit_transform(categories)
print(encoded_labels)  # 输出: [0 1 2 1 0]

四、 二进制编码(Binary Encoding)

二进制编码首先将类别标签转换为整数,然后将整数转换为二进制形式。对于类别数较多时,比独热编码更高效。

使用方法:
需要安装 category_encoders 库:

pip install category_encoders
import category_encoders as ce# 示例数据
categories = ['apple', 'banana', 'orange', 'banana', 'apple']# 创建 BinaryEncoder 实例
binary_encoder = ce.BinaryEncoder()# 拟合并转换数据
binary_encoded = binary_encoder.fit_transform(categories)
print(binary_encoded)

输出:

   0_0  0_1
0    0    1
1    1    0
2    1    1
3    1    0
4    0    1
Selection deleted

五、频率编码(Frequency Encoding)

频率编码根据每个类别的出现频率进行编码。适用于类别较多且频率分布不均的情况。

使用方法:

import pandas as pd# 示例数据
data = {'fruit': ['apple', 'banana', 'orange', 'banana', 'apple']}
df = pd.DataFrame(data)# 计算频率
frequency_encoded = df['fruit'].value_counts(normalize=True).to_dict()
df['fruit_encoded'] = df['fruit'].map(frequency_encoded)
print(df)

输出:

{'apple': 0.4, 'banana': 0.4, 'orange': 0.2}
0    0.4
1    0.4
2    0.2
3    0.4
4    0.4
Name: fruit_encoded, dtype: float64fruit  fruit_encoded
0   apple            0.4
1  banana            0.4
2  orange            0.2
3  banana            0.4
4   apple            0.4

六、目标编码(Target Encoding)

目标编码使用目标变量的平均值来编码类别特征,通常用于分类任务。需要注意避免数据泄漏。

使用方法:
需要安装 category_encoders 库:

pip install category_encoders
import category_encoders as ce
import pandas as pd# 示例数据
data = {'fruit': ['apple', 'banana', 'orange', 'banana', 'apple'],'target': [1, 0, 1, 0, 1]}
df = pd.DataFrame(data)# 创建 TargetEncoder 实例
target_encoder = ce.TargetEncoder()# 拟合并转换数据
df['fruit_encoded'] = target_encoder.fit_transform(df['fruit'], df['target'])
print(df)

输出:

   fruit  target  fruit_encoded
0   apple       1       0.656740
1  banana       0       0.514889
2  orange       1       0.652043
3  banana       0       0.514889
4   apple       1       0.656740

总结
标签编码 适用于有序类别,对于无序类别可能导致误解。
独热编码 适用于无序类别,但会增加维度。
二进制编码 适合类别数量较多的情况,比独热编码更高效。
频率编码 根据类别出现频率进行编码,简单易用。
目标编码 利用目标变量的平均值进行编码,适用于分类问题,但需小心避免数据泄漏。
选择合适的编码方法取决于数据的性质和模型的要求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构的三要素以及数据类型和抽象数据类型
  • Ubuntu下安装和配置MQTT服务器Mosquitto
  • AMD简介
  • JavaWeb - Spring Boot
  • 一维/二维高斯分布的负对数似然推导
  • 前后端分离的security角色权限实现
  • 智能合约漏洞(四)
  • 接口测试 —— 如何设计高效的测试用例!
  • 使用 nuxi build-module 命令构建 Nuxt 模块
  • C语言中的“#”和“##”
  • 三维前缀和 C++
  • 【Centos】制作一键安装包.bin 文件
  • 【论文阅读】:Mamba YOLO SSMs-Based YOLO For Object Detection
  • 学懂C++(四十四):C++ 自定义内存管理的深入解析:内存池与自定义分配器
  • milvus使用milvus migration工具迁移数据
  • [PHP内核探索]PHP中的哈希表
  • Angular 响应式表单 基础例子
  • git 常用命令
  • JavaScript-Array类型
  • node 版本过低
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 安装python包到指定虚拟环境
  • 服务器从安装到部署全过程(二)
  • 工作中总结前端开发流程--vue项目
  • 双管齐下,VMware的容器新战略
  • 怎么把视频里的音乐提取出来
  • 自定义函数
  • const的用法,特别是用在函数前面与后面的区别
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (Forward) Music Player: From UI Proposal to Code
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)linux下的时间函数使用
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .htaccess 强制https 单独排除某个目录
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core使用ef 6
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net的socket示例
  • .net开发日常笔记(持续更新)
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Builder用法
  • @property python知乎_Python3基础之:property
  • [.NET]桃源网络硬盘 v7.4
  • []指针
  • [20170713] 无法访问SQL Server
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [android] 切换界面的通用处理
  • [Android] 修改设备访问权限
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CCIE历程]CCIE # 20604