siRNA药物药效预测#AI夏令营 #Datawhale #夏令营

1. 赛题解读

赛题背景:siRNA的化学修饰对siRNA在体内的稳定性、毒性、药代动力学特性至关重要,是siRNA研发中的重要影响因素,本赛题聚焦经过化学修饰的siRNA序列数据预测其对相应的信使RNA(mRNA)沉默效率指标,对指导siRNA药物设计具有重要指向性作用。通过预测siRNA的沉默效率,来提升药物设计的效果。

结合数据集来看,我认为比较关键的参数有疾病基因(mRNA)编号,药物基因(siRNA)编号,药物基因正义序列,药物基因反义序列,药物使用量,细胞系和转染方式。

                                                                   图1 数据集

1.1 原理

药物基因(siRNA)的反义序列与疾病基因几乎互补,可以与疾病基因结合,使疾病基因无法表达。

1.2 预测

预测一段siRNA对指定疾病的沉默效率。

2. Baseline

1. 基因词组分词

用于将基因组序列分割成固定长度的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

N-gram一般用于NLP的问题当中,它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。处理后的分词结果列表是这段代码的向量特征空间。

2. 基因组词汇类

class GenomicVocab:
    def __init__(self, itos):
        # 初始化词汇表,itos是一个词汇表列表
        self.itos = itos
        # 创建从词汇到索引的映射
        self.stoi = {v: k for k, v in enumerate(self.itos)}
        
    @classmethod
    def create(cls, tokens, max_vocab, min_freq):
        # 创建词汇表类方法
        # 统计每个token出现的频率
        freq = Counter(tokens)
        # 选择出现频率大于等于min_freq的token,并且最多保留max_vocab个token
        itos = ['<pad>'] + [o for o, c in freq.most_common(max_vocab - 1) if c >= min_freq]
        # 返回包含词汇表的类实例
        return cls(itos)

这个处理使笔者以往没有接触过的。应该是利用上一个步骤中得到的gram,与索引相关联,以便在后续的数据分析中高效地存储、检索和分析这些片段。通过统计高频片段,找出比较大可能性的致病基因片段和治疗基因片段。

3. GRU神经网络模型

利用GRU模型处理siRNA序列

class SiRNAModel(nn.Module):
    def __init__(self, vocab_size, embed_dim=200, hidden_dim=256, n_layers=3, dropout=0.5):
        super(SiRNAModel, self).__init__()
        
        # 初始化嵌入层
        self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
        # 初始化GRU层
        self.gru = nn.GRU(embed_dim, hidden_dim, n_layers, bidirectional=True, batch_first=True, dropout=dropout)
        # 初始化全连接层
        self.fc = nn.Linear(hidden_dim * 4, 1)  # hidden_dim * 4 因为GRU是双向的,有n_layers层
        # 初始化Dropout层
        self.dropout = nn.Dropout(dropout)
    
    def forward(self, x):
        # 将输入序列传入嵌入层
        embedded = [self.embedding(seq) for seq in x]
        outputs = []
        
        # 对每个嵌入的序列进行处理
        for embed in embedded:
            x, _ = self.gru(embed)  # 传入GRU层
            x = self.dropout(x[:, -1, :])  # 取最后一个隐藏状态,并进行dropout处理
            outputs.append(x)
        
        # 将所有序列的输出拼接起来
        x = torch.cat(outputs, dim=1)
        # 传入全连接层
        x = self.fc(x)
        # 返回结果
        return x.squeeze()
    

其实笔者不太熟悉与RNN相关的模型,故上网搜索一下。

门控循环神经网络(Gated Recurrent Neural Network,GRNN)的提出,旨在更好地捕捉时间序列中时间步距离较大的依赖关系。它通过可学习的门来控制信息的流动。其中,门控循环单元 (Gated Recurrent Unit,GRU)是一种常用的 GRNN。

参考连接:【机器学习】详解 GRU-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值