【问题标题】:AttributeError:'LinearSVC' object has no attribute 'predict_proba'AttributeError:“LinearSVC”对象没有属性“predict_proba”
【发布时间】:2018-04-28 23:23:31
【问题描述】:

我正在尝试使用 LinearSVC 分类器

更新:添加导入

import nltk
from nltk.tokenize import word_tokenize
from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.svm import LinearSVC, SVC

LinearSVC_classifier = SklearnClassifier(LinearSVC())
LinearSVC_classifier.train(featuresets)

但是当我试图用概率对其进行分类时

LinearSVC_classifier.prob_classify(feats)

发生属性错误:

AttributeError:'LinearSVC' object has no attribute 'predict_proba'

我查看了 sklearn 文档,它告诉我们这个函数存在。

如何解决?

【问题讨论】:

  • 您使用 LinearSVC 作为 SklearnClassifier 的基础,它确实没有 predict_proba()。请查看documentation here
  • @VivekKumar 你是对的。但不幸的是,NLTK sklearn 分类器包装器的文档以 LinearSVM() 为例,其中定义了 'predict_proba' 方法。
  • 您能否添加您已导入内容的完整代码以及SklearnClassifier 是如何产生的?这将有助于调试 NLTK 中的问题。

标签: python scikit-learn nltk


【解决方案1】:

根据 sklearn documentation ,方法 'predict_proba' 没有为 'LinearSVC' 定义

解决方法

LinearSVC_classifier = SklearnClassifier(SVC(kernel='linear',probability=True))

将 SVC 与 线性内核 结合使用,并将 probability 参数设置为 True。 正如here 中所述。

【讨论】:

  • @AleksandrBaranov Scores and probabilities 提到“对于大型数据集,Platt 缩放中涉及的交叉验证是一项昂贵的操作。”
  • 我无法在 LInearSVC_classifier 上应用 fit。
【解决方案2】:

您可以使用_predict_proba_lr() 代替predict_proba。像这样的:

from sklearn import svm
clf=svm.LinearSVC()

clf.fit(X_train,Y_train)

res= clf._predict_proba_lr(X_test,Y_test)

res 将是每个类别针对样本的概率的二维数组。

【讨论】:

    【解决方案3】:

    鉴于您的问题,没有提及诸如 NLTK 之类的外部包装器(标签除外),因此很难掌握您真正需要的东西!

    Vivek Kumar 的评论适用。 LinearSVC 不支持概率,而 SVC 支持。

    现在补充几点:

    • SVM 理论与概率无关,对此的支持来自使用交叉验证和附加分类器的额外方法
    • LinearSVC 的核心求解器liblinear 没有内置支持
    • 上述mdilip 的方法是一种有效的解决方法,但是:
      • SVC 基于libsvm,因此速度较慢(可能还没有准备好进行大规模)
    • 替代方案:构建您自己的管道,其中包括:

    之前好像有人观察过这个problem

    【讨论】:

      【解决方案4】:

      如果训练模型和预测模型之间的 scikit-learn 模块版本不匹配,就会发生这种情况。

      【讨论】:

      • 这行得通!我的训练模型使用的是 0.23.1 的 scikit learn 版本,而预测模型使用的是 0.23.1,我制作了这两个 0.22.1,并且可以正常工作。
      【解决方案5】:

      具有带有 CalibratedClassifierCV 的 LinearSVC 的虚拟解决方案。根据我的经验,降低分类质量。

      >>> from sklearn.calibration import CalibratedClassifierCV
      >>> from sklearn.svm import LinearSVC
      >>> from sklearn.pipeline import make_pipeline
      >>> from sklearn.preprocessing import StandardScaler
      >>> from sklearn.datasets import make_classification
      
      >>> X, y = make_classification(n_features=4, random_state=0)
      >>> clf = make_pipeline(CalibratedClassifierCV(LinearSVC()))
      >>> clf.fit(X, y)
      >>> clf.predict_proba(make_classification(n_features=4, random_state=1,n_samples=10,)[0])
      array([[0.71360647, 0.28639353],
             [0.26277422, 0.73722578],
             [0.79450968, 0.20549032],
             [0.79352606, 0.20647394],
             [0.2486062 , 0.7513938 ],
             [0.85705016, 0.14294984],
             [0.90102124, 0.09897876],
             [0.58071282, 0.41928718],
             [0.31289046, 0.68710954],
             [0.14466406, 0.85533594]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-18
        • 2021-10-28
        • 2012-12-01
        • 2021-04-19
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        相关资源
        最近更新 更多