前言:在数据预处理过程中,通常需要对类别特征进行编码,以便机器学习模型能够使用数据。本文介绍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.]])