You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SMOTE、ADASYN与BorderlineSMOTE采样结果一致问题排查求助

问题分析与解决方案

核心问题:变量引用错误

你代码里犯了一个低级错误:不管是BorderlineSMOTE还是ADASYN,你都调用了smote.fit_resample(),但完全没用到自己创建的borderline_smote和adasyn实例——这就导致三种方法实际用的是同一个过采样器(大概率是你之前定义的SMOTE实例),结果自然完全一致。

另外,你所有模型都用了同一个ovr_clf变量,后面的模型会直接覆盖前面的,最后输出的只是最后一次训练的结果,根本没法对比三种方法的差异。

修正后的可运行代码

补全SMOTE的处理逻辑,同时确保每个过采样器用自己的实例,每个模型独立训练:

from imblearn.over_sampling import SMOTE, BorderlineSMOTE, ADASYN
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report

# 假设X_train, y_train, X_test, y_test已完成划分与预处理

# 1. SMOTE过采样+模型训练
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)
ovr_clf_smote = OneVsRestClassifier(SVC(kernel='linear', random_state=42))
ovr_clf_smote.fit(X_train_smote, y_train_smote)
y_pred_smote = ovr_clf_smote.predict(X_test)
print("=== SMOTE 结果 ===")
print(f'Accuracy Score: {accuracy_score(y_pred_smote, y_test)*100:.2f}%')
print(classification_report(y_test, y_pred_smote))

# 2. BorderlineSMOTE过采样+模型训练
borderline_smote = BorderlineSMOTE(random_state=42)
X_train_border, y_train_border = borderline_smote.fit_resample(X_train, y_train)
ovr_clf_border = OneVsRestClassifier(SVC(kernel='linear', random_state=42))
ovr_clf_border.fit(X_train_border, y_train_border)
y_pred_border = ovr_clf_border.predict(X_test)
print("\n=== BorderlineSMOTE 结果 ===")
print(f'Accuracy Score: {accuracy_score(y_pred_border, y_test)*100:.2f}%')
print(classification_report(y_test, y_pred_border))

# 3. ADASYN过采样+模型训练
adasyn = ADASYN(random_state=42)
X_train_adasyn, y_train_adasyn = adasyn.fit_resample(X_train, y_train)
ovr_clf_adasyn = OneVsRestClassifier(SVC(kernel='linear', random_state=42))
ovr_clf_adasyn.fit(X_train_adasyn, y_train_adasyn)
y_pred_adasyn = ovr_clf_adasyn.predict(X_test)
print("\n=== ADASYN 结果 ===")
print(f'Accuracy Score: {accuracy_score(y_pred_adasyn, y_test)*100:.2f}%')
print(classification_report(y_test, y_pred_adasyn))

其他优化点

  • 参数调优:三种方法的默认参数有差异,比如BorderlineSMOTE的kind参数(可选'borderline-1'/'borderline-2')、ADASYN的n_neighbors,调整这些参数会让合成样本的分布更有区分度。
  • 类别分布验证:先打印y_train.value_counts()确认训练集的不平衡程度,确保过采样确实有必要执行。
  • 避免数据泄露:过采样必须只在训练集上执行,不能把测试集包含进去,这点你当前的代码是对的,继续保持。

内容的提问来源于stack exchange,提问作者Nini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:10:33