独热编码(OneHotEncoder)和标签编码(LabelEncoder)

本文深入探讨了数据分类中的连续型和离散型数据处理方法,重点讲解了独热编码(OneHotEncoder)和标签编码(LabelEncoder)在离散型数据处理中的应用,通过实例演示了如何使用sklearn进行编码,以及独热编码的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据分类

我们在构建模型对数据进行训练之前,需要对数据进行特征工程,我们的数据可以分为连续型和离散型。
对于连续型数据,我们一般的做法是对其进行标准化或者归一化,之前写过一篇标准化和归一化的介绍,大家有兴趣的可以看一下:https://blog.youkuaiyun.com/weixin_43172660/article/details/83826051
对于离散型数据,我们基本就是按照one-hot(独热)编码,该离散特征有多少取值,就用多少维来表示该特征。

独热编码(OneHotEncoder)

对于离散型数据,比如一个特征为颜色,他一共有三个值,分别为红,蓝,绿,按照正常想法,我们可能认为,令红色=0,蓝色=1,绿色=2,这样对数据进行了编码,但是,如果把这些数据放到需要计算距离的或者其他模型中,模型会认为重要性是绿色>蓝色>红色。但这并不是我们的让机器学习的本意,只是想让机器区分它们,并无大小比较之意。所以这时标签编码是不够的,需要进一步转换。我们可以设置,这个特征有三个取值,我们可以设置三列,分别是红,蓝,绿,对于红色,它的取值是1,0,0,对于蓝色,它的取值是0,1,0,而对于绿色,它的取值是0,0,1。如此一来每两个向量之间的距离都是根号2,在向量空间距离都相等,所以这样不会出现偏序性,基本不会影响基于向量空间度量算法的效果。下面我们来举一个例子,利用sklearn实现独特编码。

from sklearn import preprocessing #引入数据预处理模块
ohe = preprocessing.OneHotEncoder()
ohe.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])#先fit
ohe.transform([[0, 1, 3]]).toarray()#后transform

输出

array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])

说下这个例子,一共有三个特征。
第一个特征的取值是0,1,
第二个特征的取值是0,1,2,
第三个特征的取值是0,1,2,3。
第一个特征,我们可以把它变成两列,如果取值是0,则这两列的取值是1,0 如果取值是1,则为0,1。
第二个特征,变成三列,取值分别为1,0,0 / 0,1,0 / 0,0,1
第三个特征,变成四列,取值分别为1,0,0,0 / 0,1,0,0 / 0,0,1,0 / 0,0,0,1
通过独热编码,三列的特征被我们变成了2+3+4=9列的特征。
对于0,1,3这个数字,我们就变为了1,0,0,1,0,0,0,0,1。

独热编码优点

通过独热编码,会让特征之间的距离计算更加合理,并且,将特征转为0,1,有利于提升计算速度。要是one hot encoding的类别数目不太多,建议优先考虑。 当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。

标签编码(LabelEncoder)

刚才那个,例子,我们将红,蓝,绿转化为0,1,2就是标签编码,将转换成连续的数值型变量。即是对不连续的数字或者文本进行编号。举一个简单的例子:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
print(le.classes_)
le.transform([1,1,100,67,5])

输出

array([0,0,3,2,1])

总结

上面基本介绍了,如果遇到了离散型数据,我们需要怎么处理,这样有利于我们进行模型预测, 提高准确率。

<think>我们被要求导入scikit-learn中的OneHotEncoderLabelEncoder。根据引用[1]引用[2],我们可以知道这两个类都在sklearn.preprocessing模块中。 但是需要注意的是,在较新版本的scikit-learn中,OneHotEncoder的使用方式可能有所变化,并且LabelEncoder通常用于对目标变量(标签)进行编码,而OneHotEncoder用于特征。 根据引用[3]中的示例,我们可以看到导入方式。 然而,需要指出的是,在最新版本的scikit-learn中,OneHotEncoder已经可以同时处理数值型字符串型数据,而LabelEncoder则主要用于标签编码。 正确的导入语句如下: from sklearn.preprocessing import OneHotEncoder, LabelEncoder 但是,请注意,引用[3]中同时提到了LabelBinarizerMultiLabelBinarizer,这些也是编码工具,但用户目前只需要OneHotEncoderLabelEncoder。 另外,引用[2]中提到了LabelEncoderOneHotEncoder的简单区别:LabelEncoder是将类别标签转换为不同的整数,而OneHotEncoder是将整数类别标签(或类别特征)转换为独热编码(one-hot encoding)。 因此,我们可以这样写代码: """ from sklearn.preprocessing import OneHotEncoder, LabelEncoder """ 但是,请注意,OneHotEncoder在较新版本中(例如0.20版本之后)已经不再将整数作为类别,而是将字符串作为类别。因此,如果我们的特征是字符串,可以直接使用OneHotEncoder。如果特征原本是整数,但希望视为类别,则需要先转换为字符串,或者使用OneHotEncoder的categories参数指定类别,或者使用旧版本的用法(设置categorical_features)但这种方法已被弃用。 不过,用户的问题只是关于如何导入,所以我们只需提供导入语句即可。 另外,根据引用[3]中的示例,LabelEncoder的使用示例: le = LabelEncoder() le.fit([1,5,67,100]) le.transform([1,1,100,67,5]) # 输出:array([0,0,3,2,1]) OneHotEncoder的示例(注意:在旧版本中,OneHotEncoder的输入需要是二维的,每一列是一个特征): ohe = OneHotEncoder() ohe.fit([[1],[2],[3],[4]]) ohe.transform([[2],[3],[1],[4]]).toarray() # 输出:[[0,1,0,0], [0,0,1,0], [1,0,0,0], [0,0,0,1]] 但是,在最新版本中,OneHotEncoder的使用方式有所变化,推荐设置参数sparse=False来直接得到数组,而不是稀疏矩阵。同时,新版本OneHotEncoder可以自动确定类别,也可以手动指定。 不过,这些细节用户可能不需要在导入的时候了解,所以这里只提供导入语句。 因此,回答如下:</think>要导入 scikit-learn 中的 `OneHotEncoder` `LabelEncoder`,请使用以下导入语句: ```python from sklearn.preprocessing import OneHotEncoder, LabelEncoder ``` ### 关键说明: 1. **位置**:这两个编码器都位于 `sklearn.preprocessing` 模块中[^1][^2][^3] 2. **核心区别**: - `LabelEncoder`:将类别标签转换为整数编码(如 ["猫","狗","鸟"] → [0,1,2]) - `OneHotEncoder`:将整数编码转换为独热向量(如 [0,1,2] → [[1,0,0],[0,1,0],[0,0,1]])[^2][^3] ### 基础使用示例: ```python # LabelEncoder 示例 from sklearn.preprocessing import LabelEncoder le = LabelEncoder() labels = ['猫', '狗', '鸟', '狗'] encoded = le.fit_transform(labels) # 输出: [0,1,2,1] # OneHotEncoder 示例 from sklearn.preprocessing import OneHotEncoder ohe = OneHotEncoder() onehot = ohe.fit_transform(encoded.reshape(-1,1)).toarray() # 输出: [[1,0,0], [0,1,0], [0,0,1], [0,1,0]] ``` > **重要提示**:新版本 scikit-learn(≥0.20)建议直接使用 `OneHotEncoder` 处理字符串类别,无需先用 `LabelEncoder` 转换[^3]。若处理特征矩阵,需确保输入是二维数组(使用 `.reshape(-1,1)`)。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值