您的位置:首页 > 编程语言 > Python开发

数据预处理系列:(五)分类变量处理

2016-06-25 22:56 429 查看
声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents
博主简介:风雪夜归子(英文名: Allen),机器学习算法攻城狮,喜爱钻研Machine Learning的黑科技,对Deep Learning和Artificial Intelligence充满兴趣,经常关注kaggle数据挖掘竞赛平台,对数据、Machine Learning和Artificial Intelligence有兴趣的各位童鞋可以一起探讨哦,个人CSDN博客: http://blog.csdn.net/u013719780?viewmode=contents


分类变量处理

分类变量是经常遇到的问题。一方面它们提供了信息;另一方面,它们可能是文本形式——纯文字或者与文字相关的整数——就像表格的索引一样。
因此,我们在建模的时候往往需要将这些变量量化,但是仅仅用简单的
id
或者原来的形式是不行的。因为我们也需要避免在上一节里通过阈值创建二元特征遇到的问题。如果我们把数据看成是连续的,那么也必须解释成连续的。


Getting ready

这里
boston
数据集不适合演示。虽然它适合演示二元特征,但是用来创建分类变量不太合适。因此,这里用
iris
数据集演示。
解决问题之前先把问题描述清楚。假设有一个问题,其目标是预测花萼的宽度;那么花的种类就可能是一个有用的特征。
首先,让我们导入数据:

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target


现在
X
y
都获得了对应的值,我们把它们放到一起:

import numpy as np
d = np.column_stack((X, y))



How to do it...

下面我们把花类型
y
对应那一列转换成分类特征:

from sklearn import preprocessing
text_encoder = preprocessing.OneHotEncoder()
text_encoder.fit_transform(d[:, -1:]).toarray()[:5]


Out[9]:

array([[ 1.,  0.,  0.],
[ 1.,  0.,  0.],
[ 1.,  0.,  0.],
[ 1.,  0.,  0.],
[ 1.,  0.,  0.]])



How it works...

这里,编码器为每个分类变量创建了额外的特征,转变成一个稀疏矩阵。矩阵是这样定义的:每一行由0和1构成,对应的分类特征是1,其他都是0。用稀疏矩阵存储数据很合理。
text_encoder
是一个标准的scikit-learn模型,可以重复使用:

text_encoder.transform(np.ones((3, 1))).toarray()


Out[12]:

array([[ 0.,  1.,  0.],
[ 0.,  1.,  0.],
[ 0.,  1.,  0.]])



There's more...

在scikit-learn和Python库中,还有一些方法可以创建分类变量。如果你更倾向于用scikit-learn,而且分类编码原则很简单,可以试试
DictVectorizer
。如果你需要处理更复杂的分类编码原则,
patsy
是很好的选择。


DictVectorizer

DictVectorizer
可以将字符串转换成分类特征:

from sklearn.feature_extraction import DictVectorizer
dv = DictVectorizer()
my_dict = [{'species': iris.target_names[i]} for i in y]
dv.fit_transform(my_dict).toarray()[:5]


Out[13]:

array([[ 1.,  0.,  0.],
[ 1.,  0.,  0.],
[ 1.,  0.,  0.],
[ 1.,  0.,  0.],
[ 1.,  0.,  0.]])


Python的词典可以看成是一个稀疏矩阵,它们只包含非0值。


Pasty

patsy
是另一个分类变量编码的包。经常和
StatsModels
一起用,
patsy
可以把一组字符串转换成一个矩阵。

这部分内容与 scikit-learn关系不大,跳过去也没关系。

例如,如果
x
y
都是字符串,
dm
= patsy.design_matrix("x + y")
将创建适当的列。如果不是,
C(x)
将生成一个分类变量。
例如,初看
iris.target
,可以把它当做是一个连续变量。因此,用下面的命令处理:

import patsy
patsy.dmatrix("0 + C(species)", {'species': iris.target})


Out[16]:

DesignMatrix with shape (150, 3)
C(species)[0]  C(species)[1]  C(species)[2]
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
1              0              0
[120 rows omitted]
Terms:
'C(species)' (columns 0:3)
(to view full data, use np.asarray(this_obj))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息