one-hot编码例子介绍

作者在学习TF框架文本分类时接触到One-hot编码,通过举例展示了One-hot编码的方式,即词语在字典中出现的位置对应向量元素为1,其余为0,且编码后向量与词典维度相同,最后提出如何解决维度爆炸的疑问。

最近在看tf框架,挺有意思的。在文本分类部分中再一次看到了one-hot编码,查了些资料,在此做一个记录。

我们先来看一个one-hot编码的例子。
假设字典中包含以下元素。
dict = [我,我们,爱,中国,你好,有趣]
一般的字典会包含10^6乃至更多的字词,在这里我们仅仅举例。
那么对于以下词语,如何进行one-hot编码呢?
‘我们’:(0,1,0,0,0,0)
‘中国’:(0,0,0,1,0,0)
‘你好’:(0,0,0,0,1,0)
就是词语在字典中出现的位置。
同时,词语进行one-hot编码后得到的向量与词典维度相同。

这不禁让我疑问:怎么解决维度爆炸这种情况呢?

### 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 | ... | 高 | 否 | 这使得原本难以直接参与运算的职业信息得以量化表达出来。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值