我使用scikit learn保存了一个逻辑回归模型,其中unigram是训练集1的特征。是否可以加载此模型,然后使用第二个训练集(训练集2)中的新数据实例进行扩展?如果是,如何做到这一点?之所以这样做,是因为我对每个训练集使用了两种不同的方法(第一种方法涉及特征破坏/正则化,第二种方法涉及自我训练)。
为了清晰起见,我添加了一些简单的示例代码:
from sklearn.linear_model import LogisticRegression as log
from sklearn.feature_extraction.text import CountVectorizer as cv
import pickle
trainText1 # Training set 1 text instances
trainLabel1 # Training set 1 labels
trainText2 # Training set 2 text instances
trainLabel2 # Training set 2 labels
clf = log()
# Count vectorizer used by the logistic regression classifier
vec = cv()
# Fit count vectorizer with training text data from training set 1
vec.fit(trainText1)
# Transforms text into vectors for training set1
train1Text1 = vec.transform(trainText1)
# Fitting training set1 to the linear logistic regression classifier
clf.fit(trainText1,trainLabel1)
# Saving logistic regression model from training set 1
modelFileSave = open('modelFromTrainingSet1', 'wb')
pickle.dump(clf, modelFileSave)
modelFileSave.close()
# Loading logistic regression model from training set 1
modelFileLoad = open('modelFromTrainingSet1', 'rb')
clf = pickle.load(modelFileLoad)
# I'm unsure how to continue from here....
LogisticRegression
在内部使用不支持增量拟合的liblinear解算器。相反,您可以使用SGDClassifier(loss='log')
作为partial_fit
方法,尽管在实践中也可以使用该方法。其他超参数不同。小心网格搜索它们的最佳值。阅读SGDClassifier
文档了解这些超参数的含义。
CountVectorizer
不支持增量拟合。您必须重用安装在#1列车上的矢量器来变换#2。这意味着,集合#2中尚未在#1中看到的任何令牌都将被完全忽略。这可能不是你所期望的。
为了减轻这种情况,您可以使用无状态的HashingVectorizer
,代价是不知道这些特性的含义。有关更多详细信息,请阅读文档。