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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:05:39