kaggle比赛_前7%_预测分子中原子对之间的作用力_Predicting Molecular Properties
我的主要工作总结:
- 核心是==特征工程==,为小队构造、筛选出了针对不同情况下的最合适的特征,最高时涉及到的将近400个特征,每个特征我都亲自考察过它牵扯到的背景、公式及含义
- 为小队提供最好的单个模型结果:-1.78258,为最终的模型融合做好准备
- 对模型融合进行了尝试,最好时达到:-1.95196,稍逊于最优的结果:-1.97267
文章目录
1.目标
预测分子中原子对之间的作用力–即耦合常数 scalar_coupling_constant
2.背景信息
3.特征工程
3.1 构造特征
3.1.1 basic_qm9特征群
qm9为外部特征群,包含了有机分子的计算几何,能量,电子和热力学性质。
- ‘rc_A’,分子转动的转动常数
- ‘rc_B’,分子转动的转动常数
- ‘rc_C’,分子转动的转动常数
- ‘mu’,分子的偶极矩,dipole_moments.csv contains X,Y,Z values per molecule and sqrt(X2+Y2+Z^2)=mu
- ‘alpha’,分子极化率
- ‘homo’,分子中已占有分子的能级最高轨道的能级
- ‘lumo’,分子中未占有电子的能级最低轨道的能级
- ‘gap’,lumo-home,光环境下是否稳定(gap越小,分子越容易激发)
- ‘r2’,分子的空间范围
- ‘zpve’,分子在零点(绝对零度,0k)的振动能
- ‘U0’,分子在0k时的内能
- ‘U’,分子在298.15k(25℃)的内能 U=电子能量+振动能量+转动能量
- ‘H’,分子在298.15k(25℃)的焓(H=U+PV)p为压强,v为体积
- ‘G’,分子在298.15k(25℃)的*能(吉布斯),(G=H-TS)t温度,s熵,特征的热力学过程中,系统减少的内能可转化为对外做功的部分
- ‘Cv’,分子在298.15k(25℃)的热容量
- 每个*度下都有自己的振动频率
- ‘freqs_min’,分子中所有*度下最小的振动频率
- ‘freqs_max’,分子中所有*度下最大的振动频率
- ‘freqs_mean’,分子中所有*度下平均的振动频率
- ‘linear’,分子是否为线性
- ‘mulliken_min’,分子中原子最小的mulliken charge
- ‘mulliken_max’,分子中原子最大的mulliken charge
- ‘mulliken_mean’,分子中原子的平均mulliken charge
- ‘mulliken_atom_0’,分子中的原子对的第一个原子的mulliken charge
- 'mulliken_atom_1’分子中的原子对的第一个原子的mulliken charge
basic 特征群,涉及到量子对最基本的距离,角度等相关性质
- x_0,y_0,z_0,x_1,y_1,z_1 #原子对的坐标
- atom_index_x,atom_index_y #原子对的原子在分子中的索引
- atom_1 #原子对的第二个原子是哪个,因为第一个都是H,所以只记录了第二个原子
- rad_1 #原子对的第二个原子的半径
- ele_neg_1#原子对的第二个原子的电负性
- dist #原子对的距离
- dist_x,dist_y,dist_z#原子对分别在x,y,z轴上的距离
- x_mean,y_mean,z_mean #分子中原子坐标在x,y,z轴上的平均值
- x_std,y_std,z_std #分子中原子坐标在x,y,z轴上的标准差
- x_min,y_min,z_min #分子中原子坐标在x,y,z轴上的最小值
- x_max,y_max,z_max #分子中原子坐标在x,y,z轴上的最大值
- x_mean_diff_0,y_mean_diff_0,z_mean_diff_0,x_mean_diff_1,y_mean_diff_1,z_mean_diff_1 #分子中原子坐标和分子中原子坐标平均值的差值
- x_std_diff_0,y_std_diff_0,z_std_diff_0,x_std_diff_1,y_std_diff_1,z_std_diff_1 #分子中原子坐标和分子中原子坐标标准差的差值
- x_min_diff_0,y_min_diff_0,z_min_diff_0,x_min_diff_1,y_min_diff_1,z_min_diff_1 #f分子中原子坐标和分子中原子坐标的最小值的差值
- x_max_diff_0,y_max_diff_0,z_max_diff_0 ,x_max_diff_1,y_max_diff_1,z_max_diff_1 #f分子中原子坐标和分子中原子坐标的最大值的差值
- type_0 # 将原子结合类型type分为type_0(数字),
- type_1 #type_1(英文字母)
- atom_index_closest_0 #分子中距离原子对第一个原子的最近的原子
- atom_index_closest_1 #分子中距离原子对第二个原子的最近的原子
- distance_closest_0 #身为原子对第一个原子时,构成的最近的原子对距离
- distance_closest_1 #身为原子对第二个原子时,构成的最近的原子对距离
- x_closest_0,y_closest_0,z_closest_0 ,#身为原子对的第一个原子时,构造的距离最近原子对的另一个原子的x坐标
- x_closest_1,y_closest_1,z_closest_1 #身为原子对的第二个原子时,构造的距离最近原子对的另一个原子的x坐标
- atom_index_farthest_0#分子中距离原子对第一个原子的最远的原子
- atom_index_farthest_1#分子中距离原子对第二个原子的最远的原子
- distance_farthest_0 #身为原子对的第一个原子时,构造的距离最远原子对的距离
- distance_farthest_1 #身为原子对的第二个原子时,构造的距离最远原子对的距离
- x_farthest_0,y_farthest_0,z_farthest_0,#身为原子对的第一个原子时,构造的距离最远原子对的另一个原子的x坐标
- x_farthest_1,y_farthest_1,z_farthest_1 ,#身为原子对的第一个原子时,构造的距离最远原子对的另一个原子的x坐标
- max_distance_x #原子对中第一个原子构成原子对的最大距离
- max_distance_y #原子对中第二个原子构成原子对的最大距离
- min_distance_x #原子对中第一个原子构成原子对的最小距离
- min_distance_y #原子对中第二个原子构成原子对的最小距离
- distance_center0 #分子中,原子对的第一个原子的坐标和该分子中原子的平均坐标的距离
- distance_center1 #分子中,原子对的第二个原子的坐标和该分子中原子的平均坐标的距离
- distance_c0 #分子中原子对的第一个原子到分子中距离最近的原子对的第一个原子的距离
- ,distance_c1 #分子中原子对的第二个原子到分子中距离最近的原子对的第二个原子的距离
- distance_f0 #分子中原子对的第一个原子到分子中距离最远的原子对的第一个原子的距离
- distance_f1 #分子中原子对的第二个原子到分子中距离最远的原子对的第二个原子的距离
- cos_c0_c1 #原子对的第一个原子到其构成的距离最近的原子对向量,和原子对的第二个原子到其构成的距离最近的原子对向量的cos
- cos_f0_f1 #原子对的第一个原子到其构成的距离最远的原子对向量,和原子对的第二个原子到其构成的距离最远的原子对向量的cos
- cos_c0_f0 #原子对的第一个原子到其构成的距离最近的原子对向量,和原子对的第一个原子到其构成的距离最远的原子对向量的cos
- cos_c1_f1 #原子对的第二个原子到其构成的距离最近的原子对向量,和原子对的第二个原子到其构成的距离最远的原子对向量的cos
- cos_center0_center1 #原子对的第一原子到分子中心点的向量,和原子对的第二个原子到中心点的向量的cos,当atom_1或atom_0的坐标为分子的平均坐标时,cos为nan
- cos_c0 #原子对的第一个原子到其构成的距离最近的原子对向量,和该原子对向量的cos
- cos_c1 #原子对的第二个原子到其构成的距离最近的原子对向量,和该原子对向量的cos
- cos_f0 #原子对的第一个原子到其构成的距离最远的原子对向量,和该原子对向量的cos
- cos_f1 #原子对的第二个原子到其构成的距离最远的原子对向量,和该原子对向量的cos
- cos_center0 # 原子对的第一原子到分子中心点的向量,和原子对的向量的cos,当atom_1的坐标为分子的平均坐标时,cos为nan
- cos_center1 # 原子对的第二原子到分子中心点的向量,和原子对的向量的cos
- molecule_couples #分子中有几个原子
- atom_0_couples_count #分子中,组成原子对的第一个原子共形成了几个键
- atom_1_couples_count #分子中,组成原子对的第二个原子共形成了几个键
- molecule_dist_mean #分子中原子对的平均距离
- molecule_dist_mean_diff #分子中,原子对的距离和原子对平均距离的差值
- molecule_dist_std #分子中原子对距离的标准差
- molecule_dist_std_diff #分子中原子对距离和原子对距离的标准差的差值
- molecule_dist_mean_min #分子中原子对距离的最小值
- molecule_dist_mean_min_diff #分子中原子对距离和原子对距离的标最小值的差值
- molecule_type_dist_max #分子中原子对距离的最大值
- molecule_type_dist_max_diff #分子中原子对距离和原子对距离的标最大值的差值
- molecule_type_dist_mean ,molecule_type0_dist_mean ,molecule_type1_dist_mean #分子中不同类型(eg: type 1JHN, type0:1, type1: JHN)的原子对的平均距离
- molecule_type_dist_mean_diff ,molecule_type0_dist_mean_diff,molecule_type1_dist_mean_diff #分子中不同类型的原子对距离的平均值和原子对距离的差值
- molecule_type_dist_std,molecule_type0_dist_std,molecule_type1_dist_std #分子中不同类型的原子对距离的平均值
- molecule_type_dist_std_diff,molecule_type0_dist_std_diff,molecule_type1_dist_std_diff #分子中不同类型的原子对距离的标准差和原子对距离的差值
- molecule_type_dist_min,molecule_type0_dist_min,molecule_type1_dist_min #分子中不同类型的原子对距离的标准差
- molecule_type_dist_min_diff,molecule_type0_dist_min_diff,molecule_type1_dist_min_diff #分子中不同类型的原子对距离的最小值和原子对距离的差值
- molecule_type0_dist_max,molecule_type1_dist_max #分子中不同类型的原子对距离的最大值
- molecule_type0_dist_max_diff,molecule_type1_dist_max_diff #分子中不同类型的原子对距离的最大值和原子对距离的差值
- molecule_atom_1_dist_mean ,molecule_atom_1_dist_mean_diff,molecule_atom_1_dist_std,molecule_atom_1_dist_std_diff,molecule_atom_1_dist_min,molecule_atom_1_dist_min_diff,molecule_atom_1_dist_max,molecule_atom_1_dist_max_diff #分子中原子对的第二个原子类型形成原子对的相关信息 atom_0都是H,所以原子对第一个原子形成的原子对信息就不弄了
- molecule_atom_index_0_x_1_mean,molecule_atom_index_0_x_1_mean_diff,molecule_atom_index_0_x_1_max,molecule_atom_index_0_x_1_max_diff,molecule_atom_index_0_x_1_min,molecule_atom_index_0_x_1_min_diff,molecule_atom_index_0_x_1_std,molecule_atom_index_0_x_1_std_diff,molecule_atom_index_0_y_1_mean,molecule_atom_index_0_y_1_mean_diff,molecule_atom_index_0_y_1_max,molecule_atom_index_0_y_1_max_diff,molecule_atom_index_0_y_1_min,molecule_atom_index_0_y_1_min_diff,molecule_atom_index_0_y_1_std,molecule_atom_index_0_y_1_std_diff,molecule_atom_index_0_z_1_mean,molecule_atom_index_0_z_1_mean_diff,molecule_atom_index_0_z_1_max,molecule_atom_index_0_z_1_max_diff,molecule_atom_index_0_z_1_min,molecule_atom_index_0_z_1_min_diff,molecule_atom_index_0_z_1_std,molecule_atom_index_0_z_1_std_diff #分子中原子对的第一个原子形成原子对时,第二个原子的相关信息
- molecule_atom_index_1_x_0_mean,molecule_atom_index_1_x_0_mean_diff,molecule_atom_index_1_x_0_max,molecule_atom_index_1_x_0_max_diff,molecule_atom_index_1_x_0_min,molecule_atom_index_1_x_0_min_diff,molecule_atom_index_1_x_0_std,molecule_atom_index_1_x_0_std_diff,molecule_atom_index_1_y_0_mean,molecule_atom_index_1_y_0_mean_diff,molecule_atom_index_1_y_0_max,molecule_atom_index_1_y_0_max_diff,molecule_atom_index_1_y_0_min,molecule_atom_index_1_y_0_min_diff,molecule_atom_index_1_y_0_st,molecule_atom_index_1_y_0_std_diff,molecule_atom_index_1_z_0_mean,molecule_atom_index_1_z_0_mean_diff,molecule_atom_index_1_z_0_max,molecule_atom_index_1_z_0_max_diff,molecule_atom_index_1_z_0_min,molecule_atom_index_1_z_0_min_diff,molecule_atom_index_1_z_0_std,molecule_atom_index_1_z_0_std_diff #分子中原子对的第一个原子形成原子对时,第二个原子的相关信息
- molecule_atom_index_0_dist_mean,molecule_atom_index_0_dist_mean_diff,molecule_atom_index_0_dist_std,molecule_atom_index_0_dist_std_diff,molecule_atom_index_0_dist_min,molecule_atom_index_0_dist_min_diff,molecule_atom_index_0_dist_max,molecule_atom_index_0_dist_max_diff #分子中原子对的第一个原子形成原子对时,原子对距离的相关信息
- molecule_atom_index_1_dist_mean,molecule_atom_index_1_dist_mean_diff,molecule_atom_index_1_dist_std,molecule_atom_index_1_dist_std_diff,molecule_atom_index_1_dist_min,molecule_atom_index_1_dist_min_diff,molecule_atom_index_1_dist_max,molecule_atom_index_1_dist_max_diff #分子中原子对的第二个原子形成原子对时,原子对距离的相关信息
- molecule_atom_index_0_dist_min_div
- molecule_atom_index_0_dist_std_div
- molecule_atom_index_1_dist_min_div
- molecule_atom_index_1_dist_mean_div
4.1.2 giba_distance特征群
继续深挖由距离产生的各种特征
inv_dist0 按分子名和atom_index_0分组,分子中以atom_index_0为第一个原子时的距离 1/sum(1/原子对距离^3)
inv_dist1 按分子名和atom_index_1分组,分子中以atom_index_1为第二个原子时的距离 1/sum(1/原子对距离^3)
inv_distp 为inv_dist0和inv_dist_1调和平均的一半
linkM0 按link0[原子对的第一个原子参与的原子对的耦合个数]分组后,分别求mean,inv_dist0-mean
linkM1 按link1[原子对的第二个原子参与的原子对的耦合个数]分组后,分别求mean,inv_dist1-mean
R0,R1 原子对两个原子的半径
E0,E1 原子对两个原子的电负性
inv_dist0R 按分子名和atom_index_0分组,分子中以atom_index_0为第一个原子时的距离
- inv_dist1R 按分子名和atom_index_1分组,分子中以atom_index_1为第二个原子时的距离
inv_distpR inv_dist0R和inv_dist1R调和平均的一半
- inv_dist_0E 按分子名和atom_index_0分组,分子中以atom_index_0为第一个原子时的距离
inv_dist_1E 按分子名和atom_index_1分组,分子中以atom_index_1为第二个原子时的距离
inv_dist_pE inv_dist0E和inv_dist1E调和平均的一半
min_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,最小的键长
mean_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,平均的键长
max_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,最大的键长
sd_molecule_atom_0_dist_xyz 分子中atom_index_0为第一个原子时,键长的样本标准差
min_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,最小的键长
mean_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,平均的键长
max_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,最大的键长
sd_molecule_atom_1_dist_xyz 分子中atom_index_1为第二个原子时,键长的样本标准差
distC0,distN0,distH0: c作为该分子中的原子对的第一个原子时,原子对的平均键长
distC1,distN1,distH1: c作为该分子中的原子对的第二个原子时,原子对的平均键长
adN1,adN2,adN3,adN4 按照分子名和atom_index_0分组后,原子对的第二个原子是N时,距离最近的4个键长
adO1,adO2,adO3,adO4, adH1,adH2,adH3,adH4, adF1,adF2,adF3,adF4, adC1,adC2,adC3,adC4 同上
NC,NH,NN,NF,N0 该分子中C,H,N,F,O个数各几个
atom_0,atom_1:原子对的两个原子
atom_2,atom_3,atom_4,atom_5,atom_6,atom_7,atom_8,atom_9:为距离原子对中心点最近的几个原子
d_1_0, d_2_0, d_2_1, d_3_0,d_3_1, d_3_2:atom_0,atom_1,atom_2,atom_3两两之间的距离
d_4_0, d_4_1, d_4_2, d_4_3, d_5_0, d_5_1,d_5_2, d_5_3, d_6_0, d_6_1, d_6_2, d_6_3, d_7_0, d_7_1,d_7_2, d_7_3, d_8_0, d_8_1, d_8_2, d_8_3, d_9_0, d_9_1,d_9_2, d_9_3:atom_4,atom_5,atom_6,atom_7,atom_8,atom_9分别到atom_0,atom_1,atom_2,atom_3的距离
4.1.3 bond特征群
是否成键相关特征
- n_bonds_x: 原子对第一个原子在分子中的成键数目
- n_no_bonds_x:原子对第一个原子在分子中的未成键数目
- dist_mean_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的平均值
- dist_std_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的标准差
- dist_median_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的中值
- range_dist_x:原子对第一个原子在分子中同其他原子距离的范围
- range_dist_bond_x:原子对第一个原子在分子中的成键时的同其他原子距离的范围
- dist_no_bond_min_x:原子对第一个原子在分子中的未成键时的同其他原子距离的最小值
- dist_no_bond_max_x:原子对第一个原子在分子中的未成键时的同其他原子距离的最大值
- range_dist_no_bond_x:原子对第一个原子在分子中的未成键时的同其他原子距离的范围
- n_diff_x:原子对第一个原子在分子中成键时,同其他原子距离有多少不同值
- n_bonds_y: 原子对第二个原子在分子中的成键数目
- n_no_bonds_y:原子对第二个原子在分子中的未成键数目
- dist_mean_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的平均值
- dist_std_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的标准差
- dist_median_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的中值
- range_dist_y:原子对第二个原子在分子中同其他原子距离的范围
- range_dist_bond_y:原子对第二个原子在分子中的成键时的同其他原子距离的范围
- dist_no_bond_min_y:原子对第二个原子在分子中的未成键时的同其他原子距离的最小值
- dist_no_bond_max_y:原子对第二个原子在分子中的未成键时的同其他原子距离的最大值
- range_dist_no_bond_y:原子对第二个原子在分子中的未成键时的同其他原子距离的范围
- n_diff_y:原子对第一个原子在分子中成键时,同其他原子距离有多少不同值
- x_dist_abs,y_dist_abs,z_dist_abs:距离分别在x,y,z轴上的绝对值
- dimension_x,dimension_y,dimension_z:分子中原子坐标分别在x,y,z上最大值-最小值
3.2 特征筛选
3.2.1 原子对耦合类型:8个->9个
-
原子对耦合类型有8个类型[1JHC, 2JHH, 1JHN, 2JHN, 2JHC, 3JHH, 3JHC, 3JHN],由于1JHC类型的耦合常数有断层,所以根据原子对距离将其分为两个类型1JHC, 1JHC_high
3.2.2 筛选前120个重要的特征
- 利用lightgbm模型的特征重要性功能,从将近400个特征中将最重要的几个挑出来,取了重要性前120个,发现效果并不理想
3.2.3 对不同耦合类型分别筛选合适的特征
- 把重心放在giba_distance数据集上,因为该数据集的效果最好,我探索使用不同数据集不同数量的特征时,对于不同类型的耦合的交叉验证效果。1600轮,3折交叉验证:
特征采样方式 | 特征来源 |
---|---|
top120 | 从所有特征中选出重要性前120个特征 |
top_90_10 | giba_distance 前90重要特征+其他特征群的前10重要特征 |
top_60_10 | giba_distance 前60重要特征+其他特征群的前10重要特征 |
top_60_5 | giba_distance 前60重要特征+其他特征群的前5重要特征 |
top_50_5 | giba_distance 前50重要特征+其他特征群的前5重要特征 |
gd_top20 | giba_distance所有特征+其他特征群前20重要特征 |
gd_top15 | giba_distance所有特征+其他特征群前15重要特征 |
gd_top10 | giba_distance所有特征+其他特征群前10重要特征 |
gd_top8 | giba_distance所有特征+其他特征群前8重要特征 |
gd_top5 | giba_distance所有特征+其他特征集前5重要特征 |
gd_mulliken | giba_distance所有特征+qm9中mulliken相关特征 |
-
得到了对于不同耦合类型适合的特征选择,从而对不同的耦合类型选择不同的特征进行训练
3.2.4 预测附加特征fc作为特征进行预测,出现过拟合现象
- 附加特征(仅train_set中有)与最终要预测的耦合常量 的关系图:仅有fc特征与耦合常量有明显关系
-
对test_set预测fc,并将其当做特征,在上述特征选择的基础上,发现fc特征的添加,使得产生过拟合现象,故选择不用fc特征
- 无fc
- 添加fc
4.模型及参数选择
4.1 基础参数
- lightgbm 模型,7000轮,5折交叉验证
4.2 两套参数,分别用于不同的耦合类型
-
通过比较在不同的参数下的结果,选择了两套参数
-
对于1JHC_high耦合类型
LGB_PARAMS = { 'objective': 'regression', 'metric': 'mae', 'verbosity': -1, 'boosting_type': 'gbdt', 'learning_rate': 0.2, 'num_leaves': 128, 'min_child_samples': 79, 'max_depth': 9, 'subsample_freq': 1, 'subsample': 0.9, 'bagging_seed': 11, 'reg_alpha': 0.1, 'reg_lambda': 0.3, 'colsample_bytree': 1.0
-
其他类型
LGB_PARAMS = {'num_leaves': 255, 'learning_rate': 0.2, "boosting_type": "gbdt", 'objective': 'regression', 'max_depth': 9, "subsample_freq": 1, "subsample": 0.9, "bagging_seed": 11, "metric": 'mae', "verbosity": -1, 'reg_alpha': 0.8, 'reg_lambda': 0.2, 'colsample_bytree': 1.0 }
-
4.3 模型结果
为小队提供了最好的单个模型结果
5.模型融合
将我的第一,第二结果和其他公开的模型结果进行blending,最好时为对其取中值。
6.最终成绩
7.遇到的问题及解决办法
-
内存不够(kaggle平台提供16G)
-
读取csv文件时,不要将全部文件读入,可只读取需要的特征,和需要的行
df=pd.read_csv('x.csv',usecols=[需要的特证名集合],skiprows=[跳过的行数])
-
转换DataFrame中的数字类型:eg:int32->int8
-
使用gc模块及时释放内存
虽然python有自动清理内存的机制,但是只有达到阈值时才会触发清理机制,而gc模块可以方便的进行立刻清理内存
import gc del df gc.collect()
-
将测试集切分后,分别进行预测
本次比赛中原子对的耦合可分为8个类型,可以对test_set中不同类型的数据分别进行预测,以减少内存的使用
-
使用多个kenel,将特征工程分布在不同的kenel中/对结果分类型预测,最后整合
-
-
硬盘不够(kaggle平台提供4.9G)
-
保存文件时,压缩保存
#压缩保存csv文件 df.to_csv('xx.csv.gz',compression='gzip') #读取压缩csv文件 pd.read_csv('xx.csv.gz',compression='gzip')
-
上一篇: Windows右键新建中增加新建md文件
下一篇: 女士电子商务服装数据分析