更新scikit多项式分类器

1 投票
1 回答
712 浏览
提问于 2025-04-18 16:22

我正在尝试用新的训练数据来更新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)之后,你不能再改变类别的数量。你必须提前知道类别的数量,或者重新训练整个模型。

撰写回答