AttributeError: 'CalibratedClassifierCV' object has no attribute 'coef_'

AttributeError: 'CalibratedClassifierCV' object has no attribute 'coef_'

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

我没有直接使用它,但我用 CalibratedClassifierCV 包裹它以获得预测时间的概率,如:

model = CalibratedClassifierCV(LinearSVC(random_state=0))

拟合模型后,我尝试让 coef_ 打印 Top 特征,然后 post Visualising Top Features in Linear SVM with Scikit Learn and Matplotlib,但是我得到了这个错误:

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

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

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]])

希望对您有所帮助!

注意: 从 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 给出)