分子AI预测赛Task2笔记

119 阅读4分钟

分析一下上篇文章的基于datawhale提供的Baseline进行个人改进的想法

赛题分析Copy by@DataWhale

背景:本次大赛聚焦于运用先进的人工智能算法预测其降解效能,旨在激发参赛者创新思维,推动AI技术与化学生物学的深度融合,进一步提升药物研发效率与成功率,为人类健康事业贡献智慧力量。

任务:运用深度学习、强化学习或更加优秀人工智能的方法预测PROTACs的降解能力, 分类为 降解能力较差/降解能力好 两种结论。

Datawhale提供的baseline

image.png 在baseline中使用了LightGBM分类器进行模型训练和预测

创建一个LGBMClassifier对象。
model = LGBMClassifier(verbosity=-1)
`verbosity=-1`表示在训练过程中不显示日志信息。

使用fit()方法对模型进行训练。
model.fit(train.iloc[:, 2:].values, train['Label'])
这里的`train.iloc[:, 2:].values`是从train数据中提取除uuid和Label外的所有特征,`train['Label']`是训练标签。`fit()`方法将使用这些数据对模型进行训练。
代码分析来自@CodeGeek

可以看到baseline中代码结构清晰,易于去学习使用LightGBM进行分类。此外我们还要关注代码中选取了哪些特征的选择,train.iloc[:, 2:].values,代码中选择即除了第一列的'uuid'和最后一列的'Label'之外的所有列作为特征对象。

我的方法

在上述基础上,思路大致保持一致,在原有基础上添加一些处理工具,以便于提高预测效果

 model = LGBMClassifier(verbosity=-1) # 定义了一个lightgbm分类器,verbosity设置为-1表示在训练过程中不显示日志信息。

preprocessor = ColumnTransformer(transformers=[('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)]) # 定义了一个预处理步骤,将类别特征进行独热编码。

pipeline = Pipeline(steps=[('preprocessor', preprocessor), ('classifier', model)]) # 将预处理步骤和模型组合成一个管道。

cross_val_score(pipeline, X_train_all, y_train_all, cv=5, scoring='accuracy') # 使用交叉验证评估模型在训练集上的性能,cv=5表示使用5折交叉验证,scoring='accuracy'表示使用准确率作为评估指标。

pipeline.fit(X_train_all, y_train_all)` 这行代码在训练集上训练模型。

X_test_preprocessed = pipeline.named_steps['preprocessor'].transform(X_test) #对测试集进行预处理,得到处理后的特征。

pipeline.named_steps['classifier'].predict(X_test_preprocessed) #使用训练好的模型对测试集进行预测。
    

在原有基础上我们将数据集划分为将训练数据划分为训练集和验证集,引入交叉验证,依然使用使用LightGBM作为模型训练的分类器。

另外我们在数据预处理部分进行改进:

通过train_df.select_dtypes(include=['object'])选择所有非数值列,即类别特征,并将它们存储在categorical_features列表中。
categorical_features = train_df.select_dtypes(include=['object']).columns.tolist()

创建一个`ColumnTransformer`对象,用于处理类别特征。并使用OneHotEncoder对类别特征进行独热编码`handle_unknown='ignore'参数表示在独热编码过程中,忽略未在训练数据中出现的类别。
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
    ])

将预处理步骤添加到模型和预处理的管道中。
pipeline = Pipeline(steps=[('preprocessor', preprocessor), ('classifier', model)])

经过预处理步骤,类别特征将被转换为独热编码形式,从而满足LightGBM模型的输入需求。

其他方法

在@Datawhale提供的思路中使用catboost为主要模型,具有:

  1. 自动处理类别特征:无需对类别特征进行独热编码(One-Hot Encoding),CatBoost可以直接处理类别特征。

  2. 处理缺失值:CatBoost能够自动处理数据中的缺失值。

  3. 提升算法:CatBoost使用梯度提升决策树(GBDT)作为基学习器。

  4. 模型的可解释性:CatBoost提供了特征重要性评估和模型的可解释性工具。

  5. 多任务学习:CatBoost支持多任务学习,即同时学习多个输出。

  6. 支持大数据:CatBoost使用基于GPU和CPU的并行计算,可以高效处理大规模数据集。

    在参数选择时我们可以使用网格搜索的暴力方式,进行最优超参选择,帮助我们得到更好的结果,但我目前还未实现,希望在下次能够实现提高分数。