如何对分类数据进行矢量化

时间:2017-02-03 18:04:04

标签: python scikit-learn sklearn-pandas

我想对一些分类数据进行矢量化,以便建立一个列车和测试矩阵。

我有85个城市,我想得到一个282520行的矩阵,每一行都是像

这样的向量
[1 0 0 ..., 0 0 0]

我希望每行有一个向量,其中1或0取决于城市,因此每个城市都应该是一列:

print(df['city'])
0         METROPOLITANA DE SANTIAGO
1         METROPOLITANA DE SANTIAGO
2         METROPOLITANA DE SANTIAGO
3         METROPOLITANA DE SANTIAGO
4                          COQUIMBO
5                          SANTIAGO
6                          SANTIAGO
7         METROPOLITANA DE SANTIAGO
8         METROPOLITANA DE SANTIAGO
9         METROPOLITANA DE SANTIAGO
10                          BIO BIO
11                         COQUIMBO
...                             ...
282520    METROPOLITANA DE SANTIAGO
Name: city, dtype: object

这就是我的尝试:

from sklearn import preprocessing

list_city = getList(df,'city')
le = preprocessing.LabelEncoder()
le.fit(list_city)

print(le.transform(['AISEN'])) 
print(le.transform(['TARAPACA']))
print(le.transform(['AISEN DEL GENERAL CARLOS IBANEZ DEL CAMP']))

我得到以下输出:

[0]
[63]
[1]

问题是我只是得到了城市的索引,我正在寻找如何对数据进行矢量化的建议。

1 个答案:

答案 0 :(得分:6)

一个选项是<script type="text/javascript"> $(document).bind("mobileinit", function() { $.mobile.ajaxEnabled = false; $.mobile.hideUrlBar = false; // <---- add this line }); var GLOBAL = { language : 'de' }; </script> (完全在pd.get_dummies生态系统之外)。

sklearn
df = pd.DataFrame(['METROPOLITANA DE SANTIAGO', 'COQUIMBO', 'SANTIAGO', 'SANTIAGO'],
                  columns=['city'])
pd.get_dummies(df)

如果您需要NumPy数组,只需抓住 city_COQUIMBO city_METROPOLITANA DE SANTIAGO city_SANTIAGO 0 0 1 0 1 1 0 0 2 0 0 1 3 0 0 1

values
pd.get_dummies(df).values

另一种方法是使用[[0 1 0] [1 0 0] [0 0 1] [0 0 1]] LabelEncoder的组合。正如您所注意到的,OneHotEncoder将返回任意标签数组的分类索引。 LabelEncoder会将这些索引转换为k-k编码方案。

OneHotEncoder
le = LabelEncoder()
enc = OneHotEncoder(sparse=False)
enc.fit_transform(le.fit_transform(df.city.values).reshape(-1, 1))

另一种选择是[[ 0. 1. 0.] [ 1. 0. 0.] [ 0. 0. 1.] [ 0. 0. 1.]]

DictVectorizer
dv = DictVectorizer(sparse=False)
dv.fit_transform(df.apply(dict, 1))