如何在自定义sklearn Estimator上使用GridSearchCV?得分NaN问题
问题原因及解决方法
核心问题:自定义Estimator的score方法逻辑错误
你的score方法存在两个致命问题,直接导致GridSearchCV返回NaN得分:
- 引用外部全局变量
train_new_y:交叉验证时每个fold传入的y是数据集拆分后的子集,其索引和全局的train_new_y无法保证完全匹配,会导致y_true = train_new_y[y.index]取值失败(比如索引不存在),最终计算准确率时返回NaN。 - 未用模型预测结果计算得分:当前代码返回
accuracy_score(y_true, y_true),完全跳过模型预测步骤,逻辑无效,还因索引问题触发NaN。
修正后的score方法
正确的score方法应调用模型的predict方法生成预测结果,再和传入的真实标签y计算准确率:
def score(self, X, y): y_pred = self.predict(X) return accuracy_score(y, y_pred)
额外注意事项
- 确保
predict方法返回的类别标签和真实标签y取值范围一致,比如你当前classes = [2, 0, 0],若真实标签包含1类,会导致预测结果与真实标签不匹配,影响得分。 - 检查
PCA的n_components参数:GridSearchCV中你传入了n_components=50.0(浮点数),若代表维度数,建议保持参数为整数类型,避免潜在问题。
内容的提问来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

