Datawhale AI夏令营(AI+生命科学)深度学习-Task3直播笔记

机器学习lgm上分思路

        1、引入新特征

(1)对于Task2特征的再刻画

        GC含量是siRNA效率中的一个重要且基本的参数,可以作为模型预测的特征。这是因为低GC含量会导致非特异性和较弱的结合,而高GC含量可能会阻碍siRNA双链在解旋酶和RISC复合体作用下的解旋。生物学研究人员曾经通过大量实验确定了siRNA的GC含量的可接受区间,有人提出过31.6%到57.9%这个区间,也有人提出过36%到52%这个区间。此外,也有研究者更深入地地探讨了这个问题,他们发现在反义链中,第2到第7个核苷酸和第8到第18个核苷酸的GC百分比分别为19%和52%是理想的。此外,功能性siRNA在第9到第14个核苷酸之间有一个不稳定区域(GC含量低于其他区域),被称为能量谷,这是选择siRNA的重要标准。这种内部的不稳定性通过在mRNA剪切过程中诱导最理想的构象,从而提高了RISC复合体的功能性。从上述生物学研究中我们可以发现,siRNA的GC含量,或者片段中特定位置的GC含量,对其沉默效率至关重要。

def siRNA_feat_builder3(s: pd.Series, anti: bool = False):
    name = "anti" if anti else "sense"
    df = s.to_frame()

    # GC含量
    GC_frac = (s.str.count("G") + s.str.count("C"))/s.str.len()
    df[f"feat_siRNA_{name}_GC_in"] = (GC_frac >= 0.36) & (GC_frac <= 0.52)

    # 局部GC含量
    GC_frac1 = (s.str[1:7].str.count("G") + s.str[1:7].str.count("C"))/s.str[1:7].str.len()
    ...
    
    df[f"feat_siRNA_{name}_GC_in1"] = GC_frac1
    ...

    return df.iloc[:, 1:]

参考文献:

  Paddison PJ. RNA interference in mammalian cell systems. Curr Top Microbiol Immunol 2008; 320: 1–19. 12 Ji X.

  The mechanism of RNase III action: how dicer dices. Curr Top Microbiol Immunol 2008; 320: 99–116. 13

  Rivas FV, Tolia NH, Song J-J, Aragon JP, Liu J, Hannon GJ et al. Purified Argonaute2 and an siRNA form recombinant human RISC. Nat Struct Mol Biol 2005; 12: 340–349. 14

  Su H, Trombly MI, Chen J, Wang X. Essential and overlapping functions for mammalian Argonautes in microRNA silencing. Genes Dev 2009; 23: 304–317.

(2)修饰siRNA构建特征

        将修饰过的碱基序列也进行编码,简单的编码方式是将带有修饰的核苷酸编码为和普通核苷酸不一样的输入向量,复杂的编码方式是将不同修饰在化学上的差异也加入模型中。siRNA上核苷酸的化学修饰对于siRNA发挥其功能至关重要。在siRNA治疗技术研发的早期阶段,siRNA药物都是未加修饰的,siRNA可以在体内介导基因沉默,但是可能会出现较差治疗效果和潜在的非靶向效应。化学修饰的siRNA,例如用2′-O-甲基(2′-OMe)或2′-甲氧乙基(2′-MOE)取代2′-OH,或用locked nucleic acid、unlocked nucleic acid或glycol nucleic acid取代某些核苷酸,可以有效抑制由siRNA引发的免疫刺激性内源免疫激活,增强活性和特异性,并减少非靶向诱导的毒性。根据核苷酸的自然结构,化学修饰可以施加在磷酸骨架、核糖部分或碱基上。通常,这些修饰会同时引入到siRNA中。例如,2′-OMe和磷硫酸酯(PS)修饰的结合有助于胆固醇结合的siRNA的系统性给药,并实现体内高效的基因沉默。从siRNA药物的研发经验来说,对siRNA的精确修饰可以提高其沉默效率、特异性和稳定性,并减少其毒性和免疫原性。

