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 给出)
我正在使用 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 给出)