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

news2024/9/25 3:25:57

一、在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: float64
    fruit  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

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

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

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

相关文章

day01项目概述、环境搭建

1 软件开发整体介绍 软件开发流程 角色分工 软件环境 2 苍穹外卖项目介绍 项目介绍 产品原型 技术选型 3 开发环境搭建 前端环境搭建 注意: - Nginx目录必须放在没有中文的目录中才能正常运行 - 当前Nginx的配置文件中已经配置了反向代理,通过此配置…

面试SQL题的水到底有多深?一文带你揭晓

不谋万世者,不足谋一时;不谋全局者,不足谋一域 目录 0 面试现状 1 面试SQL题目的难度及特点 1.1 题目场景化 1.2 题目算法化 1.3 方法多元化 2 破局之道 3 总结 数字化建设通关指南 主要内容: (1)SQL进阶实…

ChatTTS 长音频合成和本地部署2种方式,让你的“儿童绘本”发声的实战教程(文末有福利)

接上文(GLM-4-Flash 大模型 API 免费了,手把手构建“儿童绘本”应用实战(附源码)),老牛同学通过 GLM-4-Flash 文生文和 CogView-3 文生图大模型,和大家一起编写了一个图文并茂的儿童绘本应用&am…

Claude3.5 Sonnet模型评测(附使用方法)

随着模型的发展,之前大家常用的鉴别模型能力的测试已经有很多过时现象,比如经典的喝水测试,目前国内的先进模型也已经可以答对,我们需要更复杂的问题来测试模型能力,最近有研究人员发现,大模型不会比较浮点…

操作符详细解析

操作符详解 文章目录 操作符详解1.操作符分类2.算数操作符3.移位操作符3.1整型二进制的表示3.1.1整数二进制的种类3.1.2二进制原码反码补码的表示 3.2移位运算符使用规则3.2.1正数的左移运算符 3.2.2负数的左移运算符3.2.3右移操作符3.2.3.1右移运算符的两种形式:3.…

使用WSL在Windows上安装Linux

文章目录 环境步骤参考 注:WSL是“Windows Subsystem for Linux”的缩写,即“适用于 Linux 的 Windows 子系统”,说白了就是在Windows系统里直接使用Linux,而不需要VMWare等虚拟软件。 环境 Windows 11 家庭中文版 步骤 首先&…

DORIS - DORIS简介

前言 本博文基于DORIS的2.1.5版本。apache-doris-2.1.5-bin-x64.tar.gz 是什么? DORIS官网 Apache Doris 是一款基于 MPP 架构的高性能、实时的分析型数据库,以高效、简单、统一的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的…

迅为2K1000开发板流畅运行Busybox、Buildroot、Loognix、QT5.12 系统

硬件配置 国产龙芯处理器,双核64位系统,板载2G DDR3内存,流畅运行Busybox、Buildroot、Loognix、QT5.12 系统! 接口全板载4路USB HOST、2路千兆以太网、2路UART、2路CAN总线、Mini PCIE、SATA固态盘接口、4G接口、GPS接口WIF1、蓝牙、Mini HD…

leetcode72. 编辑距离,二维动态规划

leetcode72. 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 1.插入一个字符 2.删除一个字符 3.替换一个字符 示例 1: 输入:word1 “horse”,…

nvm使用详解

在开发时采用nodejs环境的时候有时会遇见版本过新项目不匹配的情况这时的话重新下载过于麻烦,一个项目一个开发环境肯定不现实 这时我推荐一款nodejs管理器nvm 官网如下nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm中文网NVM中文网:nvm一个nodejs的版本管理工具,为wind…

使用docker file创建镜像(thirty-seven day)

回顾:根据镜像创建容器 docker -it --name c0 centos:latest /bin/bash安装应用ctrlpqdocker export -o centos.tar c0docker import -m "山不像我走来,我便向山走去" centos.tar centos:httpddocker commit c0 centos:v2 一、docker file应…

Oracle 客户端 PL/SQL Developer 15.0.4 安装与使用

目录 官网下载与安装 切换中文与注册 连接Oracle数据库 tnsnames.ora 文件使用 Oracle 客户端 PL/SQL Developer 12.0.7 安装、数据导出、Oracle 执行/解释计划、for update。 官网下载与安装 1、官网:https://www.allroundautomations.com/products/pl-sql-d…

uni-app 微信小程序开发安装配置 HbuilderX 微信小程序开发工具

安装HbuilderX 官网下载: https://www.dcloud.io/hbuilderx.html 编译器用来编写小程序代码 微信小程序开发工具 官网下载:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 用于小程序的页面调试 创建项目 HbuilderX创建项目…

找单身狗(c语言)

1./找单身狗 //在一个数组中只有两个数字出现一次,其他所以数字都出现了两次 //编写一个函数找出这两个只出现一次的数字 2.方法一:暴力求解,我们用冒泡函数,进行比较如果ij,那么n,如果n1,那么我们将他存储在arr2[]&a…

C++编程语言——基础设施:指针,数组和引用

指针,数组和引用 (Pointers, Arrays, and References) 目录 7.1 引言 7.2 指针 7.2.1 void* 指针 7.2.2 nullptr 指针 7.3 数组 7.3.1 数组初始化 7.3.2 字符串文字量 7.3.2.1 原字符串(Raw Character Strings) 7.3.2.2 大字符集(Larger Charac…

Multi-UAV|多无人机、多场景路径规划MATLAB

无人机(Unmanned Aerial Vehicle,UAV) 是一种无需机载驾驶员的半自主飞行器,由于其灵活度高、机动性强等特点,目前已广泛应用于民用和军用领域,如救援、农业、 输电线路巡检等。但在实际应用中,单个UAV难以应对任务点分…

看github源码必备的chrome插件

Web Activity Time Tracker 一个记录github等各个网站的阅读时长 长这样 GitHub Web IDE 一个方便打开github的各种web IDE,最后一个选项Clone in VScode 一键克隆到本地并打开非常省事 Elmo Chat - Your AI Web Copilot 一键总结项目内容,打开web i…

Datawhale X 李宏毅苹果书 AI夏令营 入门 Task2-了解线性模型

目录 线性模型分段线性曲线模型变形 线性模型 输入的特征 x 乘上一个权重,再加上一个偏置就得到预测的结果,这样的模型称为线性模型。 分段线性曲线 线性模型有很大的限制,这一种来自于模型的限制称为模型的偏差,无法模拟真实的…

网络压缩之参数量化(parameter quantization)

参数量化(parameter quantization)。参数量化是说能否只 用比较少的空间来储存一个参数。举个例子,现在存一个参数的时候可能是用64位或32位。 可能不需要这么高的精度,用16或8位就够了。所以参数量化最简单的做法就是&#xff0c…

智慧党建解决方案

1. 新时代党建工作背景 报告强调了新时代党建工作的重要性,提出要利用互联网、大数据等新兴技术推进智慧党建,提高党的执政能力和领导水平。 2. 基层党组织建设挑战 基层党组织在日常工作中面临组织管理难、过程监管难、宣传教育难等问题,…