如何为Keras Sequential模型搭配Sklearn permutation_importance自定义roc_auc评分
问题解决方法
报错原因
- 你的Keras MLP当前配置不符合二分类任务要求:输出层设置了4个神经元且无激活函数,输出的是维度为
(样本数,4)的连续logits,和二分类0/1标签的维度、类型均不匹配 - Sklearn默认的
roc_auc评分器直接调用模型predict方法的输出做计算,无法识别连续多维度输出与二进制标签的对应关系,因此触发类型不匹配报错
修复步骤
第一步:修正模型输出层配置
二分类任务需要将输出层调整为1个神经元,搭配sigmoid激活函数,输出每个样本属于正类的概率:
model = keras.Sequential( [ layers.Dense(2, activation="relu", name="layer1"), layers.Dense(3, activation="relu", name="layer2"), layers.Dense(1, activation="sigmoid", name="layer3"), # 仅修改该行即可 ] )
第二步:自定义ROC-AUC评分函数
Sklearn的scoring参数支持传入自定义可调用对象,我们在函数内部自行处理预测逻辑,避免类型不匹配问题:
from sklearn.metrics import roc_auc_score def custom_roc_auc(estimator, X, y_true): # 关闭预测日志避免冗余输出,获取预测概率 y_pred = estimator.predict(X, verbose=0) # 去掉输出多余的维度,转为(N,)的一维数组 y_pred = y_pred.squeeze() # 如果需要用阈值转二分类结果可以启用下一行,roc_auc直接用概率计算精度更高 # y_pred = (y_pred > 0.5).astype("int32") return roc_auc_score(y_true, y_pred)
第三步:替换permutation_importance的scoring参数
将自定义函数传入scoring参数即可正常运行:
r = permutation_importance(model, attributes_x_test, attributes_y_test, n_repeats=30, random_state=0, scoring=custom_roc_auc )
内容的提问来源于stack exchange,提问作者MikeMike
相关产品推荐
相关产品推荐

