【机器学习】Datawhale-AI夏令营分子性质AI预测挑战赛-基础

不雨_亦潇潇 2024-07-07 11:31:02 阅读 92

#ai夏令营#datawhale#夏令营

1. 赛事简介

比赛还是大家熟悉的预测算法类:

分子性质AI预测挑战赛

欢迎大家参加!我是Datawhale夏令营15群的运营助教 ☀️

要求选手根据提供的demo数据集,可以基于demo数据集进行数据增强、自行搜集数据等方式扩充数据集,并自行划分数据。运用深度学习、强化学习或更加优秀人工智能的方法预测PROTACs的降解能力,若DC50>100nM且Dmax<80% ,则视为降解能力较差(demo数据集中Label=0);若DC50<=100nM或Dmax>=80%,则视为降解能力好(demo数据集中Label=1)

本模型依据提交的结果文件,采用F1-score进行评价。

👉 读题可知,这是一个常规的分类问题,选手需要构建分类模型,判断分子性质(降解能力是好还是坏)

2. baseline代码

baseline 代码由 Datawhale 提供,采用常规的机器学习方法,流程如下。

在这里插入图片描述

<code># 1. 导入需要用到的相关库

# 导入 pandas 库,用于数据处理和分析

import pandas as pd

# 导入 numpy 库,用于科学计算和多维数组操作

import numpy as np

# 从 lightgbm 模块中导入 LGBMClassifier 类

from lightgbm import LGBMClassifier

# 2. 读取训练集和测试集

# 使用 read_excel() 函数从文件中读取训练集数据,文件名为 'traindata-new.xlsx'

train = pd.read_excel('./data/data280993/traindata-new.xlsx')

# 使用 read_excel() 函数从文件中读取测试集数据,文件名为 'testdata-new.xlsx'

test = pd.read_excel('./data/data280993/testdata-new.xlsx')

# 3 特征工程

# 3.1 test数据不包含 DC50 (nM) 和 Dmax (%),将train数据中的DC50 (nM) 和 Dmax (%)删除

train = train.drop(['DC50 (nM)', 'Dmax (%)'], axis=1)

# 3.2 将object类型的数据进行目标编码处理

for col in train.columns[2:]:

if train[col].dtype == object or test[col].dtype == object:

train[col] = train[col].isnull()

test[col] = test[col].isnull()

# 4. 加载决策树模型进行训练

model = LGBMClassifier(verbosity=-1)

model.fit(train.iloc[:, 2:].values, train['Label'])

pred = model.predict(test.iloc[:, 1:].values, )

# 5. 保存结果文件到本地

pd.DataFrame(

{

'uuid': test['uuid'],

'Label': pred

}

).to_csv('submit.csv', index=None)

提交结果验证后:

在这里插入图片描述

分数是0.7064,大家跑baseline都是这个分数。

3.有关baseline的问题

1️⃣ 代码是如何实现分类的?

baseline 采用的分类模型是 LightGBM

LightGBM 是一个基于梯度提升决策树(Gradient Boosting Decision Tree, GBDT)算法的快速、分布式的梯度提升框架,用于处理机器学习和数据挖掘中的分类和回归问题。

LightGBM 实现分类的过程如下:

特征预处理:LightGBM 在训练过程中会自动进行特征预处理,包括缺失值处理、分箱等。初始化模型:LightGBM 会根据数据集的标签类别数量,初始化一个包含 K 个叶子节点的决策树,每个叶子节点对应一个类别的预测概率,这些概率之和为 1。迭代训练:LightGBM 会通过梯度提升算法,不断地训练新的决策树,每个决策树都会对上一棵决策树的预测结果进行修正,使得预测结果更加准确。在每个迭代中,LightGBM 会计算出每个特征的梯度和二阶导数,并根据这些信息选择最佳的分割点,从而生成新的决策树。预测:在预测过程中,LightGBM 会将一个样本输入到所有已经训练好的决策树中,每个决策树都会输出一个预测概率,最后将所有的预测概率相加,得到该样本属于每个类别的概率,选择概率最大的类别作为最终的预测结果。

LightGBM 实现分类的过程中,还有一些细节需要注意,例如使用分类损失函数、使用类别平衡等。

LGBMModel官方文档

2️⃣ Catboost, LightGBM 和 XGBoost 的区别

Catboost, LightGBM和XGBoost都是基于梯度提升决策树算法的框架,用于解决分类和回归问题,但它们之间存在一些区别。

分类算法的差异:

