DataWhaleAI夏令营Task1-基础baseline#2024暑期第三期

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


必知概念入门

  1. RNA干扰(RNAi)
  2. 化学修饰siRNA
  3. 深度学习与RNN
  4. 词汇表与序列编码
  5. 数据处理与特征选择
  6. 模型训练与评估
  7. PyTorch框架

一、正文内容

1.相关生物背景知识

RNAi作用机制:生物体内,RNAi首先将较长的双链RNA加工和切割成 siRNA,通常在每条链的3’末端带有2个核苷酸突出端。负责这种加工的酶是一种RNase III样酶,称为Dicer。形成后,siRNA与一种称为RNA诱导的沉默复合物(RNAinduced silencing complex, RISC)的多蛋白组分复合物结合。在RISC复合物中,siRNA链被分离,具有更稳定的5′末端的链通常被整合到活性RISC复合物中。然后,反义单链siRNA组分引导并排列在靶mRNA上,并通过催化RISC蛋白(Argonaute family(Ago2))的作用,mRNA被切割,即对应基因被沉默,表达蛋白能力削弱。

2.训练数据表头说明

图片为引用

二、代码解析

1.依赖库的导入

代码如下(示例):

import os  # 文件操作
import torch  # 深度学习框架
import random  # 随机数生成
import numpy as np  # 数值计算
import pandas as pd  # 数据处理

import torch.nn as nn  # 神经网络模块
import torch.optim as optim  # 优化器模块

from tqdm import tqdm  # 进度条显示
from rich import print  # 美化打印输出
from collections import Counter  # 计数器工具

from torch.utils.data import Dataset, DataLoader  # 数据集和数据加载器
from sklearn.model_selection import train_test_split  # 数据集划分
from sklearn.metrics import precision_score, recall_score, mean_absolute_error  # 模型评估指标
# 这些库包括了文件操作、深度学习、数据处理、模型评估等必要的工具。

# 该函数确保了在使用NumPy、Python内置随机数生成器和PyTorch时,所有的随机数生成都是可控的和可复现的,有助于实验结果的一致性。
def set_random_seed(seed):
    # 设置NumPy的随机种子
    np.random.seed(seed)
    # 设置Python内置的随机数生成器的种子
    random.seed(seed)
    # 设置PyTorch的随机种子
    torch.manual_seed(seed)
    # 设置CUDA的随机种子
    torch.cuda.manual_seed(seed)
    # 设置所有CUDA设备的随机种子
    torch.cuda.manual_seed_all(seed)
    # 确保每次卷积算法选择都是确定的
    torch.backends.cudnn.deterministic = True
    # 关闭CuDNN自动优化功能,确保结果可复现
    torch.backends.cudnn.benchmark = False

2.基因组分词器类

该类用于将基因组序列分割成固定长度的n-gram。

class GenomicTokenizer:
    def __init__(self, ngram=5, stride=2):
        # 初始化分词器,设置n-gram长度和步幅
        self.ngram = ngram
        self.stride = stride
        
    def tokenize(self, t):
        # 将输入序列转换为大写
        t = t.upper()
        
        if self.ngram == 1:
            # 如果n-gram长度为1,直接将序列转换为字符列表
            toks = list(t)
        else:
            # 否则,按照步幅对序列进行n-gram分词
            toks = [t[i:i+self.ngram] for i in range(0, len(t), self.stride) if len(t[i:i+self.ngram]) == self.ngram]
        
        # 如果最后一个分词长度小于n-gram,移除最后一个分词
        if len(toks[-1]) < self.ngram:
            toks = toks[:-1]
        
        # 返回分词结果
        return toks

代码解读

类初始化:__init__ 方法接受两个参数 ngram 和 stride,用于设置分词器的 n-gram 长度和步幅。
分词方法:tokenize 方法将输入的序列转换为大写,并根据 ngram 和 stride 对序列进行分词。
n-gram 长度为 1 的处理:如果 ngram 为 1,直接将序列转换为字符列表。
n-gram 长度大于 1 的处理:按步幅进行分词,并确保每个分词的长度等于 ngram。
最后一个分词的处理:如果最后一个分词长度小于 ngram,将其移除。
返回分词结果:返回处理后的分词结果列表。

3. 基因组词汇类

该类用于创建一个词汇表,用于将基因组片段映射为索引。

4. siRNA数据集类

该类用于加载siRNA数据,并将序列数据转换为模型可以处理的格式。

5. siRNA Model

这是一个基于GRU的神经网络模型,用于处理siRNA序列。

6.评估指标计算函数

该函数用于计算模型的各项评估指标,包括精确度、召回率、F1值和评分。

7.模型评估函数

