python - 如何对没有predict_proba或decision_function的模型使用CalibrateClassifierCV

标签 python scikit-learn

我正在尝试使用 CaliberatedClassifierCV() 校准我的模型输出,以创建更好的拟合校准曲线。据我了解,对于基于树的模型、神经网络,必须使用这种方法来校准输出以获得最佳性能。但是,当我尝试这样做时,它会引发错误。

from sklearn.calibration import CalibratedClassifierCV
from sklearn.model_selection import RandomizedSearchCV

pipe_dtr = Pipeline(steps=[('preprocessor', preprocessor),
                           ('clf', DecisionTreeRegressor(random_state=62))])
params_dtr = {
    'clf__max_depth' : np.arange(1,100,5),
    'clf__min_samples_leaf' : [0.01, 0.1, 1]
}
gs_dtr = RandomizedSearchCV(estimator=pipe_dtr, 
                    param_distributions=params_dtr,
                    n_iter=25,
                    scoring='roc_auc',
                    cv=5)

gs_dtr.fit(X_train, y_train)

calib_pipe_dtr = Pipeline(steps=[('preprocessor', preprocessor), 
                                ('calibrator', CalibratedClassifierCV(gs_dtr.best_estimator_, cv='prefit'))])
calib_pipe_dtr.fit(X_train,y_train)

这会引发以下错误

RuntimeError: classifier has no decision_function or predict_proba method.

我该如何解决这个问题..请发表意见。谢谢

最佳答案

回归模型应该用于CalibrateClassifierCV。如果您正在解决分类问题,请使用 DecisionTreeClassifier。

工作示例:

from sklearn.datasets import load_iris
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.calibration import CalibratedClassifierCV
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split

X, y= load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2, stratify=y)
pipe_dtr = Pipeline(steps=[('preprocessor', StandardScaler()),
                           ('clf', DecisionTreeClassifier(random_state=62))])
params_dtr = {
    'clf__max_depth' : np.arange(1,100,5),
    'clf__min_samples_leaf' : [0.01, 0.1, 1]
}
gs_dtr = RandomizedSearchCV(estimator=pipe_dtr, 
                    param_distributions=params_dtr,
                    n_iter=25,
                    scoring='accuracy',
                    cv=5)

gs_dtr.fit(X_train, y_train)

calib_pipe_dtr = Pipeline(steps=[('preprocessor', StandardScaler()), 
                                ('calibrator', CalibratedClassifierCV(gs_dtr.best_estimator_, cv='prefit'))])
calib_pipe_dtr.fit(X_train, y_train)

关于python - 如何对没有predict_proba或decision_function的模型使用CalibrateClassifierCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57550600/

相关文章:

python-3.x - h2o 与 scikit 学习混淆矩阵

python - 差距统计法

python - sklearn.exceptions.NotFittedError : Estimator not fitted, 在利用模型之前调用 `fit`

python - 为什么 python 在这里复制列表?

python - 欧拉问题21,为什么我的解中有多余的数字?

python - 使用 PolynomialFeatures 和 LinearRegression 拟合更高阶函数

python - scikit-learn 只允许使用线性 svms 访问 clf.coef_ 是有原因的吗?

python - 从文本文件中删除多余的空间

python - python 在 gdb 调试器中做了什么?

python - NetworkX vs Scipy 所有最短路径算法