【问题标题】:AttributeError: 'CalibratedClassifierCV' object has no attribute 'coef_'AttributeError:“CalibratedClassifierCV”对象没有属性“coef_”
【发布时间】:2020-03-30 07:56:26
【问题描述】:

我正在使用sklearn SVM 分类器LinearSVM 的线性实现。

我没有直接使用它,而是用CalibratedClassifierCV 包装它以获得预测时间的概率,例如:

model = CalibratedClassifierCV(LinearSVC(random_state=0))

在拟合模型后,我尝试让coef_ 打印顶部特征,遵循这篇帖子Visualising Top Features in Linear SVM with Scikit Learn and Matplotlib,但是我收到了这个错误:

coef = classifier.coef_.ravel()
AttributeError: 'CalibratedClassifierCV' object has no attribute 'coef_'

如果我用校准器包装分类器,我如何获得coef?,我对这种方式并不完全感兴趣,因此如果有另一种方法来获得特征重要性,它将受到欢迎。

【问题讨论】:

  • 赋值给变量svm = LinearSVC(random_state=0),然后在CalibratedClassifierCV(svm)svm.coef_.ravel()中使用
  • 我对校准模型的性能感兴趣!,我想如果我将它们分开并参考LinearSVM,它不会是一样的,不是吗?
  • 可能不一样但是CalibratedClassifierCV没有这个方法所以你不能从CalibratedClassifierCV得到它
  • 还有其他方法可以实现吗?功能的重要性?

标签: python scikit-learn feature-selection


【解决方案1】:

coef_ 不是CalibratedClassifierCV 的属性,但是,它是base_estimator 的属性,在您的情况下是LinearSVC。您可以通过calibrated_classifiers_ 访问您的基本估算器,它是拟合模型的列表(取决于您根据cv 值拟合的模型数量)。我已经展示了一个示例代码,您可以根据需要参考。

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
model = CalibratedClassifierCV(LinearSVC(random_state=0))
model.fit(iris.data, iris.target)
model.calibrated_classifiers_

[<sklearn.calibration._CalibratedClassifier at 0x7f15d0c57550>,
 <sklearn.calibration._CalibratedClassifier at 0x7f15d0c57c18>,
 <sklearn.calibration._CalibratedClassifier at 0x7f15d0aec080>]

在这种情况下,我的cv 是三个,所以我构建了三个模型,所以我会简单地遍历它们并取平均值。

coef_avg = 0
for i in model.calibrated_classifiers_:
    coef_avg = coef_avg + i.base_estimator.coef_
coef_avg  = coef_avg/len(model.calibrated_classifiers_)

array([[ 0.16464871,  0.45680981, -0.77801375, -0.4170196 ],
   [ 0.1238834 , -0.89117967,  0.35451826, -0.89231957],
   [-0.83826029, -0.9237139 ,  1.30772955,  1.67592916]])

希望这会有所帮助!

【讨论】:

  • Gr8 的想法!谢谢
【解决方案2】:

注意: 从 sklearn 版本 0.24 开始,CalibratedClassifierCV 构造函数公开了一个 ensemble 参数,如果设置为 False(假设 cv 未设置为 "prefit") , 使CalibratedClassifierCV 仅公开一个使用所有训练数据训练的校准分类器。这意味着我们不再需要在预测时循环遍历所有 calibrated_classifiers_

model = CalibratedClassifierCV(LinearSVC(random_state=0), ensemble=False)
model.fit(iris.data, iris.target)
model.calibrated_classifiers_

# Returns a list with one element, [<sklearn.calibration._CalibratedClassifier at 0x7f15d0c57550>]

(使用上面的例子,由 Parthasarathy 给出)

【讨论】:

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