该函数用于在测试集上评估模型性能。

8.模型训练函数

函数用于训练模型,并在每个epoch后评估模型的性能,保存最佳模型。

9.训练主程序

# 设置参数
bs = 64    # 批次大小
epochs = 50    # 训练的迭代次数
lr = 0.001    # 学习率
seed = 42    # 随机种子
output_dir = "output/models"    # 模型保存路径

# 选择设备
device = 'cuda' if torch.cuda.is_available() else 'cpu'

# 设置随机种子以确保结果可重复
set_random_seed(seed)

# 创建输出目录
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 加载数据
train_data = pd.read_csv('train_data.csv')

# 指定需要处理的列
columns = ['siRNA_antisense_seq', 'modified_siRNA_antisense_seq_list']
# 删除包含空值的行
train_data.dropna(subset=columns + ['mRNA_remaining_pct'], inplace=True)
# 将数据分为训练集和验证集
train_data, val_data = train_test_split(train_data, test_size=0.1, random_state=42)

# 创建分词器
tokenizer = GenomicTokenizer(ngram=3, stride=3)

# 创建词汇表
all_tokens = []
for col in columns:
    for seq in train_data[col]:
        if ' ' in seq:  # 修改过的序列
            all_tokens.extend(seq.split())
        else:
            all_tokens.extend(tokenizer.tokenize(seq))
vocab = GenomicVocab.create(all_tokens, max_vocab=10000, min_freq=1)

# 找到最大序列长度
max_len = max(max(len(seq.split()) if ' ' in seq else len(tokenizer.tokenize(seq)) 
                    for seq in train_data[col]) for col in columns)

# 创建数据集
train_dataset = SiRNADataset(train_data, columns, vocab, tokenizer, max_len)
val_dataset = SiRNADataset(val_data, columns, vocab, tokenizer, max_len)

# 创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=bs, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=bs)

# 初始化模型
model = SiRNAModel(len(vocab.itos))
criterion = nn.MSELoss()

# 初始化优化器
optimizer = optim.Adam(model.parameters(), lr=lr)

# 训练模型
best_model = train_model(model, train_loader, val_loader, criterion, optimizer, epochs, device, output_dir=output_dir)

10. 测试程序

# 设置输出目录
output_dir = "result"
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 加载测试数据
test_data = pd.read_csv('sample_submission.csv')
columns = ['siRNA_antisense_seq', 'modified_siRNA_antisense_seq_list']
test_data.dropna(subset=columns, inplace=True)

# 创建分词器
tokenizer = GenomicTokenizer(ngram=3, stride=3)

# 创建词汇表
all_tokens = []
for col in columns:
    for seq in test_data[col]:
        if ' ' in seq:  # 修改过的序列
            all_tokens.extend(seq.split())
        else:
            all_tokens.extend(tokenizer.tokenize(seq))
            
vocab = GenomicVocab.create(all_tokens, max_vocab=10000, min_freq=1)

# 找到最大序列长度
max_len = max(max(len(seq.split()) if ' ' in seq else len(tokenizer.tokenize(seq)) 
                    for seq in test_data[col]) for col in columns)

# 创建测试数据集
test_dataset = SiRNADataset(test_data, columns, vocab, tokenizer, max_len, is_test=True)

# 创建数据加载器
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

# 初始化模型
model = SiRNAModel(len(vocab.itos))
model.load_state_dict(best_model)  # 加载最佳模型权重
model.to(device=device)
model.eval()  # 切换到评估模式,这对于某些模块如Dropout和BatchNorm是必需的

# 进行预测
preds = []
with torch.no_grad():
    for inputs in tqdm(test_loader):
        # import pdb;pdb.set_trace()
        inputs = [x.to(device) for x in inputs]
        outputs = model(inputs)
        preds.extend(outputs.cpu().numpy())

# 将预测结果添加到测试数据中
test_data["mRNA_remaining_pct"] = preds
df = pd.DataFrame(test_data)

# 保存预测结果
output_csv = os.path.join(output_dir, "submission.csv")
print(f"submission.csv 保存在 {output_csv}")
df.to_csv(output_csv, index=False)

总结

主要介绍了相关的背景知识,以上就是今天的笔记内容。本人为电脑小白,第一次baseline分数并不理想,但是老师给的教程非常的详细,代码也有注释,还有直播老师讲解的也都非常的详细。我的学习之路还有很长希望在训练营老师的带领下,不仅能够提高学习分数,提高自己在人工智能生物科学方面的代码能力,也希望自己能为生物科学做出自己的贡献。
(说明:本文内容非原创,仅为个人学习时的笔记记录。文字、代码及图片摘自官方或其他文章,如有侵权联系删除。)

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值