【问题标题】:Pandas - replace categorical text with numpy arrays for machine learningPandas - 用 numpy 数组替换分类文本以进行机器学习
【发布时间】:2016-01-12 14:01:16
【问题描述】:

我有一个文件:

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

该文件包含有关数字用户的分类文本数据,例如:(source = 'google', 'facebook', 'twitter') 和 (country = '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.])}

我最理想的做法是用向量化的 numpy 数组值(例如 np.array([0., 0., 0., 0., 1.])替换每个文本类别(例如“google”),这样我就可以使用特征缩减算法来减少特征低至 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.])

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

【问题讨论】:

    标签: pandas scikit-learn


    【解决方案1】:

    也许这是将分类转换为数字表示的更简洁的操作。因为我最近大部分时间都在使用 R,所以我不得不稍微复习一下。 This blog post 是一个很好的资源。

    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']
    

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

    【讨论】:

    • 很好的答案@Seth_P
    【解决方案2】:

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

    创建列表以将键、值存储在:

    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)
    

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

    一点点脑力和几个小时的 Google 可以做到的事情令人惊叹。如果有人能想到更好/更快/更 Pythonic 的方式来做到这一点,我将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 2020-05-29
      • 2015-06-02
      • 2015-01-16
      • 1970-01-01
      • 2020-02-08
      • 2021-06-17
      • 2019-01-27
      相关资源
      最近更新 更多