主要学习内容:
1.了解赛题
首先阅读赛题,理解主要任务
然后观察训练集和测试集的数据
![](https://i-blog.csdnimg.cn/direct/20f138bc565a4c149038cc66f3b11d7a.png)
![](https://i-blog.csdnimg.cn/direct/5db4846e543c4794807649df9d31a590.png)
两个数据集都有反应物,产物,催化剂,溶剂这些变量,但是测试集没有产率,说明我们要编写的模型需要通过训练集训练模型后,来预测某些反应的产率,那么这很可能是一个通过机器学习算法来解决的回归问题。
2.跑通baseline代码
在“赛题与数据”部分有一个baseline文件,其中是一个随机森林模型的代码。作为一个机器学习竞赛的小白,我并不知道baseline是什么,有什么用,通过查阅知乎大佬的回答,我理解了baseline的主要作用。
![](https://i-blog.csdnimg.cn/direct/a18e8590f0b7472287841f74aa5feac0.png)
在AI数据处理类的比赛中,我们既可以以baseline代码为参照做出一系列改进,提升分数,也可以另外手搓代码来提分。
接下来我尝试跑通baseline的代码
修改代码过程中要注意的点:
1.安装必要的库
![](https://i-blog.csdnimg.cn/direct/22ae5c9b8fb5458bab1844a2b4c7255e.png)
2.修改文件夹地址
![](https://i-blog.csdnimg.cn/direct/13c6bee31a5b473e8a7febdac4704190.png)
做完这些后代码就可以正常运行了。
运行过程中需要加载数据集以及训练模型,这两部分代码运行时间耗时较长。
3.理解代码原理
顺利运行baseline代码后我认为有必要解读baseline代码,了解基本原理。
1.数据预处理
![](https://i-blog.csdnimg.cn/direct/0f15aab0838f49738d1bd48be2310f61.png)
通过一系列查询,我了解了这是一段基本的数据预处理的代码。使用了RDKit 库来处理化学分子,并生成它们的摩根指纹(Morgan fingerprints),这是一种用于化学信息学的描述符。mfgen和vec_cpd_lst分别用于生成单个分子的摩根指纹和将一系列 SMILES(化学分子的文本表示方法,赛题描述中有所提及)字符串转换为它们对应的指纹向量。
其中mfgen()方法中的rdMolDescriptors.GetMorganFingerprintAsBitVect()是 RDKit 库中的一个函数,用于计算给定分子的摩根指纹。mfgen()方法最终返回一个包含分子的摩根指纹描述符的numpy数组。这个值最终被传到vec_cpd_lst()方法中做进一步处理。而vec_cpd_lst()是一个更为复杂的过程,这部分内容可能涉及化学原理以及固定的处理逻辑,我需要阅读相关文献后再做分析。这部分的重点在于vec_cpd_lst()方法中的vec_lst = [smi_vec_map[smi] for smi in smi_lst]一句是根据原始 SMILES 列表(包括重复项)构建最终的向量列表。
最终从数据集中输入的各种复杂的化学式都会被转换为向量,这符合机器学习模型中数据处理的基本逻辑。
2.加载数据
加载数据的过程中用到了之前的vec_cpd_lst()方法,到此处之后,所有的化学式就都是向量了。其中np.concatenate([train_rct1_fp,train_rct2_fp,train_add_fp,train_sol_fp],axis=1)用来合并四个不同的特征数组,这样一条化学反应就只有一个特征值了。
3.训练模型
![](https://i-blog.csdnimg.cn/direct/f625930aa365439188d5b0729e22ac6d.png)
训练模型的代码十分简略,使用了机器学习库中的随机森林轮子,我们在比赛中并不需要仔细了解其中的原理,但是需要理解参数的意义。
![](https://i-blog.csdnimg.cn/direct/d5e5d1cb678c44ce9440708154e03bce.png)
n_estimators设置了随机森林中树的数量
max_depth控制树的最大深度,通过查阅资料,得知深度限制可以防止树过度拟合,这个值通常不会超过50
min_samples_split决定了一个节点在被进一步分裂前必须持有的最小样本数,控制了树的生长,避免模型复杂度过高,从而防止过拟合,这个值默认为2。
min_samples_leaf设置了叶子节点必须持有的最小样本数量。这有助于防止模型在训练数据上过度拟合。增加这个参数的值可以增加模型的泛化能力,减少模型的复杂度,从而帮助减少过拟合。常见的设置可能从1, 5, 10或者更高。
n_jobs指拟合和预测阶段的作业数,设置为-1可以占用全部CPU,这样模型训练可以快些。
近些天通过调整参数发现增加树的数量和最大深度可以提高模型在测试集上的准确率。
4.存文件
这部分原理不过多赘述,作用就是存了一个随机森林的文件以及一个submit.txt文件,submit.txt就是我们需要提交的。
4.未来计划
未来几天可能会继续调整随机森林这个模型的参数,试试这个模型在此赛题上的极限。
此外可能会在此模型基础上进行一些改进,加入一些措施防止其过拟合,或者寻找其他数据预处理的方式,近日初步了解到分子指纹不止摩根指纹一种,此后可能会通过阅读比赛提供的参考文件,尝试其他化学式的描述方式。除此之外我发现训练集的数据只有2.3万条左右,并不够多,我可能会想办法寻找开源数据集,扩充训练集,并试着用神经网络解决这个问题。