【问题标题】:Memory Error when attempting to apply 'fit_transform()' on TFidfVectorizer containing Pandas Dataframe column (containing strings)尝试在包含 Pandas Dataframe 列(包含字符串)的 TFidfVectorizer 上应用“fit_transform()”时出现内存错误
【发布时间】:2018-08-20 18:01:57
【问题描述】:

我正在尝试类似 here 所示的操作。 我首先从包含 2405 行格式的 CSV 文件中读取两列:年份,例如“1995”和清洁,例如["this", "is, "exemplar", "document", "contents"],两列都使用字符串作为数据类型。

    df = pandas.read_csv("ukgovClean.csv", encoding='utf-8', usecols=[0,2])

我已经对数据进行了预清理,下面是前4行的格式:

     [IN] df.head()

    [OUT]   Year    cleaned
         0  1909    acquaint hous receiv follow letter clerk crown...
         1  1909    ask secretari state war whether issu statement...
         2  1909    i beg present petit sign upward motor car driv...
         3  1909    i desir ask secretari state war second lieuten...
         4  1909    ask secretari state war whether would introduc...

    [IN] df['cleaned'].head()

   [OUT] 0    acquaint hous receiv follow letter clerk crown...
         1    ask secretari state war whether issu statement...
         2    i beg present petit sign upward motor car driv...
         3    i desir ask secretari state war second lieuten...
         4    ask secretari state war whether would introduc...
         Name: cleaned, dtype: object

然后我初始化 TfidfVectorizer:

    [IN] v = TfidfVectorizer(decode_error='replace', encoding='utf-8')

在此之后,调用下面的行会导致:

    [IN] x = v.fit_transform(df['cleaned'])
   [OUT] ValueError: np.nan is an invalid document, expected byte or unicode string.

我使用上述thread 中的解决方案克服了这个问题:

    [IN] x = v.fit_transform(df['cleaned'].values.astype('U'))

但是,这导致了内存错误 (Full Traceback)。

我尝试使用 Pickle 查找存储以规避大容量内存使用,但我不确定如何在这种情况下过滤它。任何提示将不胜感激,感谢您的阅读。

[更新]

@pittsburgh137 发布了一个类似问题的解决方案,涉及拟合数据here,其中训练数据是使用pandas.get_dummies() 生成的。我所做的是:

    [IN] train_X = pandas.get_dummies(df['cleaned'])
    [IN] train_X.shape
   [OUT] (2405, 2380)

    [IN] x = v.fit_transform(train_X)
    [IN] type(x)
   [OUT] scipy.sparse.csr.csr_matrix

我想我应该更新所有读者,同时看到我可以用这个开发做什么。如果这种方法有任何可预测的缺陷,我很想听听。

【问题讨论】:

    标签: python pandas csv scikit-learn tf-idf


    【解决方案1】:

    我相信转换为dtype('<Unn') 可能会给您带来麻烦。仅使用前几个文档加上一个 NaN,以相对方式检查数组的大小:

    >>> df['cleaned'].values
    array(['acquaint hous receiv follow letter clerk crown',
           'ask secretari state war whether issu statement',
           'i beg present petit sign upward motor car driv',
           'i desir ask secretari state war second lieuten',
           'ask secretari state war whether would introduc', nan],
          dtype=object)
    
    >>> df['cleaned'].values.astype('U').nbytes
    1104
    
    >>> df['cleaned'].values.nbytes
    48
    

    似乎首先删除 NaN 值是有意义的 (df.dropna(inplace=True))。那么,调用v.fit_transform(df['cleaned'].tolist())应该会很高效。

    【讨论】:

    • 我实现了您共享的两个功能(谢谢),并实现了这个结果:<2380x144824 sparse matrix of type '<class 'numpy.float64'>' with 11728974 stored elements in Compressed Sparse Row format> - 但是,我想知道我是否刚刚取消了正在使用的数据,因为它不再是与年份数据有关?
    • 不确定我是否在关注 - 你还有 df.year 作为 (2380,) 数组,不是吗?
    • 另外,考虑将stop_words='english' 传递给TfidfVectorizer 以减少功能数量。
    • 你说得对,抱歉,我一直在努力解决这个问题(以某种形式)好几天了!当我清理数据时,我已经通过 Snowball Stemmer 应用了stop_words='english'',但我像你说的那样将它实现到了TfidfVectorizer。我现在只是再次处理转换 - 之后,我将继续进行流水线流程的其余部分。
    • 非常感谢您迄今为止的帮助,但是,在创建我的 X 和 y 训练/测试数据集(以便我可以将它们用作分类的稀疏矩阵等)时,调用 X = v.fit_transform(df['cleaned']) 操作完全符合预期(如本线程中所示),而调用 fit_transform(X, df['Year']) 会产生相同的 MemoryError?我尝试再次重新申请df.dropna,但无济于事。此内存错误似乎仅归因于 y 值。
    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 2019-06-13
    • 2012-07-26
    • 2022-01-15
    • 2018-05-10
    • 1970-01-01
    • 2016-06-16
    • 2017-03-18
    相关资源
    最近更新 更多