python sklearn pickled model没有相同数量的功能

时间:2013-12-06 21:17:24

标签: python scikit-learn

我使用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)

1 个答案:

答案 0 :(得分:5)

您无法再次在测试集上执行fit_transform。这是data snooping的一种形式,并且不鼓励(除了在您的示例中不起作用)。所有考虑学习的东西(特征提取都是其中之一)只能在训练集上完成。

您还需要挑选特征提取器,并对测试数据执行transformThis answer表明腌制矢量图应该没有问题。