【问题标题】:how to force scikit-learn DictVectorizer not to discard features?如何强制 scikit-learn DictVectorizer 不丢弃特征?
【发布时间】:2013-11-15 05:09:18
【问题描述】:

我正在尝试使用 scikit-learn 进行分类任务。 我的代码从数据中提取特征,并将它们存储在字典中,如下所示:

feature_dict['feature_name_1'] = feature_1
feature_dict['feature_name_2'] = feature_2

当我拆分数据以便使用sklearn.cross_validation 对其进行测试时,一切正常。我遇到的问题是当测试数据是一个新集合,而不是学习集合的一部分(尽管它对每个样本都有相同的确切特征)。在我将分类器放在学习集上之后,当我尝试调用 clf.predict 时,我得到了这个错误:

ValueError: X has different number of features than during model fitting.

我假设这与此有关(在 DictVectorizer 文档之外):

在 fit 或 fit_transform 期间未遇到的命名特征将被 默默地忽略。

DictVectorizer 已经删除了一些我猜想的功能...如何禁用/解决此功能?

谢谢

=== 编辑 ===

问题在于 larsMans 建议我两次拟合 DictVectorizer。

【问题讨论】:

  • 忽略看不见的特征应该防止在训练和测试时具有不同的形状。请显示重现错误的minimal example。您可能已经安装了两次DictVectorizer

标签: python classification scikit-learn


【解决方案1】:

您应该在训练集上使用fit_transform,而在测试集上只使用transform

【讨论】:

  • 谢谢,你拯救了我的一天。这完全解决了我的问题。
【解决方案2】:

您是否确保在测试数据上调用先前构建的缩放器和选择器转换?

scaler = preprocessing.StandardScaler().fit(trainingData)
selector = SelectPercentile(f_classif, percentile=90)
selector.fit(scaler.transform(trainingData), labelsTrain)
...
...
predicted = clf.predict(selector.transform(scaler.transform(testingData)))#

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 2015-02-12
    • 2015-05-09
    • 2015-06-15
    • 2016-02-25
    • 2018-02-24
    • 2018-06-01
    • 2017-11-04
    • 2015-01-12
    相关资源
    最近更新 更多