如何向量化分类数据
How to vectorize categorical data
我想对一些分类数据进行矢量化,以构建训练和测试矩阵。
我有 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]
问题是我只是获取城市的索引,我正在寻找如何向量化数据的建议。
一个选项是 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
将 return 任意标签数组的分类索引。 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 个城市,我想要一个包含 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]
问题是我只是获取城市的索引,我正在寻找如何向量化数据的建议。
一个选项是 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
将 return 任意标签数组的分类索引。 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.]]