【问题标题】:DictVectorizer learns more features for the training setDictVectorizer 为训练集学习更多特征
【发布时间】:2018-10-10 11:02:03
【问题描述】:

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

clf = Pipeline([
    ('vectorizer', DictVectorizer(sparse=False)),
    ('classifier', DecisionTreeClassifier(criterion='entropy'))
])

clf.fit(X[:size], y[:size])

score = clf.score(X_test, y_test)

我想在不使用管道的情况下执行相同的逻辑:

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 是如何处理这个问题的,我该如何完成。

【问题讨论】:

  • 您应该在测试集上使用适合您的训练集的矢量化器,而不是再次拟合它,即Xdv_test = v.transform(X_test)。另外,您如何拆分XX_test?为什么你需要[:size] 只为X

标签: python numpy scipy scikit-learn


【解决方案1】:

不要再拨打fit_transform

这样做:

Xdv_test = v.transform(X_test)

当您执行fit()fit_transform() 时,dict 矢量化器将忘记在先前调用期间(在训练数据上)学习的特征并再次重新拟合,因此特征数量不同。

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

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2014-12-27
    • 2016-07-31
    • 2018-05-10
    • 2014-06-01
    • 2017-06-25
    • 2012-08-20
    • 1970-01-01
    • 2022-08-08
    相关资源
    最近更新 更多