使用EvalML的AutoMLSearch时出现全管道np.nan得分报错求解决
EvalML AutoMLSearch 全管道LogLossBinary得分NaN问题排查方案
检查数据集标签分布
二分类任务里,要是标签严重失衡(比如某一类占比99%以上),或者所有样本标签完全一致,LogLoss计算直接会返回NaN。用df['target'].value_counts()查看标签分布,失衡严重的话,要么补少数类样本,要么换用对失衡更鲁棒的指标(比如F1、AUC),或者初始化AutoMLSearch时设objective='F1'。验证数据集特征质量
- 查缺失值:用
df.isnull().sum()统计各特征缺失情况,缺失占比过高的直接删,或者用SimpleImputer提前填充(注意测试集填充逻辑要和训练集一致)。 - 排查异常值:数值特征里有极端值(比如无穷大、远超合理范围的数)会导致模型训练失败,进而得分NaN。用
df.describe()看数值特征分位数,对异常值做截断或删除。 - 确认特征类型:别把文本特征误标成数值型,也别让分类特征的类别数量太多(比如超过1000个唯一值),不然管道预处理会出错。用
df.dtypes检查特征类型,分类特征要做编码(低基数用OneHotEncoder,高基数用TargetEncoder)。
- 查缺失值:用
调整AutoMLSearch参数
- 关闭自动特征工程:自动生成的衍生特征可能引入无效值,初始化时设
feature_engineer=False,先验证基础管道能不能正常跑。 - 限制管道类型:只留简单模型管道(比如逻辑回归),设
allowed_model_families=['linear_model'],排查是不是复杂模型导致的计算问题。 - 调整交叉验证策略:默认CV折数或分层逻辑有问题的话,手动指定
cv=3(减少折数)或者stratify=True(分类任务强制分层抽样)。
- 关闭自动特征工程:自动生成的衍生特征可能引入无效值,初始化时设
手动调试单个管道
从EvalML可用管道里挑个最简单的(比如LogisticRegressionBinaryPipeline),手动训练计算LogLoss,定位具体出错环节:from evalml.pipelines import LogisticRegressionBinaryPipeline from evalml.objectives import LogLossBinary pipeline = LogisticRegressionBinaryPipeline({}) pipeline.fit(X_train, y_train) predictions = pipeline.predict_proba(X_val) score = LogLossBinary().score(predictions, y_val) print(score)要是这里的score也是NaN,说明问题出在模型预测或指标计算上,进一步查predictions有没有0或1的概率值(LogLoss对0/1概率取对数会出无穷大,进而变成NaN),可以给预测概率加个极小值(比如
predictions = np.clip(predictions, 1e-10, 1-1e-10))再算得分。
内容的提问来源于stack exchange,提问作者Rini
相关产品推荐
相关产品推荐

