预处理之类别特征编码

前言:在数据预处理过程中,通常需要对类别特征进行编码,以便机器学习模型能够使用数据。本文介绍sklearn 中的DictVectorizer函数,完成上述任务。

注:文章以kaggle比赛中的House Prices: Advanced Regression Techniques 数据为例,网址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques

首先先读出train数据,观察数据格式:

import pandas as pd
import numpy as np

train_data = pd.read_csv('train.csv')

数据如下:

这里写图片描述

观察特征LotShape,发现特征值可以取值为
{
Reg Regular
IR1 Slightly irregular
IR2 Moderately Irregular
IR3 Irregular
}
类别特征值在模型中通常无法直接使用,我们需要将其处理为数值形式。
一种方式是为每个类别指定一个数字,如Reg:0 , IR1:1 , …,但是有时这种处理方法会带来额外影响,无形中给类别信息拍了序。如,上例中可能会认为 IR1 > Reg
另一种方法是 one-hot 编码方法。这种方法将原来的一个特征 LotShape 转化成四个类别特征:LotShape.Reg,LotShape.IR1,LotShape.IR2,LotShape.IR3。如果 x1[LotShape]=Reg,x2[LotShape]=IR1,... ,则相应的编码为 x1=1000,x2=0100,...

以kaggle数据为例:

X_train.columns

实验选择了以下特征:

u’Foundation’,
u’SaleType’,
u’SaleCondition’,
u’YearBuilt’,
u’1stFlrSF’,
u’2ndFlrSF’,
u’BsmtUnfSF’,
u’CentralAir’

数据大小为:(1460,13)

采用DictVectorizer对原始数据进行转换:

from sklearn.feature_extraction import DictVectorizer
dict_vec = DictVectorizer(sparse=False)

X_train = dict_vec.fit_transform(X_train.to_dict(orient='record'))

查询转换后的特征

dict_vec.get_feature_names()
['1stFlrSF',
 '2ndFlrSF',
 'BsmtUnfSF',
 'CentralAir=N',
 'CentralAir=Y',
 'Electrical=FuseA',
 'Electrical=FuseF',
 'Electrical=FuseP',
 'Electrical=Mix',
 'Electrical=SBrkr',
 'Foundation=BrkTil',
 'Foundation=CBlock',
 'Foundation=PConc',
 'Foundation=Slab',
 'Foundation=Stone',
 'Foundation=Wood',
 'GarageArea',
 'Heating=Floor',
 'Heating=GasA',
 'Heating=GasW',
 'Heating=Grav',
 'Heating=OthW',
 'Heating=Wall',
 'SaleCondition=Abnorml',
 'SaleCondition=AdjLand',
 'SaleCondition=Alloca',
 'SaleCondition=Family',
 'SaleCondition=Normal',
 'SaleCondition=Partial',
 'SaleType=COD',
 'SaleType=CWD',
 'SaleType=Con',
 'SaleType=ConLD',
 'SaleType=ConLI',
 'SaleType=ConLw',
 'SaleType=New',
 'SaleType=Oth',
 'SaleType=WD',
 'TotalBsmtSF',
 'YearBuilt',
 'YearRemodAdd']

 X_train.shape => (1460,41)

至此,便将字符串类型的类别标识转化为数值类型

X_train
array([[  856.,   854.,   150., ...,   856.,  2003.,  2003.],
       [ 1262.,     0.,   284., ...,  1262.,  1976.,  1976.],
       [  920.,   866.,   434., ...,   920.,  2001.,  2002.],
       ..., 
       [ 1188.,  1152.,   877., ...,  1152.,  1941.,  2006.],
       [ 1078.,     0.,     0., ...,  1078.,  1950.,  1996.],
       [ 1256.,     0.,   136., ...,  1256.,  1965.,  1965.]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值