1.赛题解析
(1)赛题信息解析
赛题介绍:RNAT扰(RNAi)是生物细胞内天然存在的一种基因表达调控机制,可抵御外来核酸的入侵和控制基因表达。其中小干扰RNA(SiRNA)是RNAi机制的主要作用分子SiRNA相关现象及作用机制的发现获得了2006年诸贝尔生理学或医学奖,2018年世界上首款siRNA药物获得美国FDA批准。相比于传统小分子药物,SiRNA具有可成药靶点多、药效强、安全性好、成本低的优势,其研发是全球范围内极具发展潜力的前沿医药领域之一。siRNA的化学修饰对siRNA在体内的稳定性、毒性、药代动力学特性至关重要,是SiRNA研发中的重要影响因素,本赛题聚焦经过化学修饰的SiRNA序列数据预测其对相应的信使RNA(mRNA)沉默效率指标,对指导SiRNA药物设计具有重要指向性作用。
(2)提供材料解析
(一).文件材料
(1)baseline.py:比赛仿官方提供的baseline,类似于与一个模板用来熟悉模型训练原理和基础。
(2)sample_submission.csv:训练模型需要的基因数据。
(3)train_data.csv:训练集,官方给的已知数据,用于提供给模型训练。
(4)vocab.csv:对前面两个文件属性名称的注解。
注:DateWhale对于baseline文件提供了注释详解版 task3.2_siRNA (1).ipynb 文章后面的baseline详解将基于该文件为基础。
(二)名称解析
train_data结合vocab详细解析
train_data训练集
- (1)id --> 数据唯一识别号
- (2)publication_id --> 数据来源文献号
- (3)gene_traget_symbol_name --> 需要去除的疾病基因名称(靶基因名称)
- (4)gene_traget_ncbi_id --> 疾病基因编号(mRNA编号)
- (5)gene_traget_species --> 带有mRNA的物种,主要包括人类和猕猴
- (6)siRNA_duplex_id --> 药物基因编号(siRNA编号)
- (7)siRNA_sense_seq --> 药物基因(siRNA)正义序列,与疾病基因(mRNA)序列 相似或相同。作用:稳定和辅助
- (8)siRNA_antisense_seq --> 药物基因(siRNA)反义序列,与疾病基因(mRNA)序列
- 几乎完全互补。作用:是恶并结合疾病基因,使其讲
- 解或无法表达
- (9)cell_line_donor --> 细胞系:同一个细胞系来源于同一个“祖先”,由专业的
- 公司或实验室进行复制研究
- (10)siRNA_concentration --> 药物基因(siRNA)的使用剂量,用浓度来衡昺:单位是
- 纳尔
- (11)concentration_unit --> 单位纳尔
- (12)Transfection_method --> 药物导入细胞的方法,脂质体转染、自由摄取
- (13)Duration_after_transfection_h -->药物作用时间
- (14)modified_siRNA_sense_seg -->实验过程中“升级'(修饰)前的siRNA序列
- (15)modified_siRNA_antisense_sed-->实验过程中“升级'(修饰)后的siRNA序列
- (16)nodified_siRNA_sense_seg_list-->给(14modified_siRNA_sense_seg)基因段加了空格
- 方便识别和处理
- (17)modified_siRNA_antisense seg_list-->给(15modified_siRNA_antisense_sed)基因段加
- 了空格方便识别和处理
- (18)gene_target_seg --> 疾病基因(靶基因mRNA)的序列
- (19)mRNA_remaining_pct --> 疾病基因的剩余量(我们所需要预测的值)
2.Baseline代码解析与感悟
baseline模型训练的主要由两部分构成:数据的提炼 + 模型的训练
(1)数据的提炼
(一)依赖库的导入
(二)创建基因组分词器
创建基因组分词器:用于将基因组序列分割成固定长度主要操作:国将输入序列转化为大写@将长序列RNA分子分割成更小的片段,有助于后续的分析和解读输入:长段基因输出:按照规则分割后的诸多短的片段基因。
GGUUCCAAGUCCAAUAUGGCAGGU
CCA GUC AAU UGG
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
(三)创建基因组词汇表
创建基因组词汇表:将基因组中的特定片段与一种数据结构(索引)相关联,以便在后续的数据分析中高效地存储,检索和分析这些片段,
主要操作:①统计每个基因片段的出现频率②将基因片段的出现频率从高到低排序③选择出现频率>min freq的基因片段,加入到词汇表④最多保留max_vocab 个,剩下的基因片段就不要了
原因:在疾病中高频率出现的基因片段,有一定概率“是反派”,要“揪出来”在药物中高频率出现的基因片段,有一定概率“是好”,要“拉拢过来人”
都可以作为重点研究对象!
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)