【问题标题】:Scikit-learn 0.15.2 - OneVsRestClassifier not works due to predict_proba not availableScikit-learn 0.15.2 - 由于 predict_proba 不可用,OneVsRestClassifier 不起作用
【发布时间】:2015-02-06 12:33:30
【问题描述】:

我正在尝试像下面这样进行 onevsrest 分类:

classifier = Pipeline([('vectorizer', CountVectorizer()),('tfidf', TfidfTransformer()),('clf', OneVsRestClassifier(SVC(kernel='rbf')))])

classifier.fit(X_train, Y)

predicted = classifier.predict(X_test)

我得到错误“predict_proba 在概率 = false 时不可用”。我看到报告了一个错误,如下所示: https://github.com/scikit-learn/scikit-learn/issues/1946

它已按固定方式关闭,所以我从我的 Windows PC 中删除了 scikit-learn,并完全重新下载了 scikit-learn 以拥有 0.15.2 版本。但我仍然得到这个错误。有什么建议?还是我理解错了,除非我指定probability=true,否则我仍然无法将SVC 与OneVSRestClassifier 一起使用?

更新:澄清一下,我正在尝试实际实现多标签分类,这里是数据源:

df = pd.read_csv(fileIn, header = 0, encoding='utf-8-sig')
rows = random.sample(df.index, int(len(df) * 0.9))

work = df.ix[rows]

work_test = df.drop(rows)

X_train = []

y_train = []

X_test = []

y_test = []
for i in work[[i for i in list(work.columns.values) if i.startswith('Change')]].values:
    X_train.append(','.join(i.T.tolist()))

X_train = np.array(X_train)

for i in work[[i for i in list(work.columns.values) if i.startswith('Corax')]].values:
    y_train.append(list(i))


for i in work_test[[i for i in list(work_test.columns.values) if i.startswith('Change')]].values:
    X_test.append(','.join(i.T.tolist()))

X_test = np.array(X_test)

for i in work_test[[i for i in list(work_test.columns.values) if i.startswith('Corax')]].values:
    y_test.append(list(i))


lb = preprocessing.MultiLabelBinarizer()

Y = lb.fit_transform(y_train)

然后我将它发送到前面提到的管道

【问题讨论】:

  • 在我的盒子上运行良好(scikit-learn 当前大师)。你确定你没有导入旧版本? python -c 'import sklearn; print(sklearn.__version__).
  • 它说:0.15.2。问题是否可能是由于使用此处的二进制文件(在 sklearn 网站上建议,但它们仍然是非官方的):lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn。可能它们没有正确构建。我应该从 sklearn 的 github 页面中提取所有内容并替换所有本地文件吗?
  • 更新 - 我尝试使用 pip 刷新 scikit-learn,但它显示:D:\Apps\Python\Scripts>pip install -U scikit-learn 要求已经是最新的:scikit -learn in d:\apps\python\lib\site-packages 清理...
  • 更有趣的是——我已经完全从我的 PC 中杀死了 python 以及所有的包文件。比我安装 python 3.4,重新下载所有先决条件并使用 pip 安装 sklearn。即使在那之后我仍然得到这个错误。有什么想法吗?
  • 我试图挖掘代码,因为我看到它首先尝试调用 decision_function(self, X),如果它导致 NotImplementerError,它会尝试 predict_proba。于是我去SVM中寻找base.py寻找decision_function。我看到它有这个: if self._sparse: raise NotImplementedError("Decision_function not supported for" " sparse SVM.")。所以也许这就是问题所在?我不确定,但也许我使用的工作流程会导致稀疏矩阵。

标签: python-2.7 scikit-learn classification document-classification


【解决方案1】:

好的,我对代码进行了一些调查。 OneVsRestClassifier 尝试首先调用 decision_function,如果失败 - 它会调用基分类器的 predict_proba 函数(在我们的例子中为 svm.svc)。

据我所知,我的 X_test 是字符串列表的 numpy.array。在经过管道 CountVectorizer -> TfidfTransformer 中指定的一系列转换之后,它变成了一个稀疏矩阵(通过这些东西的设计)。正如我所见,目前 decision_function 不适用于稀疏矩阵,甚至在 github 上有一个公开建议:https://github.com/scikit-learn/scikit-learn/issues/73

因此,总而言之,除非您指定probability=True,否则您似乎无法使用svm.svc 进行多标签分类。如果您这样做,您会为分类器.fit 过程引入一些开销,但它会起作用。

【讨论】:

  • 我现在无法检查,但我会检查它,并在此处发布更新:)
  • 好的,它可以工作(虽然引入了一些显着的开销)。更新了答案。
  • 嗯,我只是注意到它的效果很糟糕。当我将不同的示例发送到经过训练的分类器时,它会为每个示例做出相同的预测。
  • 顺便说一句,我用不同的内核(线性、rbf 等)对其进行了检查-它们中的每一个具有概率=True 开始为我在预测操作期间提供给它们的每个示例输出相同的预测。看起来它只是输出概率最高的标签。
  • 如果没有看到您的数据和设置,我无法对此发表评论。 SVM 分类器需要大量调整才能正常工作,因此这可能是代码中的缺陷,也可能是库中的缺陷。
猜你喜欢
  • 2023-03-22
  • 2022-11-11
  • 2017-04-30
  • 1970-01-01
  • 2013-06-05
  • 2020-05-09
  • 2020-11-01
  • 2023-01-01
  • 2017-03-14
相关资源
最近更新 更多