【问题标题】:Converting pandas dataframe to scipy sparse arrays将熊猫数据框转换为 scipy 稀疏数组
【发布时间】:2020-09-04 14:05:15
【问题描述】:

将具有混合列类型(数值、序数和分类)的 pandas 数据框转换为 Scipy 稀疏数组是机器学习的核心问题。

现在,如果我的 pandas 数据框只包含数字数据,那么 I can simply do 将数据框转换为稀疏 csr 矩阵:

scipy.sparse.csr_matrix(df.values)

如果我的数据框包含有序数据类型,我可以使用LabelEncoder 处理它们

from collections import defaultdict
d = defaultdict(LabelEncoder)     
fit = df.apply(lambda x: d[x.name].fit_transform(x))

然后,我可以再次使用以下内容,问题就解决了:

scipy.sparse.csr_matrix(df.values)

具有少量值的分类变量也不是问题。可以使用 pd.get_dummies(Pandas 或 Scikit-Learn 版本)轻松处理它们。

我主要关心的是具有大量值的分类变量。

主要问题:如何处理具有大量值的分类变量?

pd.get_dummies(train_set, columns=[categorical_columns_with_large_number_of_values], sparse=True)

需要很多时间。

This question 似乎给出了有趣的方向,但是,它是否有效地处理所有数据类型尚不清楚。

如果您知道有效的方法,请告诉我。谢谢。

【问题讨论】:

    标签: pandas sparse-matrix


    【解决方案1】:

    您可以使用factorize 非常轻松地将任何单列转换为稀疏 COO 数组。这将比构建一个巨大的密集数据框快得多。

    import pandas as pd
    import scipy.sparse
    
    data = pd.DataFrame({"A": ["1", "2", "A", "C", "A"]})
    
    c, u = pd.factorize(data['A'])
    n, m = data.shape[0], u.shape[0]
    
    one_hot = scipy.sparse.coo_matrix((np.ones(n, dtype=np.int16), (np.arange(n), c)), shape=(n,m))
    

    你会得到如下所示的东西:

    >>> one_hot.A
    array([[1, 0, 0, 0],
           [0, 1, 0, 0],
           [0, 0, 1, 0],
           [0, 0, 0, 1],
           [0, 0, 1, 0]], dtype=int16)
    
    >>> u
    Index(['1', '2', 'A', 'C'], dtype='object')
    

    其中行是您的数据框行,列是您的列的因素(u 将按顺序为这些列添加标签)

    【讨论】:

    • 那么如何将多列合并到一个稀疏矩阵中呢? ML 模型采用一个稀疏矩阵。
    • 此解决方案不起作用。对于具有14350959 唯一值和133267714 行的单列,它显示:MemoryError: Unable to allocate 3.40 PiB for an array with shape (133267714, 14350959) and data type int16。处理多列是另一个问题。
    • 您可以vstack 您的编码数组,但您应该非常仔细地考虑编码的含义以及它如何与您的 ML 方法一起使用。您没有足够的内存来对该数组进行密集表示,如果您调用 array.A,它将失败。
    • 是的,我明白你的意思。但是,我想你的意思是hstack (scipy.sparse.hstack),不是吗?
    猜你喜欢
    • 2016-08-26
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2011-02-02
    • 1970-01-01
    • 2011-12-16
    • 2017-01-02
    相关资源
    最近更新 更多