机器学习之特征编码

为什么特征编码
通常工业数据都是比较脏的,特征变量除了数值外可能还会包括字符等特征值,但一般的机器学习模型一般都是处理数值型的特征值,因此需要将一些非数值的特殊特征值转为为数值,这就要用到特征编码。
编码方式
我们通常会使用两种方式来实现,分别是:自然数编码:label-encoding和独热编码: one-hot encoding。一般如果特征是定类数据,模型对数值大小次序敏感则选择onehot,如果特征是定序数据,模型对数值大小不敏感一般选择label,onehot容易造成维度灾难
以下我们基于Kaggle的Titanic数据对实现编码

import numpy as np
import pandas as pd
import os
print(os.listdir())
data_train=pd.read_csv('train.csv')
data_train.head(5)
数据如下:

在这里插入图片描述

  • label-encoding

  • 优点
    解决了分类编码的问题,可以自由定义量化数字。但其实也是缺点,因为数值本身没有任何含义,只是排序。如大中小编码为123,也可以编码为321,即数值没有意义。
  • 缺点
    可解释性比较差。比如有[dog,cat,dog,mouse,cat],我们把其转换为[1,2,1,3,2],这里就产生了一个奇怪的现象:dog和mouse的平均值是cat。因此,Label encoding编码其实并没有很宽的应用场景。
#先对sibsp和parch创建有序编码family_size_c,family_size_c是值为‘single’,'small','large'的特征变量
def family_size_category(family_size):
    if family_size<=1:
        return 'single'
    elif family_size<=3:
        return 'small'
    else:
        return 'large'
data_train['family_size']=data_train['SibSp']+data_train['Parch']+1
data_train['family_size_c']=data_train['family_size'].map(family_size_category)

#由于family_size_c特征是定序数据类型,也是分类类型,但比定类更高级,因为有排序,因此对family_size_c进行label encoding
from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
#对要的编码类别进行fit,fit内必须为一个行数组1-D的array(可重复,会自动辨别)
le.fit(np.array(['single','small','large']))
data_train['family_size_c']=le.transform(data_train['family_size_c'])

print(le.classes_)#查看标签类别
print(le.inverse_transform([2,1,0]))#查看数字对应的标签

打印结果如下:
[‘large’ ‘single’ ‘small’]
[‘small’ ‘single’ ‘large’]#[2,1,0]对用的原特征值

  • one-hot encoding

  • 优点
    解决了分类器不好处理分类数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
  • 缺点
    当类别的数量很多时,特征空间会变得非常大,容易造成维度灾难。

one-hot编码可以由sklearn.preprocessing import OneHotEncoder和pandas里的get_dummies实现,OneHotEncoder只能处理数值型而get_dummies可以对其他特殊字符进行编码

 #用pandas里的get_dummies可以对字符特征变量Sex','Embarked'处理
oh_Sex_Embarked=pd.get_dummies(data_train[['Sex','Embarked']],drop_first=True) 
#借助concat函数把编码变量合并到原来数据
data_train_new=pd.concat([data_train.drop(['Sex','Embarked'],axis=1),oh_Sex_Embarked],axis=1)
data_train_new

数据如下
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值