机器学习中的特征处理--onehot编码

首先介绍数据标准化工具onehot[独热编码]:

One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。以手写数字识别为例,我们需要将0-9共十个数字标签转化成onehot标签。例如:数字标签“6”转化为onehot标签就是[0,0,0,0,0,0,1,0,0,0].
我第一次利用以下函数进行编码:

def convert2onehot(data):
    # covert data to onehot representation
    return pd.get_dummies(data, prefix=data.columns)

结果报错:
很明显职业一项我们一共有15个而该函数只能提供10个以下的编码,只能另觅他法喽,

ValueError: Length of 'prefix' (15) did not match the length of the columns being encoded (9).

虽然已经有很多人在 stackoverflow 和 sklearn 的 github issue 上讨论过这个问题,但目前为止的 sklearn 版本仍没有增加OneHotEncoder对字符串型类别变量的支持,所以一般都采用曲线救国的方式:

  • 方法一 :先用 LabelEncoder() 转换成连续的数值型变量,再用 OneHotEncoder() 二值化;
  • 方法二 :直接用 LabelBinarizer() 进行二值化;
import pandas as pd
#import Numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import LabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer
col_names = ["age", "workclass", "fnlwgt", "education", "education-num", "marital-status", "occupation", 
             "relationship", "race", "sex", "capital-gain", "capital-loss", "hours-per-week", "native-country", "result"]
data = pd.read_csv("D://ML//Data//adult.csv", names=col_names)
#利用函数将文字标准化为tensorflow可以处理的数字
#OneHotEncoder(sparse = False).fit_transform( data[['age','education-num']] )
data['age']=LabelBinarizer().fit_transform(data['age'])
data['workclass']=LabelBinarizer().fit_transform(data['workclass'])
data['fnlwgt']=data['fnlwgt']/100
data['fnlwgt']=OneHotEncoder(sparse = False).fit_transform( data[['fnlwgt']] )
data['education']=LabelBinarizer().fit_transform(data['education'])
data['education-num']=LabelBinarizer().fit_transform(data['education-num'])
data['marital-status']=LabelBinarizer().fit_transform(data['marital-status'])
data['occupation']=LabelBinarizer().fit_transform(data['occupation'])
data['relationship']=LabelBinarizer().fit_transform(data['relationship'])
data['race']=LabelBinarizer().fit_transform(data['race'])
data['sex']=LabelBinarizer().fit_transform(data['sex'])
data['capital-gain']=LabelBinarizer().fit_transform(data['capital-gain'])
data['capital-loss']=LabelBinarizer().fit_transform(data['capital-loss'])
data['hours-per-week']=LabelBinarizer().fit_transform(data['hours-per-week'])
data['native-country']=LabelBinarizer().fit_transform(data['native-country'])
data['result']=LabelBinarizer().fit_transform(data['result'])

print(data[:10])

打印结果如下所示:

 age  workclass  fnlwgt  education  education-num  marital-status  \
0    0          0     0.0          0              0               0   
1    0          0     0.0          0              0               0   
2    0          0     0.0          0              0               1   
3    0          0     0.0          0              0               0   
4    0          0     0.0          0              0               0   
5    0          0     0.0          0              0               0   
6    0          0     0.0          0              0               0   
7    0          0     0.0          0              0               0   
8    0          0     0.0          0              0               0   
9    0          0     0.0          0              0               0   

   occupation  relationship  race  sex  capital-gain  capital-loss  \
0           0             0     0    1             0             1   
1           0             1     0    1             1             1   
2           0             0     0    1             1             1   
3           0             1     0    1             1             1   
4           0             0     0    0             1             1   
5           0             0     0    0             1             1   
6           0             0     0    0             1             1   
7           0             1     0    1             1             1   
8           0             0     0    0             0             1   
9           0             1     0    1             0             1   

   hours-per-week  native-country  result  
0               0               0       0  
1               0               0       0  
2               0               0       0  
3               0               0       0  
4               0               0       0  
5               0               0       0  
6               0               0       0  
7               0               0       1  
8               0               0       1  
9               0               0       1  

如果觉得本文写的还不错的伙伴,可以给个关注一起交流进步,如果有在找工作且对阿里感兴趣的伙伴,也可以发简历给我进行内推:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,独热编码是一种常用的数据处理方式,主要用于深度学习的分类任务。它将每个类别都转换为一个向量,向量的长度为类别总数,向量只有对应类别的位置上是1,其余位置都是0。这样的处理方式可以让模型更好地理解类别之间的关系,提高模型的分类精度。 下面是python实现独热编码的代码: ```python import numpy as np def one_hot_encoding(labels, num_classes): """ :param labels: 标签列表 :param num_classes: 类别总数 :return: 独热编码矩阵 """ one_hot = np.zeros((len(labels), num_classes)) for i, label in enumerate(labels): one_hot[i][label] = 1 return one_hot ``` 这个函数接收两个参数:标签列表和类别总数。它首先创建一个全零矩阵,矩阵的行数等于标签列表的长度,列数等于类别总数。然后遍历标签列表,将矩阵对应位置设置为1。最后返回独热编码矩阵。 使用这个函数很简单,只需要将标签列表和类别总数传入即可。例如,假设我们有一个包含10个样本的数据集,共有3个类别,标签分别为0、1、2。那么可以这样调用函数: ```python labels = [0, 1, 2, 0, 1, 2, 0, 1, 2, 0] num_classes = 3 one_hot = one_hot_encoding(labels, num_classes) print(one_hot) ``` 输出结果为: ``` [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.]] ``` 可以看到,函数成功地将标签列表转换成了独热编码矩阵。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值