数据预处理——One-hot编码

网上关于One-hot编码的例子都来自于同一个例子,而且结果来的太抖了。查了半天,终于给搞清楚这个独热编码是怎么回事了,其实挺简单的,这里再做个总结。 首先,引出例子:

已知三个feature,三个feature分别取值如下: feature1=[“male”, “female”] feature2=[“from Europe”, “from US”, “from Asia”] feature3=[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]

如果做普通数据处理,那么我们就按0,1,2,3进行编号就行了。例如feature1=[0,1],feature2=[0,1,2],feature3=[0,1,2,3]。 那么,如果某个样本为[“male”,“from Asia”, “uses Chrome”],它就可以表示为[0,2,1]。 以上为普通编码方式。 独热编码(One-hot)换了一种方式编码,先看看百科定义的:

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。 例如对六个状态进行编码: 自然顺序码为 000,001,010,011,100,101 独热编码则是 000001,000010,000100,001000,010000,100000

通过以上可以看到,独热编码每一个码的总的位数取决于状态的种类数,每一个码里的“1”的位置,就代表了哪个状态生效。 还是回到我们最开始的例子,那么我们将它换成独热编码后,应该是: feature1=[01,10] feature2=[001,010,100] feature3=[0001,0010,0100,1000]

注意,独热编码还有个特性是,当某个特征里的某一状态生效后,此特征的其他状态因为是互斥的关系,必须全部为0,切必

### One-Hot编码的概念 One-Hot编码是一种将离散型特征(即类别型数据)转化为二进制向量的形式,以便于机器学习算法能够更好地理解并处理这些数据[^1]。它的核心思想是为每一个类别创建一个新的二进制列,在该列中标记当前样本是否属于这个类别。 --- ### 实现方法 #### 使用Python中的`pandas.get_dummies()`函数 以下是利用Pandas库实现One-Hot编码的示例: ```python import pandas as pd # 原始数据 data = {'颜色': ['红', '绿', '蓝']} df = pd.DataFrame(data) # 转换为One-Hot编码 one_hot_encoded_df = pd.get_dummies(df, columns=['颜色']) print(one_hot_encoded_df) ``` 运行结果将是: ``` 颜色_红 颜色_绿 颜色_蓝 0 1 0 0 1 0 1 0 2 0 0 1 ``` 此方法简单易用,适合快速完成小型项目的预处理工作[^4]。 #### 使用Scikit-Learn库 另一种常见的实现方式是借助scikit-learn中的`OneHotEncoder`类: ```python from sklearn.preprocessing import OneHotEncoder import numpy as np # 创建OneHotEncoder实例 encoder = OneHotEncoder(sparse=False) # 输入原始数据 colors = [['红'], ['绿'], ['蓝']] encoded_colors = encoder.fit_transform(colors) print(encoded_colors) ``` 输出矩阵形式的结果将会是: ``` [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ``` 这种方法更加灵活,尤其当需要与其他sklearn工具链集成时更为方便[^3]。 --- ### 用途 One-Hot编码广泛应用于各种场景下对分类变量的数据准备阶段。例如,在自然语言处理(NLP)领域中用于词袋模型;在图像识别任务里标记图片所属种类等。此外,它还特别适用于那些无法定义明确大小关系或等级差异的属性字段转换过程之中[^5]。 然而需要注意的是,尽管One-Hot编码解决了传统整数编号带来的隐含次序假定问题,但它也可能引发所谓的“维度灾难”,即随着类别数量增多而导致输入空间急剧膨胀的现象[^4]。 --- ### 示例分析 考虑这样一个例子——预测某城市居民是否会购买特定商品。“职业”作为其中一个影响因素包含了多个选项如教师、医生、工程师等等,则可以通过One-Hot编码将其转变为若干个布尔值组成的数组供后续建模使用。 | ID | 职业 | 收入水平 | 是否购买 | |----|---------|----------|-----------| | 1 | 教师 | 中 | 是 | | 2 | 工程师 | 高 | 否 | 经过One-Hot编码之后变为: | ID | 教师 | 工程师 | 医生 | ... | 收入水平 | 是否购买 | |----|------|--------|-------|-----|------------|-----------| | 1 | 1 | 0 | 0 | ... | 中 | 是 | | 2 | 0 | 1 | 0 | ... | 高 | 否 | 这使得原本难以直接参与运算的职业信息得以量化表达出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值