【问题标题】:Training classifier with large data大数据训练分类器
【发布时间】:2016-07-03 09:22:17
【问题描述】:

我正在尝试使用两类文本分类。通常我会创建训练模型的 Pickle 文件,并在训练阶段加载这些 pickle 以消除重新训练。

当每个班级有 12000 条评论 + 超过 50000 条推文时,训练模型大小变为 1.4 GB。

现在将这么大的模型数据存储到 Pickle 并加载它确实不可行也不可取。

有没有更好的替代方案?

这里是示例代码,我尝试了多种腌制方式,这里我使用了dill

    def train(self):
            global pos, neg, totals
            retrain = False

            # Load counts if they already exist.
            if not retrain and os.path.isfile(CDATA_FILE):
                    # pos, neg, totals = cPickle.load(open(CDATA_FILE))
                    pos, neg, totals = dill.load(open(CDATA_FILE, 'r'))
                    return

            for file in os.listdir("./suspected/"):
                    for word in set(self.negate_sequence(open("./unsuspected/" + file).read())):
                            neg[word] += 1
                            pos['not_' + word] += 1
            for file in os.listdir("./suspected/"):
                    for word in set(self.negate_sequence(open("./suspected/" + file).read())):
                            pos[word] += 1
                            neg['not_' + word] += 1

            self.prune_features()

            totals[0] = sum(pos.values())
            totals[1] = sum(neg.values())

            countdata = (pos, neg, totals)
            dill.dump(countdata, open(CDATA_FILE, 'w') )

更新:大泡菜背后的原因是,分类数据非常大。我考虑过 1-4 克用于特征选择。分类数据集本身大约 300mb,因此考虑使用多重方法进行特征选择会创建大型训练模型。

【问题讨论】:

  • dill 一点也不熟悉,但你看过它创建的泡菜吗?我猜你可以识别出不需要腌制的东西,并为你自己创建一个更好的序列化。显然,更多的工作,但也许至少用关于泡菜这么大的原因的观察来更新这个问题......?
  • @tripleee:大泡菜背后的原因是,分类数据非常大。我考虑过 1-4 克用于特征选择。

标签: python machine-learning classification pickle text-classification


【解决方案1】:

Pickle 作为一种格式非常重。它存储对象的所有详细信息。 以像 hdf5 这样的高效格式存储数据会更好。 如果您不熟悉 hdf5,您可以考虑将数据存储在简单的平面文本文件中。您可以使用 csv 或 json,具体取决于您的数据结构。你会发现任何一个都比泡菜更有效。

您可以查看gzip 来创建和加载压缩档案。

【讨论】:

  • 我将对象存储到泡菜中。纯文本文件将无法存储对象。并且单个对象不能存储到多个文件中,因此应该只有一个文件包含整个对象数据。 hdf5 我必须检查一下。
  • 如果没有其他方法可以序列化您的模型,则您的设置非常不寻常。大多数机器学习系统都会生成某种字典,将一组输入特征映射到一组结果。这可能是加权边缘列表或类似的东西。根据您的描述,我希望您的结果可以表达为一个字典,将输入标记映射到数字标识符,另一个将这些元组映射到一组类别权重。
【解决方案2】:

问题和解决方案在here进行了解释。简而言之,问题是由于在进行特征化时,例如使用CountVectorizer,尽管您可能会要求少量功能,例如max_features=1000,transformer 仍然保留所有可能功能的副本以用于调试目的,在引擎盖下。 例如,CountVectorizer 具有以下属性:

stop_words_ : set
Terms that were ignored because they either:
- occurred in too many documents (max_df)
- occurred in too few documents (min_df)
- were cut off by feature selection (max_features).
This is only available if no vocabulary was given.

这会导致模型尺寸变得太大。要解决此问题,您可以在酸洗模型之前将stop_words_ 设置为None(取自上述链接的示例):(请查看link above 了解详细信息)

import pickle

model_name = 'clickbait-model-sm.pkl'
cfr_pipeline.named_steps.vectorizer.stop_words_ = None
pickle.dump(cfr_pipeline, open(model_name, 'wb'), protocol=2)

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2018-04-19
    • 2020-08-15
    • 1970-01-01
    • 2013-04-11
    • 2015-03-13
    • 2017-06-02
    • 2014-05-28
    • 2013-08-30
    相关资源
    最近更新 更多