def siRNA_feat_builder3_mod(s: pd.Series, anti: bool = False):
    name = "anti" if anti else "sense"
    df = s.to_frame()
    
    # 修饰RNA的起始、终止位置单元类别
    for pos in [0, -1]:
        for c in voc_ls:
            ...
    for pos in [1, -2]:
        for c in voc_ls:
            ...

    return df.iloc[:, 1:]

参考文献:

  Ju¨rgen Soutschek, A. A. et al. Therapeutic silencing of an endogenous gene by systemic administration of modified siRNAs. nature432, 173–178 (2004).

  Khvorova, A. & Watts, J. K. The chemical evolution of oligonucleotide therapies of clinical utility. Nat. Biotechnol.35, 238–248 (2017).

(3)siRNA序列与target序列对比

        使用反义链与target gene序列的序列匹配结果作为特征来增强模型表现。在siRNA沉默target gene的过程中,RNA酶III家族的Dicer与TAR RNA结合蛋白和Argonaute(Ago)共同作用,产生长度为21–25个核苷酸的siRNA。siRNA做为RNA诱导沉默复合体(RISC)的组成部分,能够识别靶mRNA,从而达到沉默目标基因的作用。但是siRNA与靶mRNA的互补方式的不同意味着沉默机制的不同:siRNA与mRNA的3′非翻译区(UTR)结合,在Ago1、Ago3和Ago4的帮助下会导致翻译抑制;但如果siRNA与编码序列(CDS)完全互补,靶mRNA将被Ago2的内切核酸酶活性切割。而本比赛的预测目标是mRNA的保留水平,因此siRNA反义链与target gene的匹配程度,以及匹配位置,都会对预测目标产生影响。

def get_feat_align(df, anti: bool = False):
    # 提示:https://biopython.org/docs/1.76/api/Bio.pairwise2.html
    # 使用pairwise2.align.localxx
    ...

参考文献:

  Paddison PJ. RNA interference in mammalian cell systems. Curr Top Microbiol Immunol 2008; 320: 1–19. 12 Ji X.

  The mechanism of RNase III action: how dicer dices. Curr Top Microbiol Immunol 2008; 320: 99–116. 13

  Rivas FV, Tolia NH, Song J-J, Aragon JP, Liu J, Hannon GJ et al. Purified Argonaute2 and an siRNA form recombinant human RISC. Nat Struct Mol Biol 2005; 12: 340–349. 14

  Su H, Trombly MI, Chen J, Wang X. Essential and overlapping functions for mammalian Argonautes in microRNA silencing. Genes Dev 2009; 23: 304–317.

        2、lgm模型优化

(1)低Remaining范围样本高权重

weight_ls = np.array(feats['mRNA_remaining_pct'].apply(lambda x:2 if ((x<=30)and(x>=0)) else 1))

(2)使用官方评价指标作为损失函数

# calculate_metrics函数用于计算评估指标
def calculate_metrics(preds, data, threshold=30):
    y_pred = preds
    y_true = data.get_label()
    mae = np.mean(np.abs(y_true - y_pred))
    # if mae < 0: mae = 0
    # elif mae >100: mae = 100

    y_true_binary = ((y_true <= threshold) & (y_true >= 0)).astype(int)
    y_pred_binary = ((y_pred <= threshold) & (y_pred >= 0)).astype(int)

    mask = (y_pred >= 0) & (y_pred <= threshold)
    range_mae = (
        mean_absolute_error(y_true[mask], y_pred[mask]) if np.sum(mask) > 0 else 100
    )
    # if range_mae < 0: range_mae = 0
    # elif range_mae >100: range_mae = 100

    # precision = precision_score(y_true_binary, y_pred_binary, average="binary")
    # recall = recall_score(y_true_binary, y_pred_binary, average="binary")

    if np.sum(y_pred_binary) > 0:
        precision = (np.array(y_pred_binary) & y_true_binary).sum()/np.sum(y_pred_binary)
    else:
        precision = 0
    if np.sum(y_true_binary) > 0:
        recall = (np.array(y_pred_binary) & y_true_binary).sum()/np.sum(y_true_binary)
    else:
        recall = 0

    if precision + recall == 0:
        f1 = 0
    else:
        f1 = 2 * precision * recall / (precision + recall)
    score = (1 - mae / 100) * 0.5 + (1 - range_mae / 100) * f1 * 0.5
    return "custom_score", score, True  # True表示分数越高越好

