跳到主要内容

01 数据集与任务定义

ML 教程不能用 set.seed + matrix(rnorm()) 模拟数据。模拟数据训出来的"分类器"准确率可以很漂亮,但生物学意义为零,模型一上真实数据立刻崩。本专栏全程用 4 套真实公开数据,这一篇教你下、读、为什么选它们,然后约定本专栏所有动手章节共用的目录结构。

4 套数据集 — 概览

数据集来源规模主要任务用在哪几章
TCGA-LIHCTCGAbiolinks(GDC API)374 样本 × 60K 基因 + OS / 临床表二分类(Tumor vs Normal)+ 预后02-06, 08, 10, 11
TCGA-BRCA(PAM50)UCSC Xena1100 样本 × PAM50 5 类多分类 + 无监督亚型04 进阶, 07
PBMC 3k10x Genomics 公开数据2700 cells × 32K genes单细胞 ML(整合 + 注释)09
airwayBioconductor 包内置8 样本 × 64K 基因快速 demo / smoke test02 demo

每套数据都"恰到好处"地适合某类 ML 问题,本节先讲为什么选它们。

为什么是这 4 套

TCGA-LIHC(主线)

  • 样本数适中(374)足够 ML 学到东西,又不至于 RAM 爆掉
  • 有清晰二分(Tumor vs Normal)+ 5 年生存数据(OS time / event)+ 完整临床(stage, grade, age, gender)
  • 国内访问 GDC 偶尔慢但能下,UCSC Xena 镜像备份
  • 文献基础好(LIHC 是肝癌主要队列,reviewer 熟悉)

TCGA-BRCA PAM50(多分类 + 无监督)

  • 5 类亚型(LumA / LumB / Her2 / Basal / Normal-like)是 ML 多分类教学的"老熟人"
  • 有公开 PAM50 标签(Parker et al, 2009)用作 supervised 也用作 unsupervised 的 ARI 验证
  • 数据量足够(> 1000)适合做学习曲线 / 大样本 stress test

PBMC 3k(单细胞 ML)

  • 已经是 Seurat 教程的 reference dataset,生信用户都见过
  • 规模适中:CPU 跑 scVI 5-10 分钟可完成,GPU 30 秒
  • 有作者标注(免疫细胞类型)用作 scANVI 自动注释的 ground truth

airway(快速 demo)

  • 8 样本是 ML 训不出靠谱模型的小数据,但正适合做 smoke test(02 章每个新归一化方法跑一遍 airway 看代码不报错)
  • 包内置(library(airway))无需下载,CI / 教程自动测试用

数据下载 — 一键脚本

配套脚本 ml-data-prepare.sh 把 4 套数据全下到 ~/biof3-data/:

bash scripts/_dev/ml-data-prepare.sh # 全下
bash scripts/_dev/ml-data-prepare.sh tcga-lihc # 只下 LIHC

每套数据各自约定:

~/biof3-data/
├── tcga-lihc/
│ ├── raw/ # GDC 下载原始 (delete-able)
│ ├── derived/ # vst + HVG + split (02 章产物,后续章节读这里)
│ │ ├── expr_vst_hvg5000.csv
│ │ ├── coldata.csv
│ │ ├── train_ids.csv / val_ids.csv / test_ids.csv
│ │ └── README.md
│ └── README.md
├── tcga-brca-pam50/
│ ├── raw/ # Xena tsv
│ └── derived/
├── pbmc3k/ # 复用 single-cell 专栏目录
└── airway/ # 包内置,无需下载

约定:所有动手章节都从 derived/ 读,不从 raw/ 重跑下载流程。这样多次重训不会触发重新下载。

R 下载实操

library(TCGAbiolinks)
library(SummarizedExperiment)

query <- GDCquery(
project = "TCGA-LIHC",
data.category = "Transcriptome Profiling",
data.type = "Gene Expression Quantification",
workflow.type = "STAR - Counts"
)
GDCdownload(query, directory = "~/biof3-data/tcga-lihc/raw")
data <- GDCprepare(query, directory = "~/biof3-data/tcga-lihc/raw")
# data 是 SummarizedExperiment 对象,行=基因,列=样本
counts <- assay(data)
coldata <- as.data.frame(colData(data))
saveRDS(list(counts = counts, coldata = coldata),
"~/biof3-data/tcga-lihc/raw/htseq_counts.rds")

⚠️ 国内访问 GDC 偶尔超时。如果跑超过 30 分钟还在下,改用 UCSC Xena 镜像:

# UCSC Xena 备份(更快但版本可能略旧)
download.file(
"https://gdc-hub.s3.us-east-1.amazonaws.com/download/TCGA-LIHC.htseq_counts.tsv.gz",
destfile = "~/biof3-data/tcga-lihc/raw/htseq_counts.tsv.gz"
)

