资讯动态

分子描述符筛选与抗菌活性预测:高维小样本数据下的稳健特征选择方法

发布时间:2026/9/7 3:26:31 来源:尧图企业网站定制
简介面向数学建模参赛者与研究人员的2021年研究生数学建模D题第一题完整解答资源围绕1974个化合物的729个分子描述符利用随机森林等方法筛选出对生物活性影响最显著的前20个特征对抗乳腺癌药物研究具有参考意义。包内共14个文件包含Python源码与两个ipynb交互式分析文档、三个Excel数据文件、六个可视化图表如Pic50分布图、Pearson/Spearman相关性图、一个Top特征CSV以及项目和数据集说明文档压缩包23.32MB结构清晰便于对照复现。资源完整呈现先方差筛除、再随机森林置换重要性排序、最后相关性分析选特征的技术路线代码含详细注释适合学习变量选择与机器学习建模流程。已有262人学习下载可作为相关课题研究与论文写作的参考。1. 这道题到底在考什么从题目背景到真正的技术难点2021年研究生数学建模竞赛D题核心任务是研究药物分子的抗菌性能。题目第一问要求参赛者完成“分子描述符的筛选与分析”目标很直白从一大堆计算好的分子结构特征中找到那些真正和抗菌活性强相关的描述符然后基于筛选结果建立可靠的预测模型。为什么这道题值得认真复盘因为它不是单纯的“跑通一个模型”就完事而是把制药行业里一个很现实的问题搬到了赛场上。做药物设计的人都知道一个候选分子能不能成药抗菌效果好不好影响因素极其复杂。分子的疏水性、电荷分布、拓扑结构、官能团种类、分子量、极化率这些性质都会影响它穿透细菌细胞膜的能力、与靶点结合的能力。但问题在于这些性质能被计算成成百上千个数字指标——也就是分子描述符——而真正起决定作用的往往只有其中一小部分。我见过不少队伍在这道题上翻车翻车原因高度一致看到几万个特征就慌了要么直接用全部特征灌进模型结果过拟合得一塌糊涂要么随便用皮尔逊相关系数筛一遍剩下几十个特征还是高度共线模型解释性极差。这道题的第一问本质考察的是三件事你能不能理解高维小样本数据的特点你能不能做出合理的特征筛选兼顾统计显著性和物理解释你能不能把筛选结果落到一个评价体系里证明你的选择不是拍脑袋。从技术栈角度看这一问可以拆成四个环节数据预处理、单变量筛选、多变量筛选、交叉验证评估。下面我按我自己复现这道题的完整流程来讲中间会穿插一些当时实测踩过的坑希望能帮你省掉几天的试错时间。2. 拿到手的“原始矿”要怎么处理描述符矩阵的规范化预处理2.1 先看清数据结构再动手题目提供的数据通常是两部分一批已知抗菌活性的分子结构文件常见SDF格式或SMILES字符串以及一个已经算好的描述符矩阵。如果是后者你打开文件时会看到类似这样的结构行是样本分子列是描述符特征最后一列或单独文件给出活性值。这时第一件事不是建模而是做数据体检。我建议先跑一遍这样几行代码import pandas as pd import numpy as np df pd.read_csv(descriptors.csv) print(df.shape) # 看样本数和特征数 print(df.isnull().sum().sort_values(ascendingFalse).head(20)) # 缺失值 print(df.describe()) # 看每个特征的量纲和分布以2021年D题为例样本量只有一百多个分子而描述符数量可能达到几千甚至上万。这就是典型的“高维小样本”问题。在这种数据结构下很多在常规数据集上好用的方法会直接失效最典型的就是普通最小二乘回归——特征数大于样本数时它连唯一解都不存在。2.2 三个预处理动作去常量、去缺失、标准化预处理阶段有三个动作必须做顺序也很重要。第一步剔除常量和近常量描述符。如果一个描述符在所有样本上的值都一样或者几乎一样它携带的信息量为零后期还会干扰模型的特征重要性排序。判断标准可以设为方差阈值或者直接统计唯一值个数唯一值少于5个的基本可以放弃。第二步处理缺失值。有些描述符在特定分子上计算不出来会返回NaN。对缺失率超过30%的描述符建议直接删掉缺失率较低的可以用中位数填补。为什么用中位数而不是均值因为描述符分布通常偏态严重中位数对异常值更稳健。第三步标准化。这一步太容易被忽略但后果很严重。不同描述符的量纲差异极大有的在0到1之间有的是几百上千的数量级。如果不做标准化后面算欧氏距离、做L1/L2正则化、跑PCA都会被量纲大的特征主导。推荐用StandardScaler做Z-score标准化但要注意一点标准化必须在划分训练集和测试集之后只用训练集的均值和方差去变换测试集否则就是典型的数据泄露。我当时在这个坑上栽过一次先对全量数据做了标准化再划分训练测试集结果交叉验证分数虚高换了新数据后模型表现直接掉了一截。后来检查才发现测试集的信息在预处理阶段就“看”到了训练集的分布统计量属于典型的泄漏问题。这种错误在数学建模竞赛里尤其致命因为评委很可能用你根本没见过的新数据来验证模型的泛化能力。2.3 先做一轮粗筛把维度降下来完成上面的处理后我建议第一轮粗筛直接用“方差 相关性”组合拳把特征数量从几千降到几百为后面更精细的筛选减轻计算压力。粗筛逻辑很简单先删除方差极低的描述符然后用描述符和描述符之间计算相关系数矩阵对相关系数高于0.95的特征组只保留其中一个。保留哪一个我建议保留和活性值相关性更高的那一个。这一步看起来粗糙但效率极高可以去掉大量冗余特征。当时我处理完这一轮几千个特征降到了一千多个后面所有分析的耗时都大幅缩短。3. 特征筛选三层漏斗从单变量过滤到模型重要性验证粗筛只是热身真正的重头戏是三层筛选漏斗。这层设计我参考的是制药行业QSAR研究里常用的“由简到繁”策略先用单变量方法做快速过滤再用多变量方法做共线性控制和重要性排序最后用递归特征消除找最优子集。3.1 第一层单变量筛选看每个描述符单独和活性的关系这层的目的很单纯——把那些和活性几乎没有任何关系的描述符先筛掉。对于连续型活性值可以用皮尔逊相关系数或Spearman秩相关系数。皮尔逊适合线性关系Spearman适合单调关系而且对异常值更稳健。我当时两种都算了取两者中P值更小的那个。筛选标准可以设P值小于0.05或相关系数绝对值大于某个阈值。如果样本量不大建议用Spearman为主因为在分子描述符领域很多特征和活性之间是单调但非线性的关系皮尔逊会低估这种关联。这层筛完特征数量大概能降到两三百个。但注意单变量筛选有个天然盲区——它看不到“组合效应”。有的描述符单独和活性看起来没关系但和其他描述符组合在一起却极其重要。所以单变量筛选只能做粗过滤不能做主筛选。3.2 第二层多重共线性控制别让一堆特征重复说同一件事分子描述符之间天然存在严重的共线性。原因很简单很多描述符本身就是从同类分子性质衍生出来的比如各种疏水性指标、各种拓扑指数算来算去反映的都是同一个物理化学性质。共线性带来的直接问题有两个一是让回归系数变得极不稳定特征重要性无法解释二是导致模型过拟合泛化能力变差。处理共线性我最常用的手段是计算方差膨胀因子VIF。VIF的计算方法很简单把每个特征作为因变量对其他所有特征做线性回归得到R²VIF 1 / (1 - R²)。VIF大于10的特征通常认为存在严重共线性需要处理。实际操作上我会用迭代式剔除算一次所有特征的VIF找到VIF最大的那个特征如果超过阈值就删掉然后重新计算循环直到所有特征的VIF都低于阈值。这一层筛完特征数量通常还能再降一半左右而且留下的特征之间相对独立这对后面的模型解释很重要。3.3 第三层模型筛选让算法告诉你哪些特征真的有用经过前两层特征数量已经降到可控范围。接下来我用两类模型做交叉验证式的特征重要性评估。第一类是Lasso回归L1正则化线性回归。Lasso的数学特性决定了它会把不重要的特征系数压缩到零相当于自动做了特征选择。我会把Lasso的alpha值设成一个稍偏大的数值让模型选择相对稀疏的特征集合。不过Lasso有个局限它对高度相关的特征组倾向于只随机选一个所以要在前面共线性处理的基础上使用才可靠。第二类是树模型比如随机森林或LightGBM。树模型天然能捕捉非线性关系并且能输出特征重要性排序。我两种都试了发现LightGBM在这个数据集上表现更稳定重要特征排名也更集中。然后我用一个加权投票策略对两类模型的特征重要性打分Lasso选中的特征加一分树模型重要性排名前N的特征加一分单变量筛选中排名靠前的再加一分。按总分排序取出排名靠前的特征作为候选集合。这三层漏斗走完特征数量通常能从几千降到几十甚至十几。但这两三个特征是不是最优组合还不能确定需要进一步验证。4. 用建模结果反推筛选质量交叉验证与评价指标怎么用4.1 特征筛选的“最终裁判”是下游模型筛选出来的特征好不好不能只看特征本身要放到模型里看效果。我当时的做法是在训练集上用嵌套交叉验证评估候选特征集的分类/回归性能。为什么会需要嵌套交叉验证因为标准K折交叉验证在特征筛选过程中其实存在偏差——你用同一个数据集既做特征选择又做模型评估相当于“用考试的答案复习答案”分数会虚高。嵌套交叉验证的思路是外层循环切分训练集和验证集内层循环只基于训练集部分做特征筛选然后把筛选好的特征应用到外层验证集上。这样做完得到的性能指标才是无偏的。我当时用5折交叉验证每折内部再跑一次完整的三层筛选流程虽然慢一点但结果更有说服力。建议至少做到这个级别因为竞赛评委对“怎么证明你的筛选方法有效”这个问题非常敏感。4.2 回归模型评价别只看R²D题第一问的活性预测模型通常是一个回归任务常用评价指标有RMSE均方根误差、MAE平均绝对误差、R²决定系数。很多人在报告里只写R²这是个比较片面的做法。R²描述的是模型解释的方差比例但看不出预测误差有多大。比如R²0.8RMSE可能是10也可能是0.5完全取决数据本身的方差尺度。更合理的做法是同时报告RMSE和R²并在不同的特征数量设置下做对比列线。我记得当时做了这样一个实验特征数分别取5、10、20、50、全部特征分别跑同一模型画出测试集RMSE随特征数的变化曲线。结果是特征数从5增加到20时RMSE持续下降20到50之间趋于平稳超过50后RMSE反而上升——这就是过拟合的信号。最终我把特征数锁定在20到30之间误差最小也最稳定。4.3 特征稳定性评估换数据子集特征排名还稳定吗特征筛选中一个很容易被忽视但极其重要的问题特征选择的稳定性。用不同的训练子集去跑同一套筛选流程选出特征的重合度有多高如果换个训练子集就换一拨特征说明筛选结果完全被少数样本主导结论不可靠。评估方法很简单做Bootstrap重采样比如重采样50次每次跑同样的筛选流程记录每个特征被选中的频率。如果一个特征在80%以上的重采样中都被选中那它就是真正的强特征。这一步我在复现时被震撼到了——单变量相关性和模型重要性排名里看起来差不多的两个特征稳定性测试后差距极大。有的特征看起来排名高但只有两三个样本支撑它的相关关系换个样本子集就掉出重要名单了。最终真正留下来的都是那些在Bootstrap中稳定出现的高频特征。最终筛选出的分子描述符集合应该满足几个条件与活性有显著相关性、相互之间共线性低、在回归/分类模型中表现稳定、物理化学含义可解释。这四个条件缺一不可否则评委完全可以质疑你的特征选择是“统计巧合”。5. 五大高频踩坑现场与排查链路这道题做完之后我复盘了整个过程中的踩坑经历挑出五个最典型的问题按“现象—排查—根因—修正”的顺序说一下希望能帮你提前排雷。5.1 坑一测试集分数虚高泛化却崩盘现象训练集R²和测试集R²差距巨大训练集几乎满分测试集一塌糊涂。排查链路我先是怀疑模型过拟合试了更大强度的正则化效果不明显。后来回顾整个流程才发现问题出在数据预处理阶段——我先对全量数据做了标准化再划分训练测试集。这样测试集已经“提前看过”训练集的均值和方差信息泄漏了。修正方法把所有预处理步骤标准化、均值填充、方差过滤全部放进Pipeline里保证每个处理参数都只基于训练集拟合。严谨的流程应该是划分数据 → 只在训练集上拟合scaler → 用这个scaler变换测试集。如果你的模型动不动就是R²0.99先别高兴大概率是数据泄露而不是模型太强。5.2 坑二特征和特征之间的共线性被单变量筛选完全忽视现象特征筛选排名里靠前的很多是同一性质的变体模型系数一会正一会负换个训练集结论就反过来了。排查链路我起初怀疑是特征数量太多导致模型不稳定于是把所有特征丢进Lasso也没根治。后来算了一个相关系数矩阵发现两组特征间的相关系数高达0.98——它们不过是量纲不同的同一种物化性质。修正方法先做VIF过滤再做模型筛选。顺序不能反。如果你发现某个拓扑指数和某个连接性指数同时出现在最终特征列表里你基本可以判定筛选流程有问题。5.3 坑三用全量数据做特征选择再交叉验证分数虚高现象交叉验证分数很高但换了一组新数据后模型完全不行。排查链路这是典型的“selection bias”又叫特征选择偏差。问题出在我的交叉验证操作顺序上——先对整个数据集做特征选择再做K折验证。等于每折验证时验证集都参与了特征选择模型“提前知道”了验证集的信息。修正方法把特征选择放进交叉验证循环内部每折只基于训练集部分做特征选择再应用到验证集上。嵌套交叉验证就是为此设计的。5.4 坑四分类/回归任务混淆评价指标用错现象D题第一问可能同时包含分类任务抗菌/不抗菌和回归任务最小抑菌浓度MIC值有的队伍全程只用AUC做评价忽略了回归模型的RMSE。排查链路看题目会发现D题数据集中活性值既有二分类的标签也有连续的浓度值。只做一类分析会漏掉很多信息。修正方法分类任务用AUC、准确率、F1做评价回归任务用RMSE和R²做评价两者都建议做并分别给出特征筛选结果。分类和回归结果可以交叉验证比如一个描述符在分类和回归中都排名靠前那它很可能真是关键变量。5.5 坑五只报结果不给物理解释现象筛选出20个描述符但没法解释这些描述符为什么对抗菌活性重要。排查链路这类题目的评分标准中非常看重对特征的分析和解释。如果只用统计方法选特征、不结合化学知识解释答辩环节很容易被问住。修正方法每选出一个重要特征查阅这个描述符代表的分子物理化学意义。比如疏水性相关描述符如ClogP高通常有利于穿透细菌细胞膜极化率相关描述符和分子电子分布有关影响与靶点蛋白的结合。把这些背景知识写进论文结果的可信度立刻不一样。6. 给准备做此类题目的团队的建议如果你未来要参加这类涉及分子描述符分析的赛题有几点经验我可以直接分享。第一一定要重视数据的维度和量纲。拿到数据后先用几分钟跑一下shape、describe、isnull这些基本检查心里有底了再往下做。不要在特征几万个的情况下直接开始建模先粗筛再精筛效率会提升一个量级。第二把特征筛选流程化、代码化。三层漏斗的每一层都封装成函数方便重新调整参数后快速重跑。我当时为了调参方便写了一个简单的pipeline文件用配置文件控制每一层的阈值后来换阈值做敏感性分析时省了大量时间。第三珍惜物理解释这个优势。数学建模和机器学习竞赛的最大区别在于评委更看重你对问题的理解和分析。对于分子描述符这道题如果你的报告只堆了一堆Lasso、XGBoost、SHAP方法名却没有解释筛选出的描述符在化学上意味着什么分数不会太高。反过来你如果能说清楚“为什么这个拓扑描述符对分子穿透细胞膜有影响”分数立刻提升一个档次。第四追求简单而稳定不追求花哨而复杂的技巧。这道题第一问的核心目标是筛选出稳定、可解释、预测能力强的描述符集合。一个用十几个描述符就能达到R²0.85的简单模型比一个用一百个特征、看起来精度略高但完全无法解释的黑盒模型更有价值。最后顺手分享一个我在实际操作中发现很有用的小技巧特征筛选完成后把最终选中的描述符和原始分子结构一一对应回查一遍。你会在这一遍中发现很多有意思的规律比如高活性分子往往在某些描述符上分布集中低活性分子分布分散。这种观察写进报告里是很好的加分项也能加深你自己对这个问题的理解。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价