(3)自适应学习率

# adaptive_learning_rate函数用于自适应学习率
def adaptive_learning_rate(decay_rate=0.8, patience=50):
    best_score = float("-inf")  # 初始化为负无穷,因为分数越高越好
    wait = 0

    def callback(env):
        nonlocal best_score, wait
        current_score = env.evaluation_result_list[-1][2]  # 假设使用的是最后一个评估指标
        current_lr =  env.model.params.get('learning_rate')

        if current_score > best_score: 
            best_score = current_score
            # wait = 0 # 需要连续的score没有上升
        else:
            wait += 1

        if wait >= patience:
            new_lr = float(current_lr) * decay_rate
            wait = 0
            env.model.params['learning_rate'] = new_lr
            print(f"Learning rate adjusted to {env.model.params.get('learning_rate')}")

    return callback

(4)多折交叉训练

# train函数用于训练模型
def train(feats, n_original):
    # 定义k折交叉验证
    n_splits = 10
    kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
    # 开始k折交叉验证
    gbms = []
    for fold, (train_idx, val_idx) in enumerate(
        kf.split(feats.iloc[:n_original, :]), 1
    ):
        # 准备训练集和验证集
        X_train, X_val = feats.iloc[train_idx, :-1], feats.iloc[val_idx, :-1]
        y_train, y_val = feats.iloc[train_idx, -1], feats.iloc[val_idx, -1]
        w_train = weight_ls[train_idx]
        

        # 创建LightGBM数据集
        train_data = lgb.Dataset(X_train, label=y_train, weight=w_train)
        val_data = lgb.Dataset(X_val, label=y_val, reference=train_data)

        boost_round = 25000
        early_stop_rounds = int(boost_round*0.1)

        # 显示metric
        lgb_log = lgb.log_evaluation(period=200, show_stdv=True)
        lgb_stop = lgb.early_stopping(stopping_rounds=early_stop_rounds, first_metric_only=True, verbose=True, min_delta=0.00001)

        # 设置LightGBM参数
        params = {
            "boosting_type": "gbdt",
            "objective": "regression",
            "metric": "None",
            # "metric": "root_mean_squared_error",
            "max_depth": 8,
            "num_leaves": 63,
            "min_data_in_leaf": 2,
            "learning_rate": 0.05,
            "feature_fraction": 0.9,
            "lambda_l1": 0.1,
            "lambda_l2": 0.2,
            "verbose": -1, # -1时不输出
            "early_stopping_round": early_stop_rounds,
            "num_threads": 8,
        }

        # 在训练时使用自适应学习率回调函数
        adaptive_lr = adaptive_learning_rate(decay_rate=0.9, patience=1000)
        gbm = lgb.train(
            params,
            train_data,
            num_boost_round=boost_round,
            valid_sets=[val_data],
            feval=calculate_metrics,  # 将自定义指标函数作为feval参数传入
            # callbacks=[print_validation_result, adaptive_lr, lgb_log, lgb_stop],
            callbacks=[adaptive_lr, lgb_log, lgb_stop],
        )
        valid_score = gbm.best_score["valid_0"]["custom_score"]
        print(f"best_valid_score: {valid_score}")
        gbms.append(gbm)

    return gbms

其他上分思路

        1、继续优化lgm模型

(1)优化超参数:网格搜索、随机搜索、贝叶斯优化

(2)集成学习:

  • Bagging(自助聚合):通过在原始数据集上进行多次重采样来创建多个子集,分别训练多个模型,最后进行平均或多数投票决策。

  • Boosting:训练多个模型,每个模型都尝试纠正前一个模型的错误,通常是序列处理。

  • Stacking:训练多个不同的模型,然后再训练一个新的模型来综合这些模型的输出。

