分子AI预测赛笔记

news/2024/7/8 1:09:50 标签: 人工智能, 笔记

#AI夏令营 #Datawhale #夏令营

Taks1 跑通baseline

根据task1跑通baseline

注册账号

直接注册或登录百度账号,etc

fork 项目

零基础入门 Ai 数据挖掘竞赛-速通 Baseline - 飞桨AI Studio星河社区

启动项目 

选择运行环境,并点击确定,没有特殊要求就默认的基础版就可以了

等待片刻,等待在线项目启动

运行项目代码

点击 运行全部Cell

程序运行完生成文件 submit.csv

这个文件就最终提交的文件。

 Taks2 赛题深入解析

理解赛题,了解机器学习竞赛通用流程

数据字段理解 

Docs

对 Smiles、Assay (DC50/Dmax)、Assay (Protac to Target, IC50)、Assay (Cellular activities, IC5、Article DOI、InChI字段学习分析

预测目标

选手需要预测PROTACs的降解能力,具体来说,就是预测Label字段的值。

根据DC50Dmax的值来判断降解能力的好坏:如果DC50大于100nM且Dmax小于80%,则Label为0;如果DC50小于等于100nM或Dmax大于等于80%,则Label为1。

零基础入门AI(机器学习)竞赛 - 飞书云文档
https://datawhaler.feishu.cn/wiki/Ue7swBbiJiBhsdk5SupcqfL7nLX

Docs

Task3初步调试参数

学习9群助教 【温酒相随】原创, 九月助教编辑调整, 首发于B站~

https://www.bilibili.com/read/cv35897986/?jump_opus=1

导入库、训练集和测试集

# 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/train.xlsx')
# 使用 read_excel() 函数从文件中读取测试集数据,文件名为 'testdata-new.xlsx'
test = pd.read_excel('./data/test.xlsx')
train

 查看数据类型

data = train.info()

data

部分数据的数据项比较少。可以筛掉减少拟合

# 筛选
train = train.iloc[:,1:]
test = test.iloc[:,1:]
# 行保留 列从第一个下标1开始
# train['lan'].value_counts()# language

查看object类型的列表


# 查看object类型的列表
train.select_dtypes(include = 'object').columns

缺失值查看

# 缺失值查看

temp = train.isnull().sum()

temp[temp > 0]

唯一值个数判断 

# 唯一值个数判断
# fea = train.columns
fea = train.columns.tolist()
fea

 输出唯一值

# 输出唯一值

for f in fea:

    print(f,train[f].nunique());# nunique() 统计列中的唯一值

 筛选

# 定义了一个空列表cols,用于存储在测试数据集中非空值小于10个的列名。
cols = []
for f in test.columns:
    if test[f].notnull().sum() < 10:
        cols.append(f)
cols

# 使用drop方法从训练集和测试集中删除了这些列,以避免在后续的分析或建模中使用这些包含大量缺失值的列
train = train.drop(cols, axis=1)
test = test.drop(cols, axis=1)
# 使用pd.concat将清洗后的训练集和测试集合并成一个名为data的DataFrame,便于进行统一的特征工程处理
data = pd.concat([train, test], axis=0, ignore_index=True)
newData = data.columns[2:]

将SMILES转换为分子对象列表,并转换为SMILES字符串列表  

data['smiles_list'] = data['Smiles'].apply(lambda x:[Chem.MolToSmiles(mol, isomericSmiles=True) for mol in [Chem.MolFromSmiles(x)]])
data['smiles_list'] = data['smiles_list'].map(lambda x: ' '.join(x))  

用TfidfVectorizer计算TF-IDF 

tfidf = TfidfVectorizer(max_df = 0.9, min_df = 1, sublinear_tf = True)

res = tfidf.fit_transform(data['smiles_list'])

转为dataframe格式 

# 将结果转为dataframe格式
tfidf_df = pd.DataFrame(res.toarray())
tfidf_df.columns = [f'smiles_tfidf_{i}' for i in range(tfidf_df.shape[1])]
# 按列合并到data数据
data = pd.concat([data, tfidf_df], axis=1)

自然数编码

# 自然数编码
def label_encode(series):
    unique = list(series.unique())
    return series.map(dict(zip(
        unique, range(series.nunique())
    )))
# 对每个类转换为其编码
for col in cols:
    if data[col].dtype == 'object':
        data[col]  = label_encode(data[col])

构建训练集和测试集 

# 提取data中label行不为空的,将其作为train的数据并更新索引
train = data[data.Label.notnull()].reset_index(drop=True)
# 提取data中label行为空的,将其作为teat的数据并更新索引
test = data[data.Label.isnull()].reset_index(drop=True)
# 特征筛选
features = [f for f in train.columns if f not in ['uuid','Label','smiles_list']]
# 构建训练集和测试集
x_train = train[features]
x_test = test[features]
# 训练集标签
y_train = train['Label'].astype(int)

使用采用5折交叉验证(KFold(n_splits=5

def cv_model(clf, train_x, train_y, test_x, clf_name, seed=2022):

    # 进行5折交叉验证
    kf = KFold(n_splits=5, shuffle=True, random_state=seed)
    train = np.zeros(train_x.shape[0])
    test = np.zeros(test_x.shape[0])
    cv_scores = []
    # 每一折数据采用训练索引和验证索引来分割训练集和验证集
    for i, (train_index, valid_index) in enumerate(kf.split(train_x, train_y)):
        print('************************************ {} {}************************************'.format(str(i+1), str(seed)))

        trn_x, trn_y, val_x, val_y = train_x.iloc[train_index], train_y[train_index], train_x.iloc[valid_index], train_y[valid_index]
        # 配置CatBoost分类器的参数
        params = {'learning_rate': 0.05, 'depth': 8, 'l2_leaf_reg': 10, 'bootstrap_type':'Bernoulli','random_seed':seed,
                  'od_type': 'Iter', 'od_wait': 100, 'random_seed': 11, 'allow_writing_files': False, 'task_type':'CPU'}
        # 使用CatBoost分类器训练模型
        model = clf(iterations=20000, **params, eval_metric='AUC')

        model.fit(trn_x, trn_y, eval_set=(val_x, val_y),
                  metric_period=100,
                  cat_features=[],
                  use_best_model=True,
                  verbose=1)
        val_pred  = model.predict_proba(val_x)[:,1]
        test_pred = model.predict_proba(test_x)[:,1]

        train[valid_index] = val_pred
        test += test_pred / kf.n_splits
        cv_scores.append(f1_score(val_y, np.where(val_pred>0.5, 1, 0)))

        print(cv_scores)

    print("%s_score_list:" % clf_name, cv_scores)
    print("%s_score_mean:" % clf_name, np.mean(cv_scores))
    print("%s_score_std:" % clf_name, np.std(cv_scores))
    return train, test
    
cat_train, cat_test = cv_model(CatBoostClassifier, x_train, y_train, x_test, "cat")

这段代码是一个交叉验证模型的函数,用于训练和评估分类器模型。具体来说,它使用了CatBoost分类器,在给定的训练数据集上进行了5折交叉验证,并返回了训练集和测试集的预测结果。

函数中的参数包括:

  • clf: 分类器模型的类对象,这里是CatBoostClassifier。
  • train_x, train_y: 训练数据的特征和标签。
  • test_x: 测试数据的特征。
  • clf_name: 分类器的名称,用于输出结果。
  • seed: 随机种子,默认为2022。

函数的主要流程如下:

  1. 创建了一个5折交叉验证器(KFold)。
  2. 初始化了训练集和测试集的预测结果数组。
  3. 在每一折循环中,根据训练索引和验证索引分割训练集和验证集。
  4. 配置CatBoost分类器的参数,并使用训练集训练模型。
  5. 对验证集和测试集进行预测,并将预测结果加入到结果数组中。
  6. 计算并保存每一折验证集的F1分数。
  7. 输出每一折的F1分数列表、平均分数和标准差。
  8. 返回训练集和测试集的预测结果。

通过调用这个函数,可以得到CatBoost分类器在给定数据集上的交叉验证结果,评估模型的性能以及获取训练集和测试集的预测结果。

输出结果

from datetime import datetime

current_time = datetime.now()  # 获取当前时间
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间

# print("当前时间:", current_time)
# print("格式化时间:", formatted_time)
# 5. 保存结果文件到本地
pd.DataFrame(
    {
        'uuid': test['uuid'],
        'Label': pred
    }
).to_csv(formatted_time+ '.csv', index=None)

 本地torch部分未用

这个夏令营不简单 #AI夏令营 #Datawhale #夏令营 


http://www.niftyadmin.cn/n/5535873.html

相关文章

【双出版加持!录用率高!见刊、检索更稳定!】第六届结构抗震与土木工程研究国际学术会议 (ICSSCER 2024,8月16-18)

随着社会的发展&#xff0c;城市规模的不断扩大&#xff0c;建筑形态也趋于多样化和复杂化&#xff0c;建筑结构形式逐渐由规则简单向高层、大跨甚至特殊复杂的方向发展。而房屋建筑是人们正常生活和生产活动的基本场所&#xff0c;房屋建筑结构的安全必须得到充分保障。但是&a…

ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)

1.摄像头模组 SC130GS通过一个引脚&#xff08;SPI_I2C_MODE&#xff09;选择使用IIC或SPI配置接口&#xff0c;通过查看摄像头模组的原理图&#xff0c;可知是使用IIC接口&#xff1b; 通过手册可知IIC设备地址通过一个引脚控制&#xff0c;查看摄像头模组的原理图&#xff…

【CSAPP】-linklab实验

目录 实验目的与要求 实验原理与内容 实验步骤 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 实验总结 实验目的与要求 1.了解链接的基本概念和链接过程所要完成的任务。 2.理解ELF目标代码和目标代码文件的基本概念和基本构成 3.了解ELF可重定位目…

音视频流媒体视频平台LntonAIServer视频监控平台工业排污检测算法

在当今社会&#xff0c;环境保护和可持续发展已成为全球关注的焦点。工业生产作为经济发展的重要支柱&#xff0c;其对环境的影响不容忽视。因此&#xff0c;如何有效地监控和管理工业排污&#xff0c;成为了一个亟待解决的问题。LntonAIServer工业排污检测算法应运而生&#x…

Node版本管理工具 fnm 安装使用

fnm 是一个基于 Rust 开发的 Node 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, built in R…

超详细的 C++中的封装继承和多态的知识总结<1.封装与继承>

引言 小伙伴们都知道C面向对象难&#xff0c;可是大家都知道&#xff0c;这个才是C和C的真正区别的地方&#xff0c;也是C深受所有大厂喜爱的原因&#xff0c;它的原理更接近底层&#xff0c;它的逻辑更好&#xff0c;但是学习难度高&#xff0c;大家一定要坚持下来呀&#xff…

【面试系列】C#高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

扫描工具Metasploit的安装和使用

安装 Metasploit 你可以使用 Metasploit 的安装脚本从 Rapid7 官方站点下载安装。 更新系统包&#xff1a; sudo apt update下载并安装 Metasploit&#xff1a; curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framew…