【问题标题】:How to do the MultiLabelBinarizer in a huge list of lists如何在大量列表中执行 MultiLabelBinarizer
【发布时间】:2020-02-19 16:47:06
【问题描述】:

我正在尝试训练 OneVsRest 算法,它得到一个具有这种形状的 tf-idf 矩阵(称为 x_train):

和 y_train,它是一个列表列表(长度为 3323499)。 每个成员有 5 个标签(最多)。 所以,y_train 看起来像这样:

[['mysql', 'triggers'], ['mercurial', 'rebase'], ['c#', '.net'], ...]

当我执行这段代码时:

ovr_clf = OneVsRestClassifier(SVC(gamma="auto", random_state=42))
ovr_clf.fit(x_train, y_train)

我收到以下消息:

ValueError:您似乎使用的是旧版多标签数据 表示。不再支持序列序列;用一个 二进制数组或稀疏矩阵 - MultiLabelBinarizer 转换器可以转换成这种格式。

尝试执行 MultiLabelBinarizer 后,如下所示:

mlb = MultiLabelBinarizer()
mlb.fit_transform(y_train)

我收到消息:

MemoryError Traceback(最近调用 最后)在 1 mlb = MultiLabelBinarizer() ----> 2 mlb.fit_transform(y_train)

D:\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py 在 fit_transform(自我,y) 884 885 如果不是 self.sparse_output: --> 886 yt = yt.toarray() 887 第888章回来了

D:\Anaconda3\lib\site-packages\scipy\sparse\compressed.py 在 toarray(自我,订单,出) 960 如果 out 是 None 并且 order 是 None: 961订单=self._swap('cf')[0] --> 962 out = self._process_toarray_args(order, out) 963 如果不是(out.flags.c_contiguous 或 out.flags.f_contiguous): 964 raise ValueError('输出数组必须是 C 或 F 连续')

D:\Anaconda3\lib\site-packages\scipy\sparse\base.py 在 _process_toarray_args(self, order, out) 1185 return out 1186 else: -> 1187 返回 np.zeros(self.shape, dtype=self.dtype, order=order) 1188 1189

内存错误:

我假设发生这种情况是因为内存不足。 有没有办法部分地做到这一点,所以我不会耗尽内存?

【问题讨论】:

    标签: python scikit-learn large-files


    【解决方案1】:

    使用稀疏格式

    mlb = MultiLabelBinarizer(sparse_output=True)
    mlb.fit_transform(y_train)
    

    顺便说一句,您应该首先在整个数据集上调用“fit”,然后在火车上进行转换并单独进行测试。这样,如果 y_test 中的标签不在 y_train 中,则不会出现错误。

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2013-06-29
      • 2021-04-12
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      相关资源
      最近更新 更多