如何检查 CalibratedClassifierCV BaseEstimator 参数
How to inspect CalibratedClassifierCV BaseEstimator parameters
我的任务是检查和比较其他人开发的两个已经训练好的 ML 模型。模型的不同之处在于输入数据集不同。第一个是用 2018 年的数据训练的,第二个是用 2019 年的数据训练的。它的核心是 RandomForestClassifier
模型,在 sklearn.pipeline
模块中训练。问题是,中间有一个 CalibratedClassifierCV
使我对随机森林模型本身的访问变得复杂。所以我对这个模型没有很深的了解,它对我来说就像一个黑盒子。两种情况下的管道是相同的。
编辑: 在管道的创建方式中添加了一个可重现的步骤,但没有数据集:
from sklearn.ensemble import RandomForestClassifier
from sklearn.calibration import CalibratedClassifierCV, calibration_curve
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
RF_clf = RandomForestClassifier()
pipeline = Pipeline([('scaling', StandardScaler(with_mean=False)),
('classifier', CalibratedClassifierCV(base_estimator=RF_clf, cv=2, method='sigmoid'))])
# Further steps not replicated from code because of additional custom made training and fitting functions but these are the steps:
# fit model on train data
# predict model on test data
下一步我想做的或看到的是,从我从磁盘读取为 model.pkl
文件的已经训练好的模型,是模型的 .feature_importance_
,因为随机森林本机支持它。然后我会比较各年最重要特征的分布。但是无法访问。
以下是我可以进行模型检查的程度:
这些有效:
pipeline.named_steps
pipeline.named_steps['classifier']
CalibratedClassifierCV(base_estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=None, max_features=1, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,
oob_score=False, random_state=0, verbose=1, warm_start=False),
cv=2, method='sigmoid')
但是我不能再深入了。
这个已经不行了:
pipeline.named_steps['classifier']['base_estimator']
TypeError: 'CalibratedClassifierCV' object is not subscriptable
我也尝试了 eli5
库来查看一些信息,但似乎 CalibratedClassifierCV
不受支持:
eli5.explain_weights(pipeline_rf.named_steps['classifier'])
Error: estimator CalibratedClassifierCV(base_estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features=1, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1, oob_score=False, random_state=0, verbose=1, warm_start=False), cv=2, method='sigmoid') is not supported
您是否有一些经验可以深入 CalibratedClassifierCV
并真正了解 BaseEstimator
模型的特征重要性?感谢您的任何提示。
访问底层 RandomForestClassifier
的 feature_importances_
.
的简短示例
from sklearn.calibration import CalibratedClassifierCV
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn import set_config
set_config(print_changed_only=True)
X, y = make_classification()
rf = RandomForestClassifier().fit(X, y)
pipe = Pipeline([('classifier',
CalibratedClassifierCV(rf))]).fit(X, y)
pipe['classifier'].base_estimator.feature_importances_
如果您正在寻找 CalibratedClassifierCV
s 输出的比较,那么您需要查看 calibrated_classifiers_
属性。
更新:
对于 sigmoid 方法(默认方法),在拟合过程中学习了两个参数 (a, b)。我们可以通过以下代码片段提取这两个信息。
for calibrated_classifier in pipe['classifier'].calibrated_classifiers_ :
calibrator = calibrated_classifier.calibrators_[0]
print(calibrator.a_)
print(calibrator.b_)
我的任务是检查和比较其他人开发的两个已经训练好的 ML 模型。模型的不同之处在于输入数据集不同。第一个是用 2018 年的数据训练的,第二个是用 2019 年的数据训练的。它的核心是 RandomForestClassifier
模型,在 sklearn.pipeline
模块中训练。问题是,中间有一个 CalibratedClassifierCV
使我对随机森林模型本身的访问变得复杂。所以我对这个模型没有很深的了解,它对我来说就像一个黑盒子。两种情况下的管道是相同的。
编辑: 在管道的创建方式中添加了一个可重现的步骤,但没有数据集:
from sklearn.ensemble import RandomForestClassifier
from sklearn.calibration import CalibratedClassifierCV, calibration_curve
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
RF_clf = RandomForestClassifier()
pipeline = Pipeline([('scaling', StandardScaler(with_mean=False)),
('classifier', CalibratedClassifierCV(base_estimator=RF_clf, cv=2, method='sigmoid'))])
# Further steps not replicated from code because of additional custom made training and fitting functions but these are the steps:
# fit model on train data
# predict model on test data
下一步我想做的或看到的是,从我从磁盘读取为 model.pkl
文件的已经训练好的模型,是模型的 .feature_importance_
,因为随机森林本机支持它。然后我会比较各年最重要特征的分布。但是无法访问。
以下是我可以进行模型检查的程度:
这些有效:
pipeline.named_steps
pipeline.named_steps['classifier']
CalibratedClassifierCV(base_estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=None, max_features=1, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,
oob_score=False, random_state=0, verbose=1, warm_start=False),
cv=2, method='sigmoid')
但是我不能再深入了。
这个已经不行了:
pipeline.named_steps['classifier']['base_estimator']
TypeError: 'CalibratedClassifierCV' object is not subscriptable
我也尝试了 eli5
库来查看一些信息,但似乎 CalibratedClassifierCV
不受支持:
eli5.explain_weights(pipeline_rf.named_steps['classifier'])
Error: estimator CalibratedClassifierCV(base_estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features=1, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1, oob_score=False, random_state=0, verbose=1, warm_start=False), cv=2, method='sigmoid') is not supported
您是否有一些经验可以深入 CalibratedClassifierCV
并真正了解 BaseEstimator
模型的特征重要性?感谢您的任何提示。
访问底层 RandomForestClassifier
的 feature_importances_
.
from sklearn.calibration import CalibratedClassifierCV
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn import set_config
set_config(print_changed_only=True)
X, y = make_classification()
rf = RandomForestClassifier().fit(X, y)
pipe = Pipeline([('classifier',
CalibratedClassifierCV(rf))]).fit(X, y)
pipe['classifier'].base_estimator.feature_importances_
如果您正在寻找 CalibratedClassifierCV
s 输出的比较,那么您需要查看 calibrated_classifiers_
属性。
更新:
对于 sigmoid 方法(默认方法),在拟合过程中学习了两个参数 (a, b)。我们可以通过以下代码片段提取这两个信息。
for calibrated_classifier in pipe['classifier'].calibrated_classifiers_ :
calibrator = calibrated_classifier.calibrators_[0]
print(calibrator.a_)
print(calibrator.b_)