Scikit learn 当对具有多类输出的NN使用GridSearchCV自定义评分时,KerasClassifier问题

Scikit learn 当对具有多类输出的NN使用GridSearchCV自定义评分时,KerasClassifier问题,scikit-learn,keras,cross-validation,grid-search,scoring,Scikit Learn,Keras,Cross Validation,Grid Search,Scoring,对Keras模型的多类输出使用自定义评分会返回与cross_val_评分或GridSearchCV相同的错误,如下所示(它位于Iris上,因此您可以直接运行它进行测试): 将numpy导入为np 从sklearn导入数据集 从sklearn.model_selection导入训练测试分割、交叉值得分、GridSearchCV 从keras.models导入顺序 从keras.layers导入稠密 从keras.utils导入到_category 从keras.wrappers.scikit_学习

对Keras模型的多类输出使用自定义评分会返回与cross_val_评分或GridSearchCV相同的错误,如下所示(它位于Iris上,因此您可以直接运行它进行测试):

将numpy导入为np
从sklearn导入数据集
从sklearn.model_selection导入训练测试分割、交叉值得分、GridSearchCV
从keras.models导入顺序
从keras.layers导入稠密
从keras.utils导入到_category
从keras.wrappers.scikit_学习导入KerasClassifier
iris=数据集。加载\u iris()
X=iris.data
Y=到_分类(iris.target)
X_序列,X_测试,Y_序列,Y_测试=序列测试分割(X,Y,序列大小=0.8,随机状态=1000)
def create_模型(优化器='rmsprop'):
模型=顺序()
添加(密集(8,激活=relu',输入形状=(4,))
model.add(密集型(3,activation='softmax'))
compile(优化器=优化器,
损失class='classifical_crossentropy',
指标=[‘准确度’])
回归模型
模型=KerasClassifier(构建=创建模型,
纪元=10,
批次尺寸=5,
详细信息=0)
#结果=交叉评分(模型,X系列,Y系列,评分='precision\u macro')
param_grid={'optimizer':('rmsprop','adam')}
网格=网格搜索CV(模型,
参数网格=参数网格,
return\u train\u score=真,
得分=[“准确度”、“精度宏”、“回忆宏”],
重新安装(='precision_macro')
网格结果=网格拟合(X\u序列,Y\u序列)
所以我得到了这个错误

我绕过了整个堆栈,因为您可以通过复制上面的代码来复制它

ValueError:分类指标无法处理多标签指标和二进制目标的混合
当我删除评分参数时,它会起作用

有没有办法避免这种情况,并使f1,精度或任何自定义分数?当然,不用重写我自己的网格搜索代码

谢谢你的帮助

更新:我刚刚找到了解决方法

首先,本文档()显示了Keras中使用的一个热表示在scikit learn中被解释为多标签

然后查看实现KerasClassifier类的
scikit_learn.py

BaseWrapper类中的fit函数包括以下代码行:

if loss\u name=='categorical\u crossentropy'和len(y.shape)!=2:
y=到_分类(y)
包装器自己进行分类转换

似乎Keras为了避免这个问题,由于scikit学习的多类表示不同,可以采用scikit学习风格的多类
[0,1,2,1,0,2]
,并将其转换为分类表示,仅用于NN模型拟合

因此,在将模型传递给sklearn函数时,我只是尝试删除分类转换

它现在可以工作了

将numpy导入为np
从sklearn导入数据集
从sklearn.model_selection导入训练测试分割、交叉值得分、GridSearchCV
从keras.models导入顺序
从keras.layers导入致密、活化
从keras.utils导入到_category
从keras.wrappers.scikit_学习导入KerasClassifier
iris=数据集。加载\u iris()
X=iris.data
#Y=到_分类(iris.target,3)
Y=iris.target
X_序列,X_测试,Y_序列,Y_测试=序列测试分割(X,Y,序列大小=0.8,随机状态=1000)
def create_模型(优化器='rmsprop'):
模型=顺序()
添加(密集(8,激活=relu',输入形状=(4,))
model.add(密集型(3,activation='softmax'))
compile(优化器=优化器,
损失class='classifical_crossentropy',
指标=[‘准确度’])
回归模型
模型=KerasClassifier(构建=创建模型,
纪元=10,
批次尺寸=5,
详细信息=0)
#结果=交叉评分(模型,X系列,Y系列,评分='precision\u macro')
param_grid={'optimizer':('rmsprop','adam')}
网格=网格搜索CV(模型,
参数网格=参数网格,
return\u train\u score=真,
评分=['precision\u macro'、'recall\u macro'、'f1\u macro'],
重新安装(='precision_macro')
网格结果=网格拟合(X\u序列,Y\u序列)