我可以多次训练我的分类器吗?

tur*_*nip 1 python nlp nltk training-data scikit-learn

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

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

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
Run Code Online (Sandbox Code Playgroud)

这通常是怎么做的?我想避免长时间保持数据库连接打开.

gaw*_*w89 7

您现在正在执行此操作的方式实际上只是在每次创建新的SklearnClassifier对象时覆盖训练数据中每个块的分类器.您需要做的是在进入训练循环之前实例化SklearnClassifier.但是,查看此处的代码,似乎NLTK SklearnClassifier使用fit底层Sklearn模型的方法.这意味着一旦训练模型,您就无法实际更新模型.您需要做的是直接实例化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
Run Code Online (Sandbox Code Playgroud)

最后,您将拥有一个MultinomialNB()分类器,该分类器已经过对每个数据块的训练.

通常情况下,如果整个数据集适合内存,只需下载整个内容并调用fit一次(在这种情况下,您实际上可以使用nltk SklearnClassifier)更高效.请参阅此处有关partial_fit方法的说明.但是,如果您无法将整个集合放入内存中,那么通常的做法就是训练数据块.您可以通过多次调用数据库或从数据库中提取所有信息,将其放在硬盘驱动器上的CSV中,然后从那里读取数据块来完成此操作.

注意

如果您正在与其他用户一起使用共享数据库,那么DBA可能希望您一次性提取所有这些数据库,因为这会(可能)占用更少的数据库资源,而不是对数据库进行几次单独的较小调用.