(3)混合学习:结合机器学习和深度学习的方法,利用深度学习的特征学习能力和传统机器学习模型的效率与解释性来提高预测准确度和效率

        2、构建新模型

  • 使用attention原理进行end2end的建模

        上一部分所述的通过特征工程进行上分的思路,都是从序列出发,基于生物学研究者在长期实践过程中积累的经验,对siRNA序列中的某些特征进行提取,以达到提高模型表现的目的。

        这种思路依然是传统的机器学习建模方法,在深度学习时代,AI研究者发现,基于大量的训练数据与端到端的数据模式提取算法,可以在大大减少建模过程中特征工程的复杂度的同时,提高模型的表现。最典型的代表案例就是卷积神经网络在图像领域的应用,以及循环神经网络和attention机制在自然语言领域的应用。

        由于本赛题中序列特征为信息量最丰富的模型特征,并且siRNA与target gene的序列信息关联对siRNA的沉默效率有直接的影响,因此可以将siRNA序列与target gene序列进行拼接,然后使用attention机制捕捉这两段序列内部,以及这两段序列之间与沉默效率相关的pattern。这种方法有望从数据驱动的视角,获得超出生物学家经验的新的siRNA序列模式以提高siRNA的设计能力,这才是AI for science的真正魅力所在。

  • 使用基础模型辅助建模

        近年来,在图像与自然语言领域,大模型正在如火如荼的发展与应用。大模型的主要思路就是通过深度学习算法的大规模参数,从大规模数据中提取有效信息,从而获得超越人类专家的智能。

        生物学序列数据也有大量的数据积累,计算生物学家们也希望在生物领域做出能够理解生物语言的chatGPT,现在已经有一些工作对大规模DNA、RNA序列进行预训练,获得了生物学序列大模型,以支持下游的一系列应用,比如LucaOne、hyenaDNA、caduceus等。

        我们难以在比赛期间自己训练出一个生物序列大模型,但是可以站在巨人的肩膀上,充分利用已有的生物序列基础模型,生成siRNA和target gene序列的表征向量,然后这些包含更多生物学信息的表征向量输入模型,以提高预测效果。

        由于生物序列大模型的研发仍处于学术研究的阶段,并没有一个公认最有效的模型,所以建议大家多多进行文献搜索与尝试,挑选出最适合该任务的基础模型

直播讨论 

  1. 进行集成学习的时候,要注意多个模型的差别最好不是很大,不然可能结合之后分数反而降低了
  2. Task2中提取到的特征还有一个思路是用MLP或者SNN之类的小的模型把数值特征编码一下,然后加到RNN里面去进行预测,然后使用深度学习去建模
  3. 使用深度学习的话,建议使用预训练模型先跑一层出来
  4. 如果要用超参数优化的话,就建议先不要加交叉验证,先用效果最好的一折进行查找参数
  5. 最大树深度一般是4~10,叶子节点数一般是2^{N}-1,N为最大树深度,然后如果最大树深度设置到了10的话,一般它不会是一个叶子节点都长满的一个树,叶子节点数会大概在2^{9}-1的样子
  6. 一般来说,还是推荐大家做一个表格,每次变动了哪些特征,然后本地的loss和提交后得到的分数各产生了什么变化,每次小的变化都有可能会产生比较大的改变,可能数据会有比较大的gap
  7. 原理介绍(最终的目的就是让MSRA引导蛋白去靶向到MRA上,使MRA降解,即沉默下来)
  8. 特征多了的话,有些特征是有冲突的,但是具体是哪些特征有冲突,是显性的特征还是隐变量就比较难说,机器学习会好一点,但是深度学习就会有这样的问题
  9. 树模型有一个好处是每次训练会自动筛选特征

hahaha都看到这里了,要是觉得有用的话就辛苦动动小手点个赞吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pluses

喜欢就给颗糖果吧╰(*°▽°*

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

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

打赏作者

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

抵扣说明:

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

余额充值