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

数据分类

我们在构建模型对数据进行训练之前,需要对数据进行特征工程,我们的数据可以分为连续型和离散型。
对于连续型数据,我们一般的做法是对其进行标准化或者归一化,之前写过一篇标准化和归一化的介绍,大家有兴趣的可以看一下:https://blog.csdn.net/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])

总结

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

  • 16
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您可以使用sklearn库中的LabelEncoder和OneHotEncoder来实现这个功能。具体步骤如下: 1. 使用pandas的read_csv函数读取csv文件,将其存储为一个DataFrame对象。 2. 导入LabelEncoder和OneHotEncoder,并实例化这两个对象。 3. 使用LabelEncoder的fit_transform函数将每个不同的英文标签替换成不同的数字。 4. 使用OneHotEncoder的fit_transform函数将数字编码转换成独热编码。 5. 将转换后的数据保存到新的csv文件中,可以使用pandas的to_csv函数。 下面是一个示例代码: ```python import pandas as pd from sklearn.preprocessing import LabelEncoder, OneHotEncoder # 读取csv文件 df = pd.read_csv('your_file.csv') # 实例化LabelEncoder和OneHotEncoder le = LabelEncoder() ohe = OneHotEncoder() # 将英文标签替换成数字 df['label'] = le.fit_transform(df['label']) # 将数字编码转换成独热编码 label_encoded = ohe.fit_transform(df['label'].values.reshape(-1, 1)).toarray() # 将独热编码添加到原数据中 df_encoded = pd.concat([df, pd.DataFrame(label_encoded)], axis=1) # 将转换后的数据保存到新的csv文件中 df_encoded.to_csv('new_file.csv', index=False) ``` 其中,fit_transform函数分别用于拟合数据并进行转换。LabelEncoder用于将英文标签替换成数字,OneHotEncoder用于将数字编码转换成独热编码。需要注意的是,OneHotEncoder的输入需要是二维数组,因此需要使用reshape函数将一维数组转换成二维数组。最后,使用concat函数将独热编码添加到原数据中,再使用to_csv函数保存到新的csv文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值