【问题标题】:Bug with CalibratedClassifierCV when using a Pipeline with TF-IDF?使用带有 TF-IDF 的管道时出现 CalibratedClassifierCV 的错误?
【发布时间】:2017-06-19 16:08:05
【问题描述】:

首先提前感谢,我真的不知道我是否应该打开一个问题,所以我想检查一下是否有人以前遇到过这个问题。

所以我在使用 CalibratedClassifierCV 进行文本分类时遇到了以下问题。我有一个估算器,它是一个以这种方式创建的 管道(简单示例):

# Import libraries first
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import make_pipeline
from sklearn.calibration import CalibratedClassifierCV
from sklearn.linear_model import LogisticRegression

# Now create the estimators: pipeline -> calibratedclassifier(pipeline)
pipeline = make_pipeline( TfidfVectorizer(), LogisticRegression() )
calibrated_pipeline = CalibratedClassifierCV( pipeline, cv=2 )

现在我们可以创建一个简单的训练集来检查分类器是否有效:

# Create text and labels arrays
text_array = np.array(['Why', 'is', 'this', 'happening'])
outputs = np.array([0,1,0,1])

当我尝试拟合 calibrated_pipeline 对象时,我收到此错误:

ValueError:发现样本数量不一致的输入变量:[1, 4]

如果您愿意,我可以复制整个异常跟踪,但这应该很容易重现。提前非常感谢!

编辑:我在创建数组时犯了一个错误。现已修复(感谢@ogrisel!)另外,调用:

pipeline.fit(text_array, outputs)

工作正常,但使用校准分类器失败!

【问题讨论】:

  • 您应该在报告错误时始终报告完整的回溯。通常情况下,您的问题的答案就在那里。

标签: python scikit-learn pipeline calibration


【解决方案1】:

np.array(['Why', 'is', 'this', 'happening']).reshape(-1,1) 是一个二维字符串数组,而 docstring of the fit_transform method of the TfidfVectorizer class 声明它期望:

    Parameters
    ----------
    raw_documents : iterable
        an iterable which yields either str, unicode or file objects

如果你遍历你的二维 numpy 数组,你会得到一维字符串数组的序列,而不是直接的字符串:

>>> list(text_array)
[array(['Why'], 
      dtype='<U9'), array(['is'], 
      dtype='<U9'), array(['this'], 
      dtype='<U9'), array(['happening'], 
      dtype='<U9')]

所以修复很简单,只需通过:

text_documents = ['Why', 'is', 'this', 'happening']

作为矢量化器的原始输入。

编辑:备注:LogisticRegression 在默认情况下几乎总是一个经过良好校准的分类器。在这种情况下,CalibratedClassifierCV 可能不会带来任何东西。

【讨论】:

  • 非常感谢@ogrisel!确实,逻辑回归通常经过良好校准,但这只是一个示例,在我的实际应用程序中,我需要在管道中使用其他分类器和更多预处理步骤(包括自定义函数)。现在忽略这一点,你是对的,我在重塑矢量时弄错了。然而,运行这个:# Create text and labels arraystext_array = np.array(['Why', 'is', 'this', 'happening'])outputs = np.array([0,1,0,1]) 并且只在pipeline 上调用fit,事情就可以工作,但是在校准的管道中这样做会失败。
  • 另外,@ogrisel 用列表而不是数组调用 fit 也会给我一个错误,这样做仍然适用于 pipeline,但对于 calibrated_pipeline 会失败。错误显示:ValueError: Found input variables with inconsistent numbers of samples: [1, 4]。这可能与校准对象内部估计器预期的输入形状与 TF-IDF 预期的可迭代冲突有关吗?感谢您的努力!伊尼戈。
  • 嗯,我认为这可以被认为是 CallibratedClassifierCV 的一个错误:它的输入验证应该不那么严格(基本上不自己检查,将输入检查委托给底层估计器)。随意在 github 上打开一个问题并发出拉取请求。
  • 非常感谢!我将打开一个问题和公关。并尝试自己解决。最好的问候,伊尼戈
猜你喜欢
  • 2019-03-25
  • 2020-12-23
  • 2021-12-15
  • 2017-03-04
  • 1970-01-01
  • 2020-08-25
  • 2019-03-28
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多