首页 > 其他分享 >Task2 baseline01 精读 #datawhale夏令营

Task2 baseline01 精读 #datawhale夏令营

时间:2024-08-03 17:25:18浏览次数:12  
标签:Task2 精读 list ids datawhale item sorted data id

写在前面

这个是datawhale夏令营2024年第三期的第二次Task的笔记,由于Task2要求的是精读代码,而我在第一篇文章中已经精读的差不多了,这篇文章我就总结升华一下上篇文章的内容,并且补充说明一下上一篇文章说的不太完善的__main__函数后面的部分内容。

好了,我们开始今天的探索之旅

代码的整体概览

datawhale给的这个流程图我觉得比较不错:

所以根据以上的信息,可以推断,上一次我们讲到的__main__后面的部分应该不是没什么用,应该就是所谓的“纠错与结果文件生成部分”根据这个思路,我们复盘一下最后这几段代码:

“纠错与结果文件生成部分”代码的复盘

我们先看看datawhale给出的对这一块的介绍:

纠错与结果生成部分存在的目的是由于目前使用了api调用在线开源大模型,因为网络、模型能力等原因会导致有一些结果会出现缺失。(比如大模型回答时,没有明确给出ABCD的结果,而返回的空值。也有时因为网络retry模块机会使用结束后,依然没有提取到结果会跳过某个问题。)

意思就是说,我们由于是线上调用的,有时候由于网络等问题我们这个大模型得到的答案可能会有所缺失,所以我们应该把这些“答得不好的”给过滤掉。

那么我们来看一下这个部分的代码

去重与排序

将一个问题背景下的所有问题存入同一个字典,并按id序号排序。

def has_complete_answer(questions):
    # 这里假设完整答案的判断逻辑是:每个question都有一个'answer'键
    for question in questions:
        if 'answer' not in question:
            return False
    return True

def filter_problems(data):
    result = []
    problem_set = set()

    for item in data:
        # print('处理的item' ,item)
        problem = item['problem']
        if problem in problem_set:
            # 找到已存在的字典
            for existing_item in result:
                if existing_item['problem'] == problem:
                    # 如果当前字典有完整答案,替换已存在的字典
                    if has_complete_answer(item['questions']):
                        existing_item['questions'] = item['questions']
                        existing_item['id'] = item['id']
                    break
        else:
            # 如果当前字典有完整答案,添加到结果列表
            if has_complete_answer(item['questions']):
                result.append(item)
                problem_set.add(problem)

    return result

return_list = filter_problems(return_list)
# 排序工作 通过id字段后三位代表序号
sorted_data = sorted(return_list, key=lambda x: int(str(x['id'])[-3:]))
print(sorted_data)

以上是datawhale给出来的所有的对这段代码的解读。

首先澄清一个事,就是我们从后往前看这个调用顺序,会发现这几个函数调用调用的是main(ifn,ofn)生成的return_list,也就是结果数据,那么我应该更正上一篇文章所提到的这个has_complete_answer函数的传入值里没有'answer'。因为他传入的是结果值,结果值里没有'answer'就在filter函数里把这个传入的data(在后面调用时传入的是result_list)append到这个result里面,返回result,这个result是过滤后最终的result,具体的话我们看后面。

纠错
def find_missing_ids(dict_list):
    # 提取所有序号
    extracted_ids = {int(d['id'][-3:]) for d in dict_list}
    
    # 创建0-500的序号集合
    all_ids = set(range(500))
    
    # 找出缺失的序号
    missing_ids = all_ids - extracted_ids
    
    return sorted(missing_ids)

这个就是利用集合的差来找到缺失的id,我们结合后面的调用或许会有更好的理解

后面的调用
return_list
return_list = filter_problems(return_list)
sorted_data = sorted(return_list, key=lambda x: int(str(x['id'])[-3:]))
print(sorted_data)
# 示例字典列表
dict_list = sorted_data

# 找出缺失的序号
missing_ids = find_missing_ids(dict_list)
print("缺失的序号:", missing_ids)

len(missing_ids)

从这里我们就可以看到,这个按id排好顺序的sorted_data就是find_missing_ids的参数,结合这个,是不就很快理解了上面这个找缺失值的函数了呢

补错

针对空缺的列表我们进行补错,让每个answer字段默认填充为A,当然如果这种补错机制大家觉得不满意可以再送入多线程函数处理一边。

data  = []
with open('round1_test_data.jsonl') as reader:
    for id,line in enumerate(reader):
        if(id in missing_ids):
            sample = json.loads(line)
            for question in sample['questions']:
                question['answer'] = 'A'
            sorted_data.append(sample)
sorted_data = sorted(sorted_data, key=lambda x: int(str(x['id'])[-3:]))
        

