使用imblearn的classification_report_imbalanced遇样本量不一致错误
问题分析
报错Found input variables with inconsistent numbers of samples: [200, 807]的核心是传入classification_report_imbalanced的真实标签和预测标签样本数量不匹配:200是测试集样本数(对应test_size=0.2的分割结果),807应该是训练集或全量数据集的样本数,说明你调用函数时传错了参数。
解决方案
1. 明确classification_report_imbalanced的调用规则
该函数必须按「真实标签在前,预测标签在后」的顺序传参,且两者必须是长度完全一致的一维数组:
classification_report_imbalanced(y_true, y_pred)
2. 修改评估函数,正确集成指标
更新你的evaluate_model函数,加入该指标的正确调用,还可以加个断言提前排查问题:
def evaluate_model(model, X_test, y_test): y_pred = model.predict(X_test) # 提前验证样本数是否匹配,避免后续报错 assert len(y_test) == len(y_pred), "真实标签和预测标签样本数对不上" accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) # 正确调用imblearn的不平衡分类报告函数 imbalanced_report = classification_report_imbalanced(y_test, y_pred) return accuracy, precision, recall, f1, imbalanced_report
3. 调整结果收集逻辑
遍历模型时接收新增的分类报告,按需打印或保存:
results = [] for name, model in models: model.fit(X_train, y_train) accuracy, precision, recall, f1, imbalanced_report = evaluate_model(model, X_test, y_test) results.append([name, accuracy, precision, recall, f1]) # 打印当前模型的不平衡分类报告 print(f"=== {name} 不平衡分类报告 ===") print(imbalanced_report)
4. 验证真实数据集的加载与分割
如果你用的是心脏病数据集,要确保数据处理没有问题:
import pandas as pd # 加载数据集(确认文件路径正确) df = pd.read_csv("heart_disease_dataset.csv") # 分离特征和标签(替换成你实际的标签列名) X = df.drop("target", axis=1) y = df["target"] # 分割后验证样本数一致 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) assert len(X_test) == len(y_test), "测试集特征和标签样本数不匹配"
常见踩坑点
- 别把二维的
X_test(特征数组)当成标签传入函数 - 别搞混
y_train和y_test,必须用测试集的真实标签+对应预测结果做评估 - 模型预测时一定要传
X_test,而非X_train
内容的提问来源于stack exchange,提问作者yuyudss
相关产品推荐
相关产品推荐

