我在这里有我的代码,其中它循环遍历每个标签或类别,然后从中创建一个模型。但是,我要创建一个通用模型,该模型将能够接受来自用户输入的新预测。
我知道下面的代码保存了适合循环中最后一个类别的模型。如何解决此问题,以便保存每个类别的模型,以便在加载这些模型时能够预测新文本的标签?
vectorizer = TfidfVectorizer(strip_accents='unicode',
stop_words=stop_words, analyzer='word', ngram_range=(1,3), norm='l2')
vectorizer.fit(train_text)
vectorizer.fit(test_text)
x_train = vectorizer.transform(train_text)
y_train = train.drop(labels = ['question_body'], axis=1)
x_test = vectorizer.transform(test_text)
y_test = test.drop(labels = ['question_body'], axis=1)
# Using pipeline for applying linearSVC and one vs rest classifier
SVC_pipeline = Pipeline([
('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
])
for category in categories:
print('... Processing {}'.format(category))
# train the SVC model using X_dtm & y
SVC_pipeline.fit(x_train, train[category])
# compute the testing accuracy of SVC
svc_prediction = SVC_pipeline.predict(x_test)
print("SVC Prediction:")
print(svc_prediction)
print('Test accuracy is {}'.format(f1_score(test[category], svc_prediction)))
print("\n")
#save the model to disk
filename = 'svc_model.sav'
pickle.dump(SVC_pipeline, open(filename, 'wb'))
答案 0 :(得分:0)
您的代码中存在多个错误。
您正在使TfidfVectorizer
既适合训练又适合测试:
vectorizer.fit(train_text)
vectorizer.fit(test_text)
这是错误的。调用fit()
不是增量的。如果调用两次,它将不会在两个数据上学习。最近对fit()
的呼叫将忘记过去的呼叫中的所有内容。您永远不会在测试数据上放入(学习)某些内容。
您需要做的是这样
vectorizer.fit(train_text)
管道不符合您的想法:
# Using pipeline for applying linearSVC and one vs rest classifier
SVC_pipeline = Pipeline([
('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
])
请注意,您正在LinearSVC
内部传递OneVsRestClassifier
,因此它将自动使用它而无需Pipeline
。 Pipeline
在这里不会做任何事情。当您要依次通过多个模型传递数据时,可以使用Pipeline
。像这样:
pipe = Pipeline([
('pca', pca),
('logistic', LogisticRegression())
])
以上pipe
所要做的就是将数据传递到PCA
并将其转换。然后,新数据将传递到LogisticRegression
,依此类推。
根据您的情况正确使用管道可以是:
SVC_pipeline = Pipeline([
('vectorizer', vectorizer)
('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
])
在此处查看更多示例:
您需要描述有关您的"categories"
的更多信息。显示一些数据示例。您没有在任何地方使用y_train
和y_test
。类别与"question_body"
不同吗?