Aptamer MLPD 数据预处理全流程:从 FASTQ 到 TensorFlow SSTable 的实战指南

Aptamer MLPD 数据预处理全流程:从 FASTQ 到 TensorFlow SSTable 的实战指南 人工智能深度学习NLP计算机视觉强化学习【免费下载链接】google-researchGoogle Research项目地址https://gitcode.com/gh_mirrors/go/google-research点击查看免费下载导读本指南系统讲解aptamers_mlpd项目中数据预处理preprocess的完整技术链路从测序仪产出的原始 paired-end FASTQ 文件出发经过读段计数、相似序列聚类、交叉验证折叠划分三个阶段最终产出可供 TensorFlow 模型直接消费的 SSTableTF Example proto与 Python 快速分析用的 HDF5 文件。读完本文你将掌握 aptamer核酸适配体高通量测序数据的清洗与结构化方法、分布式聚类ScaM 6-mer 特征化的工程化实现思路以及实验元数据Experimentproto如何驱动整条流水线运行。背景从 FASTQ 到计数数据适配体数据预处理面对的是典型的下一代测序NGS数据原始输入为 FASTQ 格式 文件。本项目的序列通常很短40 或 45 个碱基测序采用 paired-end 模式即 Illumina 测序仪从两个方向读取同一条 DNA。由于序列很短正反向可以完整读全在无错误的情况下Read2反向读段就是 Read1正向读段的反向互补序列。Read1 与 Read2 分别存储在两个平行的 FASTQ 文件中两个文件记录数相同每条记录代表测序仪上一个 DNA 位点两个文件中的记录顺序一致因此并行读取两个文件即可获得同一 DNA 位点的正反向序列。在整个文档语境中Experiment实验指一次完整的筛选实验包含 SELEX 或 Particle Display 的全部轮次。每对 FASTQ 文件对应实验中的某一个 DNA 池实践中即代表筛选实验中的一轮。Experimentproto 会为每一轮记录实验条件与 FASTQ 文件路径详见下文。当前流水线的处理边界所有输入均为 FASTQ 文件因此数据本质是每个序列出现的次数counts预处理的输出是 SSTable 形式的 TF Example proto 集合包含序列集合的完整信息。数据文件组织每个需要一起训练的序列集合应拥有一个独立目录用于存放本次测序运行run的 FASTQ 文件质量分析报告不在 colab 中生成的部分后处理产物如 SSTable。此外每个 NGS run 还应关联一份湿实验wet lab协议。原文档中存储路径与协议位置以xxx屏蔽README 中说明xxx表示被隐藏的内部路径或协作者名称仓库内对应目录为 aptamers_mlpd/preprocess处理代码、aptamers_mlpd/utilproto 定义与工具函数。Experiment Proto实验的机器可读描述每个完整实验由一个 proto 描述列出每一轮的实验条件与 FASTQ 文件。proto 结构定义于 aptamers_mlpd/util/selection.proto其中三个核心 message 如下。ExperimentNextId: 14定义整次实验的全局属性字段类型含义roundsmapstring, Round各轮次定义key 为轮次名称base_directorystring该实验读取数据的绝对路径目录sequence_lengthint64适配体序列固定长度正向读段reverse_sequence_lengthint64反向读段测序长度理想情况下与正向一致以便质量检查中逐碱基比对template_sequencestring可选随机序列模板由A/T/G/C/N构成N表示等概率任意碱基默认假设为N * sequence_lengthhas_partition_functionbool数据是否包含每个适配体的二级结构配分函数值forward_primer/reverse_primerstring恒定引物区序列拼接在适配体序列两端构成完整序列additional_outputrepeated AdditionalOutput附加输出列embedding_dim/embedding_columns_prefixint64/string序列嵌入的维度与特征列名前缀Round定义一轮筛选任何产生新适配体池的步骤因此随机初始库构建、PCR 扩增也算一轮字段类型含义inputstring依赖的上一轮名称构建轮次依赖关系图positive_reads/negative_readsSequencingReads该轮筛选出的 / 被淘汰的序列测序数据negative 仅用于 particle display 等保留淘汰序列的方法methodenumINVALID/RANDOM/PCR/PARTICLE_DISPLAY/SELEXtarget_concentrations/background_concentrationsmapstring, float靶标 / 背景分子浓度。单位任意但需在实验内一致浓度未知但需标记存在时设为 10 等价于缺省SequencingReads描述高通量测序读取字段类型含义fastq_forward_path/fastq_reverse_pathrepeated string正/反向 FASTQ 路径相对于base_directorynamestring输出表中该读段计数的列名measurement_idint32该测量的唯一整数 ID用于稀疏数据结构从 1 开始编号避免默认值 0statisticsCountStatistics预处理自动计算的计数统计total_depth、num_uniques、mean、std_dev、mean_log_plus_one、std_dev_log_plus_one用于 TensorFlow 模型的输出归一化depthint64已废弃改用statistics.total_depth预处理流水线总览三个阶段preprocess_walkthrough.md 将 FASTQ → TensorFlow SSTable 的流水线概括为三个阶段变换原始读段把原始 reads 转换为每个序列在每个条件下的计数相似序列聚类将相似序列聚为同一 cluster划分数据折叠将计数拆分为独立的交叉验证折叠供模型训练与验证。需要提前说明的重要前提来自 aptamers_mlpd/README.mdpreprocess 代码从 Google 主代码库中抽出并非外部可运行依赖内部 FlumeJava、ScaM 等基础设施但全部代码均已提供以供审阅Java FlumeJava 步骤SplitMeasurementsForClustering、RunPreprocessingPipeline未随仓库提供。下文将结合仓库中实际存在的源码逐一展开。阶段一原始读段 → 每个条件的计数该阶段计算数据集中所有 reads 的每条件计数相对直接分为两个子步骤。子步骤 1fastq_to_sstable每对 FASTQ → 单条件 SSTablefastq_to_sstable.py 对每个输入单端或双端FASTQ 文件独立执行一次生成一个条件级per-conditionSSTablekey 为序列value 为该序列在数据集中出现的次数。该脚本同时负责过滤低质量 reads。其命令行用法如下原文档中的示例命令[dir]替换为实际目录run xxx/fastq_to_sstable \ -- --fastq1[dir]/R1-TAAGGCGA_S1_R1_001.fastq \ --fastq2[dir]/R1-TAAGGCGA_S1_R2_001.fastq \ --measurement_id1 \ --output_name[dir]/count_tables/2016-07-28T21-16-29.024029/R1.sstable \ --alsologtostderr脚本定义的 flags 及默认值源码第 57-77 行Flag类型默认值含义--fastq1string必填第一个 FASTQ 文件路径--fastq2stringNone双端测序的第二个 FASTQ单端时省略--measurement_idinteger必填本对 FASTQ 的测量数据集 ID来自 experiment proto--sequence_lengthinteger40每条序列读段的期望长度--output_namestring内部默认路径输出 SSTable 的路径与名称--base_qual_thresholdinteger20单个碱基可接受的最低质量值质量标度 0-40Aptamers 论文中取 20见 learning/config.py 中MIN_BASE_QUALITY--bad_base_thresholdinteger5一条 read 被视为低质量的坏碱基数量上限--avg_qual_thresholdfloat30.0整条 read 被视为合格的平均质量阈值--num_readsinteger99999999999每个 FASTQ 文件纳入的 read 数量上限脚本内部工作流程与源码对应使用gfile.FastGFile(/readahead/256M/ ...)预读加速约 10 倍再包一层gzip.GzipFile解压——由于 readahead 前缀与/gzip自动解压不兼容采用这种双层循环方式见源码注释对应 b/63985459以collections.defaultdict累积计数表调用 utils.py 的read_one_fastq_pair并行读取双端文件传入上述全部质量阈值参数将统计结果含fastq_read1_name/fastq_read2_name写入output_name .statistics.pbtxt使用sstable.SortingBuilder输出 SSTablevalue 为 measurement.proto 的Measurement序列化结果mapint32, int32 countskey 为measurement_id、value 为该序列在本条件中的出现次数。质量判定与 read 分类utils.py定义了五种 read 分类常量READ_TOO_LONG过长、READ_TOO_SHORT过短、LOW_QUALITY低质量、BAD_READ_PAIR正反读段配对异常、OKAY合格。每条 FASTQ 记录由Read命名元组title、title_aux、sequence、quality承载其中质量字符串可按 FASTQ 编码ASCII 偏移量转换为 0-40 的整数FASTQ_HIGHEST_QUALITY chr(40 64)表示最高质量字符。子步骤 2merge_measurements_main合并为稀疏计数矩阵merge_measurements_main.cc 是 FlumeC 流水线将上一步产生的所有单条件 SSTable 合并为一个可能分片 shardedSSTablekey 为序列value 为Measurementproto——记录该序列在每个出现过且仅出现一次的条件中的计数即稀疏计数矩阵。源码要点通过flume::JoinOpstring join(Merge)将命令行传入的每个输入 SSTable 注册为 Join 标签flume::SSTableSourcestring, Measurement再执行join.Join()按键合并合并结果经MergeMeasurements定义于 merge_measurements.h转换后写入--output_filename指定的输出 SSTable若未提供--output_filename主函数会输出--output_filename is required并返回错误码 1。由于各轮次间绝大多数序列尤其是 Round 1计数极低且不重叠合并后的矩阵非常稀疏大多数序列只在单个 SSTable 输入中计数为 1在其他所有输入中计数为 0。阶段二相似序列聚类聚类的目标是为每条序列标注一个 cluster相似序列共享同一 cluster ID不同序列拥有不同 ID。其价值有二防止数据泄漏后续交叉验证折叠划分时同一 cluster 的全部序列必须进入同一折叠避免在训练数据上测试——即避免在训练时见过与测试序列高度相似的序列支持按簇处理例如以 cluster 中最高频的代表序列表示整簇初步研究显示这对模型性能影响可忽略却能显著减小输入数据规模README 进一步说明论文中确实只保留 cluster representative训练速度大幅提升且 AUC 等价。概念上的精确算法将所有唯一序列作为节点加入图对每一对节点计算 Levenshtein 距离若距离 ≤ 5 则在两节点间加边为结果图的每个连通分量分配唯一 cluster ID。工程化的近似实现由于输入数据可能非常多样 10 亿条序列上述朴素算法O(N²) 全对比较不可行。仓库实现的近似方案分四步第一步数据拆分。SplitMeasurementsForClustering.javaFlumeJava 流水线未随仓库提供将输入拆为两个子集一个子集用于全对比较以定义初始 cluster另一个子集投影project进前者的 cluster。为最大化全对比较的准确性其输入序列优先选择 multi-read 序列——即所有条件下 read 计数之和大于 1 的序列若该子集足够小则用 singleton 序列填充直到数据集耗尽或达到计算可处理的规模上限。实现注记原文档对于总共有 N 条 read、全对比较 read 计数上限为 R 的数据集该算法只需 O(NR) 次比较而非朴素的 O(N²)。实践中设置 R 300,000,000可在 10k 台机器上于 2 天内完成计算。第二步特征化6-mer 向量。scam_featurize_main.ccFlumeC 流水线将两个子集的序列转换为GenericFeatureVectorproto——每条序列的全部 6-mer 计数向量。这样序列间距离可由 ScaM 高效近似计算而无需对所有输入对显式计算距离。第三步ScaM 近似邻居搜索。在特征向量上运行 ScaM可扩展匹配基础设施见 README 与 arXiv:1903.08690分别计算全对子集与自身的近似邻居、投影子集对全对数据的投影。ScaM 快速但属于近似方法因此在论文中以其高度宽松的参数运行允许部分组件实际 Levenshtein 距离大于目标距离本例为 5也被连接。第四步精确校验与簇生成。对 ScaM 估算的邻居显式计算 Levenshtein 距离以确认真邻居用全对子集中的真邻居生成候选 cluster 集合再把投影序列并入相应 cluster。以上全部实现在RunPreprocessingPipeline.javaFlumeJava 流水线未随仓库提供中。由于校验后每个 cluster 已经很小逐簇进行精确距离计算是可行的。仓库内的 Python 聚类实现参考仓库同时提供了纯 Python 的聚类实现 clustering.py用于基于编辑距离的序列聚类按 Hamming 或 Levenshtein 距离可作为理解上述分布式流程的算法蓝本cluster_by_edit_distance(sequences, edit_distance, measurelevenshtein, find_nearbyNone)核心入口返回每条序列对应的整数 cluster ID 列表从 1 开始编号0 表示未聚类典型用法cluster_by_edit_distance([AAA, ATA, GGG], edit_distance1)返回[0, 0, 1]explore_cluster基于深度优先搜索DFS从种子序列出发扩张簇对每个候选仅当calc_distance(candidate, sequence) edit_distance且尚未访问时才加入待探索集合为约束最近邻搜索采用局部敏感哈希LSHexact_lsh_matches对 Hamming 距离可证明精确与approximate_lsh_matches随机化分区分别构造LSHMatcher/HashMatcheroptimal_hash_length计算使随机碰撞概率足够低的最短哈希长度_max_shift依据距离度量计算最大位移Levenshtein 距离下每移动一个碱基位置需要两次编辑故max_shift edit_distance // 2Hamming 距离无需位移文档字符串说明假设 cluster 规模恒定上述方法使聚类算法随序列数量近似线性时间运行类似方法参见文献 [1]即 NCBI PMC4281958。阶段三将计数拆分为独立数据折叠聚类完成后即可划分数据折叠划分原则同簇同折叠相似序列始终出现在同一折叠中呼应聚类目的防止泄漏簇大小分布近似均匀使各折叠间 cluster 大小的分布相近。实现方式是贪心装箱greedy bin-filling算法对所有规模大于输入阈值默认 50 条序列的 cluster 进行贪心分配而对更小但数量多得多的 cluster 依赖统计近似。所有步骤折叠生成、输入特征整合、最终输出变换均在RunPreprocessingPipeline.java中完成。README 补充了实际使用细节预处理全部完成后输出一个描述模型训练文件的元数据文本文件以及5 个 SSTable每份约含 1/5 数据——所有属于同一 cluster 的成员都位于同一个 SSTable 内5 折用于交叉验证实践中始终以 fold0 作为测试集、其余折叠作为训练集。最终输出TF Example SSTable 与 HDF5预处理的主要输出表示是供机器学习模型使用的Tensorflow.Example proto可能分片存储为 SSTable。仓库中的 sequencing_counts.py 提供了参考实现write_sstable输入为 pandas DataFrame索引为序列字符串含cluster列及各个 count 列逐记录将特征写入 TF Examplefeatures[sequence]及所有计数列通过sstable.SortingBuilder写出且显式校验序列仅含合法碱基 A/C/G/Tdna.has_invalid_bases抛错因为坏序列应在更早阶段被过滤。此外为便于 Python 快速分析流水线将 TF Example proto无损转换为包含 pandas.DataFrame 对象的HDF5 文件——两者内容完全一致HDF5 仅用于加快 Python 侧处理。运行整个预处理流水线整条流水线由一个内部 workflow 编排管理原文档中该工具以xxx屏蔽只需提供 experiment 的 pbtxt 文件即可运行全部流程——该文件描述各轮次、FASTQ 路径、测量 ID 与实验条件即上文Experimentproto 的文本形式。运行入口二进制及其职责README 中列出preprocess/fastq_to_sstable将一对 FASTQ 转换为 SSTable覆盖单个测序文件对例如 Round2_high_positivepreprocess/merge/merge_measurements_mainC Flume 代码合并各测序对产生的 SSTable输出 key 为适配体序列、value 为各轮次计数的单个合并 SSTableSplitMeasurementsForClustering未提供把合并 SSTable 拆分为用于全对聚类的序列集合preprocess/scam_featurize_main将全对子集与投影子集从序列字符串转换为向量供 ScaM 计算余弦距离run_all_pairs/run_projectionsScaM 向量匹配内部工具用法未提供RunPreprocessingPipeline未提供读取 ScaM 结果输出最终聚类。受限于内部依赖FlumeJava、ScaM、workflow 等该流水线无法在仓库环境下直接端到端运行但所有 Python/C 组件源码均已开源供审阅与复现。聚类 / 计数完成后的进一步数据分析则应依据具体实验细节在聚类结果之上进行例如按 cluster 代表序列分析富集与亲和力。小结aptamers_mlpd的预处理设计围绕三个工程难题展开大规模读段的计数压缩FASTQ → 稀疏计数矩阵、超大规模序列的近似聚类数据拆分 6-mer 特征化 ScaM 精确校验将 O(N²) 降为 O(NR)、以及防止数据泄漏的折叠划分贪心装箱 同簇同折叠。其产物——按折叠分片的 TF Example SSTable 与等价的 HDF5——正是后续 learning 模型训练与 search 序列行走 的直接输入。理解这条链路也就能复现论文中以 cluster 代表序列训练、5 折交叉验证、fold0 测试的完整数据准备逻辑。赞分享人工智能深度学习NLP计算机视觉强化学习【免费下载链接】google-researchGoogle Research项目地址https://gitcode.com/gh_mirrors/go/google-research点击查看免费下载相关推荐MovieChat技术架构全景稀疏内存机制如何解决长视频理解的算力瓶颈MovieChat技术架构全景稀疏内存机制如何解决长视频理解的算力瓶颈 MovieChat作为CVPR 2024收录的创新成果核心解决了长视频理解中算力7个TensorFlow Datasets数据预处理技巧从原始数据到模型输入的完整指南7个TensorFlow Datasets数据预处理技巧从原始数据到模型输入的完整指南 TensorFlow DatasetsTFDS是一个强大的数据集集数据集机器学习数据工程终极StickyDecoration使用指南快速实现Android列表悬浮效果终极StickyDecoration使用指南快速实现Android列表悬浮效果 StickyDecoration是一款功能强大的Android开源库专为实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考