【问题标题】:How to vectorize categorical data如何矢量化分类数据
【发布时间】:2017-06-21 04:28:15
【问题描述】:

我想对一些分类数据进行矢量化,以构建训练和测试矩阵。

我有 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]

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

【问题讨论】:

  • 你确定你不是在寻找OneHotEncoder吗?这听起来更像是你在寻找我。

标签: python scikit-learn sklearn-pandas


【解决方案1】:

一个选项是pd.get_dummies(完全在sklearn 生态系统之外)。

df = pd.DataFrame(['METROPOLITANA DE SANTIAGO', 'COQUIMBO', 'SANTIAGO', 'SANTIAGO'],
                  columns=['city'])
pd.get_dummies(df)
   city_COQUIMBO  city_METROPOLITANA DE SANTIAGO  city_SANTIAGO
0              0                               1              0
1              1                               0              0
2              0                               0              1
3              0                               0              1

如果您需要 NumPy 数组,只需获取 values。

pd.get_dummies(df).values
[[0 1 0]
 [1 0 0]
 [0 0 1]
 [0 0 1]]

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

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))
[[ 0.  1.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 0.  0.  1.]]

【讨论】:

  • 感谢支持,这非常有帮助,但是,这将给我 85 列,然后我需要找到一种方法将这 85 列转换为 numpy 数组以构建矩阵跨度>
  • @neo 我编辑了我的答案以展示如何从pd.get_dummies 的结果中提取ndarray,以及另外两种方法。
  • @感谢您的帮助,非常感谢您的支持,非常感谢
猜你喜欢
  • 2015-02-26
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多