更新scikit多项式分类器
我正在尝试用新的训练数据来更新scikit的多项式分类器。以下是我尝试过的代码:
from sklearn.feature_extraction.text import HashingVectorizer
import numpy as np
from sklearn.naive_bayes import MultinomialNB
# Training with first training set
targets = ['education','film','sports','laptops','phones']
x = ["football is the sport","gravity is the movie", "education is imporatant","lenovo is a laptop","android phones"]
y = np.array([2,1,0,3,4])
clf = MultinomialNB()
vectorizer = HashingVectorizer(stop_words='english', non_negative=True,
n_features=32*2)
X_train = vectorizer.transform(x)
clf.partial_fit(X_train, y, classes=[0,1,2,3,4])
#Testing with First training set
test_data = ["android","lenovo","Transformers"]
X_test = vectorizer.transform(test_data)
print "Using Initial classifier"
pred = clf.predict(X_test)
for doc, category in zip(test_data, pred):
print('%r => %s' % (doc, targets[category]))
# Training with updated training set
x = ["cricket", "Transformers is a film","which college"]
y = np.array([2,1,0])
X_train = vectorizer.transform(x)
clf.partial_fit(X_train, y)
# Testing with the updated trainign set
test_data = ["android","lenovo","Transformers"]
X_test = vectorizer.transform(test_data)
print "\nUsing Updatable classifiers"
pred = clf.predict(X_test)
for doc, category in zip(test_data, pred):
print('%r => %s' % (doc, targets[category]))
这个代码的输出是:
Using Initial classifier
'android' => phones
'lenovo' => laptops
'Transformers' => education
Using Updatable classifiers
'android' => sports
'lenovo' => education
'Transformers' => film
我对此有两个问题:
1) “lenovo”这个类别的结果不对,因为在更新分类器时没有包含这个类别的训练数据。有没有办法解决这个问题?我不想每次更新分类器时都提供每个类别的训练数据。所以我希望即使只提供一个类别的数据,分类器也能正常工作。
2) 我该如何向现有的分类器添加新类别?比如说我想添加一个“健康”这个新类别,是否有办法做到这一点?
希望能得到帮助,谢谢!
1 个回答
1
在处理第一批数据时,不要直接调用 fit
,而是应该使用 partial_fit
,并把你问题中所有的类别作为 classes
参数传进去:
clf.partial_fit(X, y, classes=targets)
(这里假设 y
里实际上是类别标签,而不是它们的索引。)
在第一次调用 partial_fit
(或者 fit
)之后,你不能再改变类别的数量。你必须提前知道类别的数量,或者重新训练整个模型。