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

neo*_*o33 2 python scikit-learn sklearn-pandas

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

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

[1 0 0 ..., 0 0 0]
Run Code Online (Sandbox Code Playgroud)

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

print(df['city'])
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

这是我试过的:

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']))
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

[0]
[63]
[1]
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*ush 7

一种选择pd.get_dummies(完全在sklearn生态系统之外).

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

如果您需要NumPy数组,只需抓住values.

pd.get_dummies(df).values
Run Code Online (Sandbox Code Playgroud)
[[0 1 0]
 [1 0 0]
 [0 0 1]
 [0 0 1]]
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用组合LabelEncoderOneHotEncoder.如您所知,LabelEncoder将返回任意标签数组的分类索引.OneHotEncoder将这些索引翻转成一个k编码方案.

le = LabelEncoder()
enc = OneHotEncoder(sparse=False)
enc.fit_transform(le.fit_transform(df.city.values).reshape(-1, 1))
Run Code Online (Sandbox Code Playgroud)
[[ 0.  1.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 0.  0.  1.]]
Run Code Online (Sandbox Code Playgroud)

另一种选择是DictVectorizer.

dv = DictVectorizer(sparse=False)
dv.fit_transform(df.apply(dict, 1))
Run Code Online (Sandbox Code Playgroud)
[[ 0.  1.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 0.  0.  1.]]
Run Code Online (Sandbox Code Playgroud)