我在使用scikit-learn,其中我保存了一个逻辑回归模型,该模型使用来自训练集1的单字作为特征。是否可以加载这个模型,然后使用来自第二个训练集(训练集2)的新数据实例来扩展它?如果可以,该如何操作?我这样做的原因是因为我对每个训练集使用了不同的方法(第一种方法涉及特征损坏/正则化,第二种方法涉及自训练)。
为了清晰起见,我添加了一些简单的示例代码:
from sklearn.linear_model import LogisticRegression as logfrom sklearn.feature_extraction.text import CountVectorizer as cvimport pickletrainText1 # 训练集1的文本实例 trainLabel1 # 训练集1的标签 trainText2 # 训练集2的文本实例 trainLabel2 # 训练集2的标签 clf = log()# 逻辑回归分类器使用的计数向量化器 vec = cv() # 使用训练集1的训练文本数据拟合计数向量化器vec.fit(trainText1) # 将文本转换为训练集1的向量train1Text1 = vec.transform(trainText1) # 将训练集1拟合到线性逻辑回归分类器 clf.fit(trainText1,trainLabel1)# 保存来自训练集1的逻辑回归模型modelFileSave = open('modelFromTrainingSet1', 'wb')pickle.dump(clf, modelFileSave)modelFileSave.close() # 加载来自训练集1的逻辑回归模型 modelFileLoad = open('modelFromTrainingSet1', 'rb')clf = pickle.load(modelFileLoad)# 我不知道如何继续...
回答:
LogisticRegression
内部使用liblinear求解器,不支持增量拟合。相反,你可以使用SGDClassifier(loss='log')
,它有一个partial_fit
方法,可以用于这种情况,尽管在实践中,其他超参数是不同的。请小心仔细地网格搜索它们的优化值。阅读SGDClassifier
的文档以了解这些超参数的含义。
CountVectorizer
不支持增量拟合。你必须重用在训练集#1上拟合的向量化器来转换#2。这意味着,训练集#2中任何未在#1中见过的标记将被完全忽略。这可能不是你所期望的。
为了缓解这个问题,你可以使用HashingVectorizer
,它是无状态的,代价是不知道特征的含义。阅读文档以获取更多详情。