TCGA-BRCA PAM50(UCSC Xena)

download.file(
"https://tcga-pancan-atlas-hub.s3.us-east-1.amazonaws.com/download/TCGA.BRCA.sampleMap%2FBRCA_clinicalMatrix",
destfile = "~/biof3-data/tcga-brca-pam50/raw/clinical.tsv"
)
clinical <- read.table("~/biof3-data/tcga-brca-pam50/raw/clinical.tsv",
sep = "\t", header = TRUE)
# PAM50 列在 clinical$PAM50_mRNA 或 PAM50.mRNA(年代不同 schema 不同)

PBMC 3k

# 已经在 single-cell 专栏目录
file.copy("~/biof3-data/pbmc3k/", "~/biof3-data/", recursive = TRUE)
# 或者 SeuratData::InstallData("pbmc3k")

airway(包内置)

library(airway)
data(airway)
# airway 是 SummarizedExperiment 对象
counts <- assay(airway)
coldata <- as.data.frame(colData(airway))

Python 下载实操

TCGA-LIHC(scanpy + AnnData)

import scanpy as sc
import pandas as pd
import os

DATA_DIR = os.path.expanduser("~/biof3-data/tcga-lihc/derived")
expr = pd.read_csv(f"{DATA_DIR}/expr_vst_hvg5000.csv", index_col=0)
coldata = pd.read_csv(f"{DATA_DIR}/coldata.csv", index_col=0)

# 转成 AnnData(行=样本,列=基因)
adata = sc.AnnData(
X = expr.T.values,
obs = coldata,
var = pd.DataFrame(index=expr.index),
)
adata.write_h5ad(f"{DATA_DIR}/tcga_lihc.h5ad")

PBMC 3k(scanpy 内置)

import scanpy as sc
adata = sc.datasets.pbmc3k_processed()
adata.write_h5ad("~/biof3-data/pbmc3k/pbmc3k_processed.h5ad")

任务类型对照表

章节数据任务标签来源label 类型
04TCGA-LIHC二分类tissue_type 列Tumor / Normal
04 进阶TCGA-BRCA5 类多分类PAM50_mRNA 列LumA / LumB / Her2 / Basal / Normal-like
06TCGA-LIHC生存(Cox)OS.time + OS 列(time, event) 配对
07TCGA-BRCA无监督亚型无 (PAM50 用作 ARI 验证)算法发现 N 类
09PBMC 3k单细胞自动注释作者标签 cell_type12+ 免疫细胞类

为什么禁止模拟数据

模拟数据(matrix(rnorm())make_classification())在 ML 教学里有一个隐藏陷阱:所有方法在模拟数据上都看起来很 work。这是因为模拟数据天然满足"特征独立 + 类内同质 + 类间分明"的理想条件,真实生物学数据几乎永远不满足。

具体危险:

  1. 过拟合识别假阳性 — 模拟数据没有 batch effect,你以为模型很稳,真实数据上一旦有批次就崩
  2. 特征选择假阳性 — 模拟数据特征独立,任何特征选择方法都"work";真实数据基因高度共表达,效果完全不同
  3. 跨方法对比无意义 — 模拟数据上 LR / RF / XGB 都 AUC=0.99,你看不出哪个是真好

本专栏的"5 死规则"第一条就是 真实数据(其他四条见 tool-dev 步骤 0)。

常见坑

GDC 下载断点续传不稳 — 用 TCGAbiolinks::GDCdownload(method='client') 比默认 API 模式更稳

TCGA 样本类型容易搞错 — TCGA barcode 第 4 段告诉你是 Tumor(01) 还是 Normal(11)。coldata$shortLetterCode 已经处理好

PAM50 标签来自不同年代不同 schemasubtype_BRCA.mRNA_subtype / PAM50_mRNA / PAM50.mRNA 都见过,处理时统一映射

PBMC 3k 不要从头跑 Cell Ranger — 教程用 Seurat 内置或 10x 公开 H5,跳过 raw fastq

混淆 raw counts 和 vst — 02 章的 derived 数据已经是 vst,直接 read.csv 拿到的是 log-scale 数值,不要再做 log

配套脚本

本章状态

✅ Wave 3 正文完成(2026-05-27)。~/biof3-data/tcga-lihc/derived/ 6 文件已就位(W2-A 阶段完成),后续章节直接读。

AI 陪学

让 AI 陪我学这一篇

AI 会读这篇文章后给你 3-5 步学习计划, 逐步陪你学完,最后出 1-3 道题验证你掌握得怎么样。 登录后 AI 才能记住你的进度。

静态文件

离线资料下载

手册 HTML / PDF 已在后台预生成,点击后直接下载网站静态资源。