逻辑回归ROC-AUC计算报错:dtype='numeric'与字节/字符串数组不兼容
解决roc_auc_score的ValueError问题
错误原因
这个报错的核心是真实标签(y_test)或模型预测结果的类型不是数值型,而是字符串/字节类型,导致roc_auc_score无法处理。即使你对output_test做了dtype=float转换,如果原始y_test是字符串(比如"0"、"1"这类文本标签),直接转float会存在隐藏类型问题;另外如果训练时y_train是字符串,模型预测的结果也会是字符串类型,同样会触发错误。
修复步骤
转换训练标签为数值型
训练模型前,先把y_train转换成数值类型,确保模型学习的是数值标签:# 将y_train从字符串转为数值(假设标签是二分类的"0"/"1"或类似文本) y_train = np.array(y_train, dtype=np.float64) y = y_train.reshape(-1, 1) model_lr = LogisticRegression() res = model_lr.fit(X, y)正确转换测试标签为数值型
不要只做reshape,先处理原始y_test的类型:# 先转换y_test为数值型,再reshape output_test = np.array(y_test, dtype=np.float64).reshape(-1, 1)验证预测结果的类型
可以打印model_lr.predict(test)的类型和值,确认是数值型:pred = model_lr.predict(test) print(pred.dtype) # 应输出float64或int64 print(pred) # 应是0/1这类数值,而非字符串
优化后的完整代码示例
import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score, roc_curve # 处理训练数据 X = X_train.reshape(-1, 2) # 用-1自动计算行数更合理 y_train = np.array(y_train, dtype=np.float64) y = y_train.reshape(-1, 1) # 训练模型 model_lr = LogisticRegression() model_lr.fit(X, y) # 处理测试数据 X_test = np.array(X_test, dtype=np.float64).reshape(-1, 2) output_test = np.array(y_test, dtype=np.float64).reshape(-1, 1) # 计算ROC AUC logit_roc_auc = roc_auc_score(output_test, model_lr.predict(X_test)) print(f"ROC AUC Score: {logit_roc_auc}")
额外注意点
- 如果你的标签是其他文本(比如"positive"/"negative"),需要先做映射转换:
label_mapping = {"positive": 1.0, "negative": 0.0} y_train = np.array([label_mapping[label] for label in y_train], dtype=np.float64) y_test = np.array([label_mapping[label] for label in y_test], dtype=np.float64) - 避免重复的数组转换操作,比如你之前重复对
test做np.array(test,dtype=float),这完全没必要。
内容的提问来源于stack exchange,提问作者Erta Beqiri
相关产品推荐
相关产品推荐

