![](https://cdn1.deepmd.net/static/img/d7d9741bda38a158-957c-4877-942f-4bf6f81fcc63.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-1.png?x-oss-process=image/resize,w_50,m_lfit)
背景概述
对映选择性(enantioselectivity)是有机化学重要的研究主题之一. 在有机反应中, 手性催化剂的对映选择性往往与反应过渡态中一些重要的非共价相互作用(non-covalent interactions, NCIs)有关. 以Birman等报道的酰基转移反应为例:
在Birman等假设的机理中, 手性催化剂的对映选择性由-堆积或-阳离子堆积作用介导, 特定手性的过渡态因位阻作用导致两个芳环不平行, 不利于堆积作用的形成.
本次上机作业中, 我们将以线性回归模型定量地探索所用手性催化剂的性质对对映选择性的影响, 试图揭示: (1) 哪些性质参数会影响对映选择性? (2) 如何优化性质参数可以提升对映选择性 (例如减少还是增加某参数)? 为此, 我们将考察如下图所示的模型体系:
其中, 底物的芳香环(A, a, b)按照特定的几何约束条件与催化剂(D, c, d)排列成复合物, 而芳环与底物的其余分子骨架(包含醇羟基和烷基)在图中箭头所示位置相连.
数据探索与清洗
数据的初步探索
在数据集nci_birman.csv
中, 包含如下三组(用作特征的)参数:
- -堆积作用参数:
d_pi_d
,d_pi_D
,e_pi_d
,e_pi_D
. 根据特定的电子结构计算方法(B97-D/def2TZVP水平), 对复合物进行几何优化, 给出几何结构信息与互作能(复合物能量减去各组分能量和). 其中:- 每组复合物中, 底物芳环由于具体朝向的不同, 存在2种可能构象(比如下图的例子), 分别以后缀
_d
和_D
作区分; - 在计算中, 对底物与催化剂分子的两个芳环施加约束条件, 使二者完全“正对彼此”(环平面平行, 且两环中心的连线与环平面垂直). 此时, 我们找到使电子能量(前缀
e_
, 单位kcal/mol)最低的、也就是使复合物最稳定的环间距(前缀d_
, 单位Å)
- 每组复合物中, 底物芳环由于具体朝向的不同, 存在2种可能构象(比如下图的例子), 分别以后缀
- 烷基几何参数:
L_Alk
,B1_Alk
,B5_Alk
, 分别代表长度、最大宽度、最小宽度. - 芳环几何参数:
L_Ar
,B1_Ar
,B5_Ar
, 分别代表长度、最大宽度、最小宽度. 后两组参数称为Sterimol参数, 其具体含义可从下图中做简单的理解:
我们的线性回归模型将以上述参数作为特征(在化学信息学中, 这些特征也常称为描述符, descriptor), 试图预测特定催化剂针对特定底物的对映选择性. 在数据集中, 选择性以对映比描述, 这是一个实验可测的量. 通过热力学公式, 我们可以将其与两种对映体的活化自由能之差之间建立定量联系:
((28, 11), Index(['d_pi_d', 'd_pi_D', 'e_pi_d', 'e_pi_D', 'L_Alk', 'B1_Alk', 'B5_Alk', 'L_Ar', 'B1_Ar', 'B5_Ar', 'er(%)'], dtype='object'))
数据的清洗与加工
对于堆积相互作用参数, 我们不妨对其进行降维: 取两个可能构象_d
和_D
的参数加权和:
其中, 权重取为(按电子能量计算的)Boltzmann因子:
任务1: 对数据nci_birman
进行进一步加工处理.
- 在函数
prepare_data()
中, 输入:- 直接读取自
csv
的原始数据集in_df
; - 用于进行加权和与计算的温度
temperature
.
- 直接读取自
- 返回: 处理好的特征和标签.
- 特征为
pd.DataFrame
格式, 包括:- 降维后的(加权)参数, 以及二者的交叉项(乘积), 分别命名为
d_pi_w
,e_pi_w
与de_pi_w
; - 所有原有的Sterimol几何参数, 名称不变.
- 降维后的(加权)参数, 以及二者的交叉项(乘积), 分别命名为
- 标签为
pd.Series
格式, 为自由能差, 单位取为kcal/mol, 命名为delta_delta_G
. 这里给出单位换算因子: 1 kcal/mol = 4.184 kJ/mol.
完成该函数后, 请务必运行下面的代码块先做初步检查.
( d_pi_w e_pi_w de_pi_w L_Alk B1_Alk B5_Alk L_Ar B1_Ar B5_Ar 0 3.54 -10.24 -36.2496 4.36 2.92 3.35 6.38 1.77 3.15 1 3.54 -10.24 -36.2496 4.35 2.09 3.34 6.38 1.77 3.15 2 3.54 -10.24 -36.2496 4.38 1.73 3.33 6.38 1.77 3.15 3 3.54 -10.24 -36.2496 3.08 1.70 2.20 6.38 1.77 3.15 4 3.49 -11.88 -41.4612 3.08 1.70 2.20 6.38 1.88 4.52, 0 2.409283 1 2.009314 2 1.939568 3 1.770392 4 1.770392 Name: delta_delta_G, dtype: float64)
完成初步检查后, 可以运行下面的代码块对该函数进行测试. 测试通过情况将关系到该任务的得分. 请勿修改该代码块中的任何内容.
names: PASSED labels: PASSED weighted features: PASSED
拆分与归一化
原数据没有直接分出训练集和测试集, 我们可以用sklearn.model_selection.train_test_split
对数据集进行手动拆分.
任务2: 将28个样本先按照23:5的份额划分训练集与测试集, 再在各个数据集上分别对特征作均值-方差归一化:
返回(归一化后的)训练集与测试集. 注意: 测试集上归一化时, 正确的做法是使用训练集上算出的均值和方差, 而非在测试集上重新计算.
- 任务2.1: 完成函数
split_and_normalize()
的编写, 输入:- 原始数据集的特征
X
与标签y_true
; - 测试集大小
test_size
(默认为5).
- 原始数据集的特征
- 返回拆分好的
X_train
,X_test
,y_true_train
,y_true_test
, 其中,X_train
与X_test
进行了归一化处理. 为了和StandardScaler
保持统一, 请确保返回的四个值均为np.array
格式. - 任务2.2: 在以下代码块的注释区回答问题: 为什么均值-方差归一化需要在训练集和测试集上分开进行? 如果先归一化再拆分, 会导致什么后果?
提示
- 归一化(在
sklearn
中叫做标准化, standardization)既可以像上机实习1演示的那样手动计算, 也可以通过函数sklearn.preprocessing.StandardScaler
实现.- 注意: 如果自己用
pandas
库计算mean
和std
, 请设置计算std
时的参数ddof=0
. 这是StandardScaler
方法的计算原则.
- 注意: 如果自己用
- 警惕机器学习模型在数据集上“作弊”.
完成该函数后, 请务必运行下面的代码块先做初步检查.
((23, 9), (5, 9), (23,), (5,), array([[ 0.42406026, -1.33849328, -1.52140685, -0.6614069 , -0.49516148, -0.66142293, 1.05956952, 1.60444467, -0.32533693], [-1.88163055, -1.6336777 , -1.35706549, -0.6614069 , -0.49516148, -0.66142293, -0.95160099, -0.44567907, 1.21608991], [ 0.10281569, 0.09160145, 0.07049792, 1.49963287, 0.60697214, 1.50910389, 1.08789587, -0.88055381, 0.16245638], [ 0.10281569, 0.09160145, 0.07049792, -0.6614069 , -0.49516148, -0.66142293, 1.08789587, -0.88055381, 0.16245638], [-0.12578654, 0.085004 , 0.10130983, -0.6614069 , -0.49516148, -0.66142293, 0.94626414, 1.97719444, 0.48439996]]))
完成初步检查后, 可以运行下面的代码块对该函数进行测试. 测试通过情况将关系到该任务的得分. 请勿修改该代码块中的任何内容.
shapes after split: PASSED normalization: PASSED
模型训练与评估
我们在9个特征与23个训练样本上训练一个线性回归模型, 并评估其在5个测试样本上的预测表现.
任务3: 搭建模型, 完成训练与评估.
- 任务3.1: 完成函数
train_model()
的编写. 输入:- 训练集
X_train, y_true_train
.
- 训练集
- 返回一个训练好的线性回归模型
sklearn.linear_model.LinearRegression
. - 任务3.2: 编写函数
evaluate_model()
, 实现预测图、与RMSE值的报告(作图用的函数plot_prediction()
已经给出). 输入:- 模型
model
与数据集X
,y_true
; - 评估模式
mode
, 可在plot
和metrics
中二选一, 如果传入plot
则作预测图(不返回任何内容), 如果传入metrics
则返回RMSE与值.
- 模型
- 任务3.3: 调用你编写的函数
evaluate_model()
, 完成下述任务:- 将训练集上的预测图保存为文件
pred.png
, 以备提交; - 将测试集上的RMSE值与值打印出来.
- 将训练集上的预测图保存为文件
完成任务3.1后, 请务必运行下面的代码块做初步检查: 输出的在训练集上的RMSE值应当与0很接近.
0.008216668462894015
检查完成后, 你可以继续完成任务3.2: 结合给出的函数plot_prediction()
(已经给出, 取自上机实习1), 编写函数evaluate_model()
.
完成该函数后, 你可以继续完成任务3.3: 运行下面的代码块. 我们先在训练集上作出预测图, 再报告测试集上的RMSE与.
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/22778/e93e916906d64f73b17f3596cf9de16f/9wWLVG66bcxLOJaOW4xYww.png)
![](https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/article/22778/e93e916906d64f73b17f3596cf9de16f/H5Hv2MhMp_v85yjaw0DXJA.png)
选做任务: 所选参数是足够合理的吗? 一方面, 实验数据本身可能就带有噪声; 另一方面, 所选取的几何参数数目还是过多了. 事实上, 若想进一步对特征进行降维(或挑选), 还可以有很多策略, 例如:
- 主元分析法(PCA, 将在后续课程学到).
- -正则化. 理论课已经讲过, -范数约束相比于-范数约束更易产生稀疏解, 我们借助正则化强度的控制, 可以让很多参数变为0, 对应的那些分量就相应被舍弃, 达到特征选择(feature selection)的目的.
- 根据各个特征可以解释的数据方差大小进行特征选择, 详情可阅读
sklearn.feature_selection
模块的官方文档.
你可以选择在下面的代码块中自由实践你感兴趣的特征选择方法, 并在注释的答题区中给出你的讨论.
结果分析
任务4: 运行下面的代码块, 根据参数正负, 考察各个因素对对映选择性的影响, 在注释的答题区中写下你的分析.
- -堆积作用如何影响对映选择性? (从几何结构与能量两方面考虑) 这符合你的直觉吗?
- 烷基的几何参数如何影响对映选择性? 和芳基几何参数相比, 总体看, 谁的影响更大?
提示
- 越大, 表明两种对映异构体的动力学活性相差越大, 于是对映选择性越好.
- 你可能会得到一些反直觉的结果, 但这是模型过拟合(特征数目过多)导致的问题, 请如实地反映输出结果, 并写出你的疑惑.
array([ 0.30209862, -2.91947758, 2.63228439, 1.79148002, 0.19527638, -1.81569224, -0.04337466, -0.041071 , -0.15565019])
![](https://cdn1.deepmd.net/static/img/d7d9741bda38a158-957c-4877-942f-4bf6f81fcc63.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-1.png?x-oss-process=image/resize,w_50,m_lfit)
![](https://cdn1.deepmd.net/static/img/d7d9741bda38a158-957c-4877-942f-4bf6f81fcc63.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-1.png?x-oss-process=image/resize,w_50,m_lfit)
![](https://cdn1.deepmd.net/static/img/d7d9741bda38a158-957c-4877-942f-4bf6f81fcc63.png?x-oss-process=image/resize,w_100,m_lfit)
![](https://cdn1.deepmd.net/bohrium/web/static/images/level-v2-1.png?x-oss-process=image/resize,w_50,m_lfit)