XGBoost:XGBoost 使用的是二阶泰勒展开的梯度提升算法,它同时优化了一阶导数和二阶导数。LightGBM:LightGBM 使用的是梯度提升算法的一阶导数,它使用了基于直方图的近似算法,可以加快训练速度。Catboost:Catboost 使用了对数损失函数和基于对数概率的梯度提升算法,它可以处理分类型特征。

特征处理的差异:

XGBoost:XGBoost 使用树结构进行特征处理,它可以处理数值型和分类型特征。LightGBM:LightGBM 使用基于直方图的近似算法进行特征处理,它可以处理大规模数据集。Catboost:Catboost 使用了一种称为目标统计量的技术进行特征处理,它可以处理分类型特征。

并行计算的差异:

XGBoost:XGBoost 使用了一种称为线程级并行的技术进行并行计算。LightGBM:LightGBM 使用了一种称为数据级并行的技术进行并行计算。Catboost:Catboost 使用了一种称为模型级并行的技术进行并行计算。

总的来说,XGBoost、LightGBM和Catboost都是非常强大的梯度提升决策树算法,但它们在分类算法、特征处理和并行计算方面存在一些差异。因此,选择使用哪个框架需要根据具体的应用场景和数据集特点来决定。

3️⃣ 评分标准是准确率吗?

不完全是,本次比赛的结果评价指标是 F1-score,不仅考虑了精确率(Precision)还考虑到了召回率(Recall),因此不同于准确率(Accuracy)。

在二元分类问题中,Precision表示模型预测为正类的样本中有多少比例真正为正类,而Recall表示实际正样本中被模型预测为正类的样本比例,F1-score结合了Precision和Recall,可用于评估分类器的整体性能,即模型能够准确识别多少正样本,以及能够识别多少正样本中的真实正样本。

在这里插入图片描述

在这里插入图片描述

图源 王圣元老师的《快乐机器学习》,我觉得这本书讲得很清晰

4.我的代码1-替换分类模型

把 LGBMClassifier 换成 CatBoostClassifier

<code># 1. 导入需要用到的相关库

# 导入 pandas 库,用于数据处理和分析

import pandas as pd

# 导入 numpy 库,用于科学计算和多维数组操作

import numpy as np

# 从 lightgbm 模块中导入 LGBMClassifier 类

from lightgbm import LGBMClassifier

# AdaBoost

from sklearn.ensemble import AdaBoostClassifier

from sklearn.datasets import load_digits

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

# 导入CatBoostRegressor库,用于梯度提升树模型

from catboost import CatBoostRegressor

from catboost import CatBoostClassifier

# 过滤警告消息

from warnings import simplefilter

from sklearn.exceptions import ConvergenceWarning

simplefilter("ignore", category=ConvergenceWarning)

# 2. 读取训练集和测试集

# 使用 read_excel() 函数从文件中读取训练集数据,文件名为 'traindata-new.xlsx'

train = pd.read_excel('./data/data280993/traindata-new.xlsx')

# 使用 read_excel() 函数从文件中读取测试集数据,文件名为 'testdata-new.xlsx'

test = pd.read_excel('./data/data280993/testdata-new.xlsx')

# 3 特征工程

# 3.1 test数据不包含 DC50 (nM) 和 Dmax (%),将train数据中的DC50 (nM) 和 Dmax (%)删除

train = train.drop(['DC50 (nM)', 'Dmax (%)'], axis=1)

# 3.2 将object类型的数据进行目标编码处理

for col in train.columns[2:]:

if train[col].dtype == object or test[col].dtype == object:

train[col] = train[col].isnull()

test[col] = test[col].isnull()

# 4. 加载决策树模型进行训练

#model = LGBMClassifier(verbosity=-1)

model = CatBoostClassifier(iterations=500, depth=10, learning_rate=0.01, loss_function='Logloss')code>

model.fit(train.iloc[:, 2:].values, train['Label'])

pred = model.predict(test.iloc[:, 1:].values, )

# 5. 保存结果文件到本地

pd.DataFrame(

{

'uuid': test['uuid'],

'Label': pred

}

).to_csv('submit1.csv', index=None)

在这里插入图片描述

分数提高了一点点

修改了一下参数:

<code># 4. 加载决策树模型进行训练

#model = LGBMClassifier(verbosity=-1)

model = CatBoostClassifier(iterations=1000, depth=16, learning_rate=0.005, loss_function='Logloss')code>

model.fit(train.iloc[:, 2:].values, train['Label'])

pred = model.predict(test.iloc[:, 1:].values, )

# 5. 保存结果文件到本地

pd.DataFrame(

{

'uuid': test['uuid'],

'Label': pred

}

).to_csv('submit2.csv', index=None)

在这里插入图片描述

分数又提高了一点点,0.72062



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。