这个结合官方给的说明我们得知,这个就是一个把所有在missing_id里的id所对应的问题的答案都设为A,然后插入到原来的sorted_data里。

存储文件
with open('upload.jsonl', 'w') as writer:
    for sample in sorted_data:
        writer.write(json.dumps(sample, ensure_ascii=False))
        writer.write('\n')

最后这个就是创建一个文件(因为'w'模式下如果目录中没有这个文件他会自动创建这个文件),并且把整个回答的答案上传到这个文件中。

好了,以上就是我对这个项目的全部理解,由于水平有限,还希望大家可以多多指正

祝大家学习愉快!

标签:Task2,精读,list,ids,datawhale,item,sorted,data,id
From: https://blog.csdn.net/weixin_54542639/article/details/140763831

相关文章

  • Datawhale AI夏令营(第三期)
    Task4上分加油站提分思路如何使用大语言模型实现top方案呢?一是训练&微调模型提升解决逻辑推理问题的能力。二是使用各种prompt工程、agent系统方案,达到模型解决逻辑推理问题的能力边界。从这两个方面向大家介绍如何提分,有哪些方案可以选择,可以参考哪些资料。模型训练&......
  • Datawhale AI夏令营(AI+生命科学)深度学习-Task3直播笔记
    机器学习lgm上分思路    1、引入新特征(1)对于Task2特征的再刻画        GC含量是siRNA效率中的一个重要且基本的参数,可以作为模型预测的特征。这是因为低GC含量会导致非特异性和较弱的结合,而高GC含量可能会阻碍siRNA双链在解旋酶和RISC复合体作用下的解旋。......
  • Datawhale AI夏令营(AI+物质科学)之跑通baseline-Task2新手教程
    前言DatawhaleAI的夏令营(线上的),这期夏令营是基于天池平台“第二届世界科学智能大赛物质科学赛道:催化反应预测”开展的从零入门AIforScience。上篇文章完成Task1教程后,继续给大家干Task2的教程,话不多说,开整!正文第一步:1.打开魔塔社区:链接如下:魔搭社区汇聚各领域最先进的......
  • Datawhale AI夏令营 逻辑推理
    #AI夏令营#Datawhale#夏令营#大模型#微调实践步骤:一、跑通baseline二、尝试个人idea三、尝试进阶baseline比赛链接:上海科学智能研究院一、baseline介绍baseline代码由官方提供,无需修改食用指南:Datawhalebaseline收获官方提供的baseline可以做到一键运行,只......
  • Datawhale AI 夏令营:siRNA药物药效预测----Task 1
    Task1:赛题解析&背景入门思考引导(前言)RNA干扰(RNAi)RNA干扰(RNAi)是一种天然存在的基因表达调控机制,通过小干扰RNA(siRNA)等分子来沉默特定基因的表达。这一机制在细胞中起着重要作用,能精确地抑制目标基因的表达,从而减少相应蛋白质的产生。siRNA通过与靶mRNA结合,诱导RNA诱导沉默复......
  • Datawhale AI夏令营 第三期Task1 笔记
    逻辑推理赛道baseline代码分析与总结前言主要是对baseline的代码进行了代码分析和流程总结,以及个人的一点关于prompt的想法目录引入依赖包设置模型和API密钥API调用和重试机制生成Prompt和解析结果处理数据主函数评估和过滤辅助函数深度学习知识点总结1引入依赖包首......
  • DataWhale AI夏令营 AI+化学 task1
    导入库首先,代码导入了需要用到的库,包括pandas(用于数据处理和分析),scikit-learn(机器学习库),rdkit(化学信息工具)。读取数据代码通过使用pd.read_csv函数从文件中读取训练集和测试集数据。使用Morgan分子指纹建模SMILES此步先要完成特征提取,具体来说,有rxnid,Reactant1,Re......
  • Datawhale AI 夏令营 第二期 机器学习 Task3 学习笔记 尝试使用深度学习方案
    概要:如何进行时间序列的进阶特征提取与分析如何构建深度学习方案一.时序特征的详细介绍 1.日期变量:时间序列数据通常包含日期或时间信息。这可以细分为不同的时间尺度,如年、月、周、日、小时、分钟等。在特征提取时,可以将这些日期变量转换为数值型特征,以便于模型......
  • Datawhale AI夏令营
    DatawhaleAI夏令营第三期可以报名了,实习证明+奖学金+项目经历,本期与阿里云天池联合主办。......
  • Datawhale AI夏令营学习笔记 (3)
        在上一篇DatawhaleAI夏令营学习笔记(2)-CSDN博客中我们尝试使用了机器学习的方法进行回归预测。本篇,我们分为两个方面来探索。一方面,我们将继续使用机器学习的方法,在原有的数据上做更多特征工程,在预测上我们使用更多的算法模型。另一方面,我们尝试使用深度学习的方......