我正在学习一个项目的Scikit机器学习,而我开始掌握一般过程,细节仍然有点模糊。
之前我设法构建了一个分类器,训练它并用测试集测试它。我用cPickle将它保存到磁盘。现在我想创建一个加载此分类器的类,并允许用户使用它对单个推文进行分类。
我认为这将是微不足道的,但我似乎从X_new_tfidf = self.tfidf_transformer.fit_transform(fitTweetVec)行获得ValueError('dimension mismatch'),其代码如下:
class TweetClassifier:
classifier = None
vect = TfidfVectorizer()
tfidf_transformer = TfidfTransformer()
#open the classifier saved to disk to be utilized later
def openClassifier(self, name):
with open(name+'.pkl', 'rb') as fid:
return cPickle.load(fid)
def __init__(self, classifierName):
self.classifier = self.openClassifier(classifierName)
self.classifyTweet(np.array([u"Helvetin vittu miksi aina pitää sataa vettä???"]))
def classifyTweet(self, tweetText):
fitTweetVec = self.vect.fit_transform(tweetText)
print self.vect.get_feature_names()
X_new_tfidf = self.tfidf_transformer.fit_transform(fitTweetVec)
print self.classifier.predict(X_new_tfidf)
我在这里做错了什么?我在制作分类器并为其运行测试集时使用了类似的代码。我忘记了一些重要的步骤吗?
现在我承认我还没有完全理解这里的拟合和转换,因为我发现Scikit的教程有点含糊不清。如果有人知道尽可能清楚地解释它们,我都是为了链接:)
答案 0 :(得分:2)
问题是您的分类器是使用固定数量的功能(之前数据的词汇长度)进行培训的,现在当您fit_transform
新推文时,TfidfTransformer
会生成新的词汇和新的功能,将代表这个领域的新推文。
解决方法是保存以前适合的TfidfTransformer
(包含旧词汇表),使用分类器和.transform
(不是fit_transform
加载它,因为它已经适合旧数据)这个相同表示的新推文。
您还可以使用包含Pipeline
和TfidfTransformer
的{{1}}并挑选Classifier
,这更容易并且推荐使用。