Pandas - 用 numpy 数组替换分类文本以进行机器学习

问题描述 投票:0回答:2

我有一个文件:

data = pd.read('data.csv')

该文件包含有关数字用户的分类文本数据,例如:(来源 = 'google'、'facebook'、'twitter')和(国家 = 'US'、'FR'、'GER')。

使用

sklearn.feature_extraction.DictVectorizer()
类,我成功地将这些类别转换为 numpy 数组。然后,我创建了一个字典,其中包含作为键的文本类别,以及作为值的相关类别的矢量化 numpy 数组,即:

{'google': np.array([0.,  0.,  0.,  0.,  1.])}
{'facebook': np.array([1., 0., 0., 0., 0.])}
{'FR': np.array([0., 0., 1.])}

我理想中想做的是将每个文本类别(例如“google”)替换为其矢量化numpy数组值(例如

np.array([0.,  0.,  0.,  0.,  1.]
),这样我就可以使用特征缩减算法将特征减少到2、用于可视化目的。

理想情况下,数据中的一行内容如下:

source | country 
google | FR
twitter| US

会读:

source                             | country
np.array([0.,  0.,  0.,  0.,  1.]) | np.array([0., 0., 1.])
np.array([1.,  0.,  0.,  0.,  0.]) | np.array([1., 0., 0.])

有人可以推荐最好的方法吗?

python pandas scikit-learn categorical-data one-hot-encoding
2个回答
1
投票

也许这是将分类转换为数字表示的更简洁的操作。由于我最近主要使用 R,所以我必须稍微温习一下它。 这篇博文是一个很棒的资源。

import pandas as pd
from sklearn.feature_extraction import DictVectorizer

d = {'source' : pd.Series(['google', 'facebook', 'twitter','twitter'],
                          index=['1', '2', '3', '4']),
     'country' : pd.Series(['GER', 'GER', 'US', 'FR'], 
                           index=['1', '2', '3', '4'])}
df = pd.DataFrame(d)
df_as_dicts=df.T.to_dict().values()

df.T
给出转置,然后我们应用
to_dict()
来获取DictVectorizer想要的字典列表。
values()
方法仅返回值,我们不需要索引。

df_as_dicts:

 [{'source': 'google', 'country': 'GER'},
 {'source': 'twitter', 'country': 'US'},
 {'source': 'facebook', 'country': 'GER'},
 {'source': 'twitter', 'country': 'FR'}]

然后使用DictVectorizer进行转换如下:

vectorizer = DictVectorizer( sparse = False )
d_as_vecs = vectorizer.fit_transform( df_as_dicts )

结果:

array([[ 0.,  1.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  1.,  0.,  0.]])
如果我们想检查结果,

get_feature_names()
允许我们从向量化器中检索该数组的列名称。

vectorizer.get_feature_names()
['source=facebook',
 'source=google',
 'source=twitter',
 'country=FR',
 'country=GER',
 'country=US']

我们可以确认转换以 one-hot 编码形式为我们提供了测试数据的正确表示。


0
投票

所以我找到了解决我问题的“一个”解决方案,但也许不是“唯一”的解决方案。我回去为我的键值对创建了新字典:

创建列表来存储键、值:

keys = []
values = []

将键和值添加到列表中:

for column in category_columns:
    keys.append(data[column].unique().tolist())
for matrix in vectorized_data:
    values.append(matrix)

结果(继续我上面的例子):

keys = ['google', 'facebook', 'twitter']
values = [np.array([0.,  0.,  0.,  0.,  1.]), np.array([1.,  0.,  0.,  0.,  0.]), np.array([0.,  1.,  0.,  0.,  0.])]

创建带有键、值的字典列表:

unique_vect = []
for i in range(0, len(keys)):
    unique_vect.append(dict(zip(keys[i], values[i])))

然后我使用 pandas 的

.map()
函数将现有值替换为我从
DictVectorizer

创建的 numpy 数组
data['affiliate_channel'] = data['affiliate_channel'].map(unique_vect[0].get)

我对每一列都重复了这个步骤。

一点点脑力和几个小时的谷歌就能做到这一点,真是太神奇了。如果有人能想到更好/更快/更 Pythonic 的方法来做到这一点,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.