【问题标题】:Can I train my classifier multiple times?我可以多次训练我的分类器吗?
【发布时间】:2018-06-01 20:16:06
【问题描述】:

我正在使用nltk 和sklearn 构建一个基本的NLP 程序。我在数据库中有一个大型数据集,我想知道训练分类器的最佳方法是什么。

是否建议以块的形式下载训练数据并将每个块传递给分类器?这是否可能,或者我会覆盖从前一个块中学到的东西?

from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.naive_bayes import MultinomialNB

while True:
    training_set, proceed = download_chunk()  # pseudo
    trained = SklearnClassifier(MultinomialNB()).train(training_set)
    if not proceed:
        break

这通常是如何完成的?我想避免让数据库连接保持打开太久。

【问题讨论】:

    标签: python scikit-learn nlp nltk training-data


    【解决方案1】:

    您现在的做法实际上只会覆盖训练数据中每个块的分类器,因为您每次都在创建新的 SklearnClassifier 对象。您需要做的是在进入训练循环之前实例化 SklearnClassifier。但是,查看代码here,似乎NLTK SklearnClassifier 使用了底层Sklearn 模型的fit 方法。这意味着一旦模型经过训练,您就无法真正更新它。您需要做的是直接实例化 Sklearn 模型并使用partial_fit 方法。像这样的东西应该可以工作:

    from nltk.classify.scikitlearn import SklearnClassifier
    from sklearn.naive_bayes import MultinomialNB
    
    clf = MultinomialNB() # must instantiate classifier outside of the loop or it will just get overwritten
    
    while True:
        training_set, proceed = download_chunk()  # pseudo
        clf.partial_fit(training_set)
        if not proceed:
            break
    

    最后,您将拥有一个 MultinomialNB() 分类器,该分类器已针对您的每个数据块进行了训练。

    通常,如果整个数据集都适合内存,则只需下载整个数据并调用一次fit(在这种情况下,您实际上可以使用 nltk SklearnClassifier),这样的性能会更高一些。请参阅有关partial_fit 方法here 的注释。但是,如果您无法将整个集合放入内存中,那么在数据块上进行训练当然是常见的做法。您可以通过多次调用数据库或从数据库中提取所有信息,将其以 CSV 格式保存在您的硬盘上,然后从那里读取数据块。

    注意

    如果您使用与其他用户共享的数据库,DBA 可能更希望您一次提取所有数据库,因为与对数据库进行多次单独、较小的调用相比,这(可能)占用的数据库资源更少会的。

    【讨论】:

    • 我试试看!这种“块”策略是否可行,或者通常以不同的方式实现?例如,我是否应该只编写一个脚本来下载整个数据集并将文件传递给训练器?
    • 我更新了答案以解决您的第二个问题。
    • 谢谢,这很有帮助。还有一件事; partial_fit 方法至少需要 3 个参数,并且阅读文档我不是 100% 清楚它们应该是什么。你能解释一下吗?
    • X 是您的训练数据,Y 是结果变量,classes 是可能出现在 Y 中的所有可能类的列表。这是因为,在对数据子集进行训练时,您可能不会在每个子集中获得每个可能的类。例如,我可能有 5 个不同的类 [a, b, c, d, e],如果我有一大块 5 个样本长的训练数据,我最终可能会得到 [a, a, b, c, a]。 d 和 e 类不在该数据集中。如果我没有可能的类的列表,如果d 或e 出现在下一个训练集中,我的分类器将会中断(Sklearn 会抛出错误)。
    • @Petar 第三个参数只在第一次调用partial_fit时需要,后续调用可以忽略。
    猜你喜欢
    • 2019-01-28
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多