首页 > 其他分享 >Datawhale AI夏令营(AI+生命科学)深度学习-Task3直播笔记

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

时间:2024-08-02 21:25:09浏览次数:15  
标签:binary Task3 AI train 模型 Datawhale score 序列 siRNA

机器学习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都看到这里了,要是觉得有用的话就辛苦动动小手点个赞吧!

标签:binary,Task3,AI,train,模型,Datawhale,score,序列,siRNA
From: https://blog.csdn.net/qq_74869852/article/details/140812578

相关文章

  • ISC.AI 2024人工智能峰会——个人笔记
    个人记录篇360开放明星场景,邀请国内最强大模型合作名单:零一万物,华为云,科大讯飞,百度,火山引擎,商汤,360,智谱AI,百川智能,腾讯,MiniMax,面壁智能,阿里云,DeepSeek,学而思(九章大模型)。网络安全专项扶持政策上海市普陀区:详情见视频回放“ISC.AI2024上海AI峰会”的28分42秒至47分整。......
  • 《从工地到AI:一位测量员的五年转型之路
    回想过去二十几年的人生,满眼皆是**“不经历风雨,怎能见彩虹”**的真实写照。高中毕业,便是我的第一个人生滑铁卢,原本有机会东山再起的我,选择了一个大专。大学毕业,捧着国家一等奖的我原本可以在中铁系统稳稳的待下去,但因为受不了大山里的寂寞,选择了到大城市工作。职场失意,......
  • 【AI冰封挑战】搭档函数计算,“冰”封你的夏日记忆
    在AI绘画领域,StableDiffusion、WebUI、Midjourney等工具各领风骚,但ComfyUI以其独特的自动化工作流机制,自问世以来便迅速崭露头角,成为众多应用开发者和艺术创作者的新宠。它不仅革新了AI生图的创作流程,更以高效的自动化水平,为AI绘画领域开辟了全新的篇章。夏日炎炎,别让高......
  • .net 8 应用在docker容器中创建失败 Failed to create CoreCLR, HRESULT: 0x80070008
    在UAT环境中docker容器里部署.net8应用没问题,在dev环境dockerrun启动失败,并报错FailedtocreateCoreCLR,HRESULT:0x80070008以下文章解决了我遇到的问题,感谢https://www.cnblogs.com/cyq1162/p/17981333处理办法增加--security-optseccomp=unconfineddockerrun-......
  • 科大讯飞T30 UItra AI学习机和科大讯飞p30对比评测
    科大讯飞T30UItraAI学习机科大讯飞T30UItraAI学习机内置了星火大模型,主打“AI一对一”,支持AI答疑辅导、AI提优课、幼小初高全科提升等功能。其内置的屏幕尺寸为14.7英寸,分辨率高达3K,刷新率为120Hz,PPI为247。此外,该产品还配备了行业首款星闪AI手写笔,并且支持超万级压感和磁吸......
  • 科大讯飞T30 UItra AI学习机 怎么样 值得买吗
    科大讯飞学习机T30Ultra搭载了全球首创的类自然光+微纳米类纸护眼屏技术,不仅模拟自然光线,减少视觉疲劳,更以3K超高清分辨率和247PPI的极致细腻,为用户带来前所未有的视觉盛宴。配合120Hz高刷新率,无论是阅读、学习还是观看视频,都能享受到丝滑流畅的视觉享受。同时,作为行业首款配备......
  • 科大讯飞AI学习机x3pro和科大讯飞T30 UItra对比评测
    科大讯飞T30UItraAI学习机科大讯飞T30UItraAI学习机内置了星火大模型,主打“AI一对一”,支持AI答疑辅导、AI提优课、幼小初高全科提升等功能。其内置的屏幕尺寸为14.7英寸,分辨率高达3K,刷新率为120Hz,PPI为247。此外,该产品还配备了行业首款星闪AI手写笔,并且支持超万级压感和磁吸......
  • 精准防控,高效管理:AI智能分析网关V4区域未停留检测算法的介绍及应用
    一、区域未停留AI检测算法概述随着人工智能和计算机视觉技术的飞速发展,区域未停留AI检测算法作为一种重要的视频分析技术,逐渐在各个领域得到广泛应用。该算法通过高效处理视频流数据,能够实时分析并判断目标对象是否在预设区域内有足够的停留时间,为安全管理和事件预防提供了有力支......
  • AWS开发人工智能:如何基于云进行开发人工智能AI
    随着人工智能技术的飞速发展,企业对高效、易用的AI服务需求日益增长。AmazonBedrock是AWS推出的一项创新服务,旨在为企业提供一个简单、安全的平台,以访问和集成先进的基础模型。本文中九河云将详细介绍AmazonBedrock的功能特点以及其收费方式,帮助用户更好地理解和利用这一服务......
  • centos7 解决docker 拉取镜像错误 error pulling image configuration: download fai
    为什么会出现i/otimeout错误?i/otimeout错误主要是由于网络连接不稳定或者服务器响应慢导致的。当Docker尝试从镜像仓库拉取镜像时,如果在规定时间内没有得到响应,就会出现i/otimeout错误。“错误的根源在于网络连接和镜像仓库的响应速度” 解决方案:换源为了解决这个......