使用带有TF-IDF的管道时出现CalibratedClassifierCV错误?

时间:2017-02-02 14:24:54

标签: python scikit-learn pipeline calibration

首先,先谢谢,我真的不知道是否应该打开一个问题所以我想检查一下是否有人曾经面对这个问题。

因此,当使用 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)

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

1 个答案:

答案 0 :(得分:0)

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

如果迭代2D numpy数组,你会得到一系列1D字符串数组而不是直接字符串:

>>> 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在这种情况下不会带来任何东西。