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

#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 提供,采用常规的机器学习方法,流程如下。

在这里插入图片描述

采用 lightgbm 进行二分类预测:

# 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 实现分类的过程如下:

  1. 特征预处理:LightGBM 在训练过程中会自动进行特征预处理,包括缺失值处理、分箱等。
  2. 初始化模型:LightGBM 会根据数据集的标签类别数量,初始化一个包含 K 个叶子节点的决策树,每个叶子节点对应一个类别的预测概率,这些概率之和为 1。
  3. 迭代训练:LightGBM 会通过梯度提升算法,不断地训练新的决策树,每个决策树都会对上一棵决策树的预测结果进行修正,使得预测结果更加准确。在每个迭代中,LightGBM 会计算出每个特征的梯度和二阶导数,并根据这些信息选择最佳的分割点,从而生成新的决策树。
  4. 预测:在预测过程中,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

# 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')
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)

在这里插入图片描述

分数提高了一点点

在上面代码的基础上,修改了一下参数:

# 4. 加载决策树模型进行训练
#model = LGBMClassifier(verbosity=-1)
model = CatBoostClassifier(iterations=1000, depth=16, learning_rate=0.005, loss_function='Logloss')
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

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不雨_亦潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值