我使用sklearn创建了一个SVC模型并将其腌制:
clf=LinearSVC(loss='l2', dual=False, tol=1e-3)
clf.fit(X_train, y_train)
#model_file_name='classify_pages_model'
with open('our_classifier.pkl', 'wb') as fid:
cPickle.dump(clf, fid)
我试着加载它并在另一个文件中使用它,
with open('our_classifier.pkl', 'rb') as fid:
clf = cPickle.load(fid)
X_test=tfidf_vectorizer.fit_transform((get_text(f) for f in urls))
pred=clf.predict(X_test)
它给了我这个错误:
ValueError:X每个样本有664个特征;期待47387
如何确保测试文档中的功能与模型中的功能相同?
---- EDIT
当我在相同的代码中进行训练和测试时,问题不会发生(但只有当我挑选模型并从另一个代码加载它时)
以下代码可以正常工作,但是当我挑选clf时,我无法执行测试部分,因为X_test中的功能数量与clf中的功能数量不同
1-训练
X_train=tfidf_vectorizer.fit_transform((read(f) for f in train_files_paths))
clf=LinearSVC(loss='l2', dual=False, tol=1e-3)
clf.fit(X_train, y_train)
2-测试
X_test=tfidf_vectorizer.transform((get_text(f) for f in urls))
pred=clf.predict(X_test)
答案 0 :(得分:5)
您无法再次在测试集上执行fit_transform
。这是data snooping的一种形式,并且不鼓励(除了在您的示例中不起作用)。所有考虑学习的东西(特征提取都是其中之一)只能在训练集上完成。
您还需要挑选特征提取器,并对测试数据执行transform
。 This answer表明腌制矢量图应该没有问题。