我有以下代码按预期工作:
clf = Pipeline([
('vectorizer', DictVectorizer(sparse=False)),
('classifier', DecisionTreeClassifier(criterion='entropy'))
])
clf.fit(X[:size], y[:size])
score = clf.score(X_test, y_test)
我想在不使用Pipeline的情况下做同样的逻辑:
v = DictVectorizer(sparse=False)
Xdv = v.fit_transform(X[:size])
Xdv_test = v.fit_transform(X_test)
clf = DecisionTreeClassifier(criterion='entropy')
clf.fit(Xdv[:size], y[:size])
clf.score(Xdv_test, y_test)
但是我收到以下错误:
ValueError: Number of features of the model must match the input. Model n_features is 8251 and input n_features is 14303
似乎DictVectorizer学习了测试集的更多功能而不是训练集。我想知道Pipeline如何处理这个问题,我怎样才能做到这一点。
答案 0 :(得分:2)
请勿再次致电fit_transform
。
这样做:
Xdv_test = v.transform(X_test)
当您执行fit()
或fit_transform()
时,dict矢量化工具会忘记上一次调用期间学习的功能(在训练数据上)并再次重新拟合,因此会有不同数量的功能。
当你在管道上clf.score(X_test, y_test)
时,管道将自动适当地处理测试数据。