使用MACAW生成分子嵌入后SMOTE无性能提升的问题排查求助
问题说明
- 使用**MACAW(Molecular Autoencoding AutoWorkAround)**生成药物数据集的分子嵌入,将其转换为包含类别标签的pandas DataFrame并保存为.csv文件
- 在MLP、Logistic Regression分类器上应用SMOTE算法后,precision、recall、F1 score等分类指标完全无变化,未获得性能提升,怀疑分子嵌入过程存在问题
- 已提供所用代码、数据集及参考论文,请求排查代码错误并修正
核心排查方向
1. 分子嵌入生成验证
- 检查MACAW的输入数据:确认原始分子结构(如SMILES)格式符合工具要求,无缺失、错误的分子结构数据
- 验证嵌入向量有效性:
- 检查所有嵌入向量维度是否一致:执行
df['embedding'].apply(len).unique(),确保输出只有一个数值 - 查看嵌入数值分布:通过
df['embedding'].explode().describe()检查是否存在全零向量、异常值,数值范围是否符合MACAW的输出规范 - 核对标签对应关系:随机抽取10-20个样本,确认原始分子的类别标签与.csv文件中嵌入对应的标签完全匹配
- 检查所有嵌入向量维度是否一致:执行
- 检查嵌入存储格式:若嵌入以字符串形式存储(如"[0.1,0.2,...]"),需确保后续转换为数值矩阵时无解析错误
2. SMOTE应用逻辑验证
- 确认SMOTE仅作用于训练集:必须先拆分训练/测试集,再对训练集特征和标签执行过采样,禁止在测试集上应用SMOTE
- 验证过采样效果:用
Counter(y_train_after_smote)查看各类别样本数量,确认SMOTE确实实现了类别平衡 - 检查特征缩放:嵌入向量未做标准化/归一化时,SMOTE生成的合成样本可能分布异常,需在SMOTE前或后对特征做统一缩放(如用
StandardScaler)
3. 模型评估逻辑验证
- 确认评估基于测试集:确保precision、recall等指标是用测试集数据计算的,而非训练集
- 采用分层交叉验证:单次数据集拆分可能存在偶然性,用
StratifiedKFold做分层交叉验证,验证指标稳定性
代码排查关键点示例
以下是嵌入加载、SMOTE应用及模型评估的核心代码,需重点检查:
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from imblearn.over_sampling import SMOTE from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report from collections import Counter # 加载嵌入数据 df = pd.read_csv('embeddings_with_labels.csv') # 关键:确保嵌入正确转换为数值矩阵 try: X = np.vstack(df['embedding'].apply(lambda x: np.fromstring(x.strip('[]'), sep=','))) except Exception as e: print("嵌入转换错误:", e) y = df['label'].values # 分层拆分数据集(必须先拆分再SMOTE) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, stratify=y, random_state=42 ) # 应用SMOTE smote = SMOTE(random_state=42) X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train) # 验证SMOTE效果 print("SMOTE前类别分布:", Counter(y_train)) print("SMOTE后类别分布:", Counter(y_train_smote)) # 需确认此处输出显示类别平衡 # 特征缩放(关键步骤) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train_smote) X_test_scaled = scaler.transform(X_test) # 测试集仅用训练集的缩放参数 # 模型训练与评估 model = LogisticRegression(max_iter=1000) model.fit(X_train_scaled, y_train_smote) y_pred = model.predict(X_test_scaled) print(classification_report(y_test, y_pred))
- 嵌入转换部分:若嵌入存储格式特殊,需调整解析逻辑,避免生成无效特征矩阵
- SMOTE应用时机:必须在数据集拆分后执行,确保测试集分布不受影响
- 特征缩放:不可省略,否则SMOTE合成样本的分布可能与原始样本差异过大,模型无法学习有效模式
内容的提问来源于stack exchange,提问作者Souvik Panda
相关产品推荐
相关产品推荐

