数学建模已结束数日,今晚刚好闲来无事,决定对这次数学建模进行一下总结。
题目下发以后,和队友经过一番商讨,便决定在B和D之间选择一个,原因也很简单,本身研究方向是NLP,机器学习和深度学习自然还是比较熟悉。然后大致看了一下,B更加复杂一些,我们决定把时间多花在论文上,于是就选了D。
先来简单介绍一下D题,题意其实就是研究不同分子描述符组合对ERa这种致癌基因的影响,使用生物活性来判断这个基因的显性程度。所以也就一目了然,生物活性就是因变量Y,不同分子描述符组合就是自变量。
问题1. 根据文件“Molecular_Descriptor.xlsx”和“ERα_activity.xlsx”提供的数据,针对1974个化合物的729个分子描述符进行变量选择,根据变量对生物活性影响的重要性进行排序,并给出前20个对生物活性最具有显著影响的分子描述符(即变量),并请详细说明分子描述符筛选过程及其合理性。
问题2. 请结合问题1,选择不超过20个分子描述符变量,构建化合物对ERα生物活性的定量预测模型,请叙述建模过程。然后使用构建的预测模型,对文件“ERα_activity.xlsx”的test表中的50个化合物进行IC50值和对应的pIC50值预测,并将结果分别填入“ERα_activity.xlsx”的test表中的IC50_nM列及对应的pIC50列。
问题3. 请利用文件“Molecular_Descriptor.xlsx”提供的729个分子描述符,针对文件“ADMET.xlsx”中提供的1974个化合物的ADMET数据,分别构建化合物的Caco-2、CYP3A4、hERG、HOB、MN的分类预测模型,并简要叙述建模过程。然后使用所构建的5个分类预测模型,对文件“ADMET.xlsx”的test表中的50个化合物进行相应的预测,并将结果填入“ADMET.xlsx”的test表中对应的Caco-2、CYP3A4、hERG、HOB、MN列。
问题4. 寻找并阐述化合物的哪些分子描述符,以及这些分子描述符在什么取值或者处于什么取值范围时,能够使化合物对抑制ERα具有更好的生物活性,同时具有更好的ADMET性质(给定的五个ADMET性质中,至少三个性质较好)。
1.问题一其实就和2020年研究生数模的B题很像了,说白了就是从多个变量中筛选出其中最重要的N个。这个时候要注意的是,是筛选出原来的变量,所以PCA就显得不太适用了,因为PCA产生出了新变量,相当于对原变量进行了一种概括或合并。(有人可能会说PCA之后的结果是原变量的线性组合,我可以通过线性组合的系数来判断原变量的重要新,这种方法是可以作为一种方向,但解释性不强。同时另一个问题就值得思考,怎么确定原变量是线性无关的么,那如果不是线性无关,线性组合的方式又是否可靠呢!如果所有变量是线性无关的,那完全可以使用标准化回归,相对来说更加准确)
经过一番思考,我们考虑到可以使用的方法有灰色关联度分析、聚类、随机森林、XGBOOST以及LightGBM等集成学习的方法。最后经过尝试,聚类这种方法通过系谱图发现不适合聚20类,这个数据聚六七类就很合适,所以就把聚类丢掉了。
其中灰色关联性分析其实就是计算空间上的相似性来判断重要程度,比较常见。
随机森林是在决策树的基础上进行的改进,那么提到决策树就不得不提“信息增益”这个词了,决策树中的每个分支就是根据“信息增益”来进行计算得到,所以用信息增益来作为变量筛选的方式自然是合理的,况且使用随机森林的方法不用考虑非线性关系,一举两得。
至于集成学习的那几种方法其实是随机森林的改进版本,都是基于GBDT来做的,其中lightGBM是XGBOOST的改进版。随机森林是算“信息增益”,而这类方法是算“基尼系数”,然后使用均方误差来做损失函数。这类方法的效果也确实不错,我们使用这些方法来做,结果基本没有显著相关的变量,都通过相关性检验。
题目要求筛选20个变量,但要对所选结果进行相关性检验,这里我们设计了一个小思路,就是进行相关性检验后,删去两个相关性系数大于0.9的其中之一。然后再将变量补充至20个,再检验,再补充,直至20个变量都两两不显著相关。(相关性检验使用斯皮尔曼相关系数,因为数据不满足正态分布,正态分布使用JB检验,因为数据量大,用这个比较合适,也可以使用QQ图检验法,为了好解释,我们就用了JB检验,然后对结果进行P检验,发现P小于0.05,就拒绝原假设,不满足正态分布。这里不太清楚的话可以看一下相关性分析那块内容)
2.问题二是一个典型的回归预测问题。题目要求使用不多于20个变量,我们也就使用第一问所选的20个变量来做回归。我们基本还是使用第一问中所罗列的方法,包括随机森林、XGBOOST等,新加了SVR,以及使用粒子群算法改进的SVR、BP神经网络等。
这里说一下PSO-SVR, SVM通常指分类,SVR就是支持向量机做回归。那为什么要用粒子群算法来改进SVR呢,因为SVR包括好多超参数,粒子群算法的目的就是寻找到最合适的参数,来调优SVR,能寻找到那个最合适的超平面。
3.问题三是个典型的分类预测问题,因为题目说训练多个模型,所以就没将问题考虑为多标签分类,而是考虑为一般的多分类任务。题目没限制变量个数,于是我们使用全部变量进行训练(这里可能有人会疑惑为啥不去掉一些无意义变量,后面我会解释,耐心看完!)。这里我先说一下回归和分类的区别,我以神经网络来阐述可能更加好理解。对于神经网络,我们只要要分类的话我们通常最后接一个softmax就搞定了,但是softmax前是什么呢。其实这个东西叫做logits,就是隐藏层的输出,对应每一类别的概率,softmax其实就是将这些值归一到0-1,并且放大正例的概率,缩小负例的概率。那回归只有一个logits,最后把这个值映射到一个合适的区间也就是预测值。
除此之外,我们知道,分类任务我们通常使用交叉熵作为损失函数,而回归任务我们就不能使用交叉熵来作为损失函数了。而是要用均方误差来作为损失函数,这其实也很简单,交叉熵的定义为:
其中pic为预测值,回归任务预测值可能为一个负数,负数没有对数,所以交叉熵自然也就不能作为损失函数了,所以一般使用均方误差,事实上包括XGBoost等算法也确实使用均方误差作为损失函数。
4.问题四可能是这个题最复杂的一问了,这是一个优化问题,要求筛选一些变量,并求解他们的值或者范围,使生物活性达到最大的同时能拥有三个及以上的ADMET指标。
那我们就先初始化一批变量,这些变量应该是对生物活性影响最大的,自然就想到了使用第一问所筛选得到的20个重要变量,然后用这20个变量组成的数据使用第二问最好的模型训练一个回归模型,接着求解Y(生物活性)的最大值,然后把最大值对应的20个变量对应的值找出来用第三问训练的5个分类模型进行预测,来判断是否有三个及以上的ADMET指标满足。
这里有两个关键点:
最后的最后,真的非常感谢两位队友的努力付出,四天三夜的努力作战,最后一晚熬夜在写论文、写代码,直到最后五分钟才提交论文,一段经历最重要的可能并不是结果!故事仍未结束,生活还在继续~