DictVectorizer为训练集学习更多功能

时间:2018-04-30 10:52:37

标签: python numpy scipy scikit-learn

我有以下代码按预期工作:

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如何处理这个问题,我怎样才能做到这一点。

1 个答案:

答案 0 :(得分:2)

请勿再次致电fit_transform

这样做:

Xdv_test = v.transform(X_test)

当您执行fit()fit_transform()时,dict矢量化工具会忘记上一次调用期间学习的功能(在训练数据上)并再次重新拟合,因此会有不同数量的功能。

当你在管道上clf.score(X_test, y_test)时,管道将自动适当地处理测试数据。