如何使用scikit-learn加载已保存的模型并用新训练数据扩展模型
我正在使用scikit-learn,并且我已经保存了一个逻辑回归模型,这个模型是用第一组训练数据中的单个词(unigrams)作为特征训练出来的。请问我能否加载这个模型,然后用第二组训练数据(训练集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....
1 个回答
4
LogisticRegression
内部使用的liblinear求解器不支持增量训练,也就是说它不能逐步学习新数据。如果你想要这种功能,可以使用SGDClassifier(loss='log')
,它有一个partial_fit
方法,可以用来逐步训练。不过要注意的是,其他的一些参数可能会有所不同,所以在调整这些参数时要小心,确保找到最优值。可以查看SGDClassifier
的文档,了解这些参数的具体含义。
CountVectorizer
也不支持增量训练。你需要重新使用在第一组训练数据上训练好的向量化器来处理第二组数据。这意味着第二组数据中任何在第一组中没有出现过的词汇都会被完全忽略,这可能和你的预期不符。
为了避免这个问题,你可以使用HashingVectorizer
,它是无状态的,但代价是你无法知道特征的具体含义。想了解更多细节,可以查看文档。