CellTypist 自动注释 — 机器学习驱动的单细胞类型自动标注工具
一句话说明
CellTypist 是一个基于逻辑回归和多数投票的自动细胞类型注释工具,内置超过 40 个预训练模型,覆盖免疫细胞、肠道细胞、心脏细胞等多种组织类型,可在几分钟内完成数十万细胞的精准注释。
安装与配置
# 激活单细胞分析环境
conda activate scanpy_env
# 安装 CellTypist(最新版)
pip install celltypist
# 验证安装
python -c "import celltypist; print(celltypist.__version__)"
# 下载所有预训练模型(约 500MB,首次使用推荐)
celltypist --update-models # 更新所有模型到最新版本
# 或在 Python 中下载
python -c "import celltypist; celltypist.models.download_models(force_update=True)"
核心用法
import celltypist # 导入 CellTypist
from celltypist import models # 模型管理模块
import scanpy as sc # Scanpy 配合使用
# ── 查看可用的预训练模型 ──────────────────────────────
models.models_description() # 打印所有预训练模型及其描述
# 主要预训练模型:
# Immune_All_High.pkl → 人类免疫细胞(粗分辨率),覆盖主要免疫细胞类型
# Immune_All_Low.pkl → 人类免疫细胞(细分辨率),覆盖亚群
# Adult_Mouse_Gut.pkl → 小鼠肠道细胞
# Human_Intestinal_*.pkl → 人类肠道细胞
# Healthy_COVID19_PBMC.pkl → PBMC(含 COVID-19 状态)
# ── 基础注释 ──────────────────────────────────────────
# 读取已预处理的数据(adata.X 需要是 log1p 标准化后的数据)
adata = sc.read_h5ad('preprocessed.h5ad')
# 确保数据已 log1p 标准化(CellTypist 要求)
# 如果没有标准化,先做:
sc.pp.normalize_total(adata, target_sum=1e4) # 标准化
sc.pp.log1p(adata) # log 变换
# 运行自动注释
predictions = celltypist.annotate(
adata, # 输入数据(AnnData 对象)
model='Immune_All_High.pkl', # 选择预训练模型
majority_voting=True # 使用多数投票(利用聚类提高精度)
)
参数详解
| 参数 | 说明 | 建议值 |
|---|
model | 预训练模型名称或路径 | 根据组织类型选择 |
majority_voting | 开启多数投票(基于聚类的结果一致化) | True |
over_clustering | 过度聚类分辨率(多数投票前的初始聚类) | "leiden_0.8" |
min_prop | 多数投票中的最低比例阈值 | 0 |
p_thres | 预测置信度阈值(低于此标记为 Unassigned) | 0.5 |
实战案例
import celltypist
from celltypist import models
import scanpy as sc
import matplotlib.pyplot as plt
import pandas as pd
# ── 完整自动注释流程 ──────────────────────────────────
# 1. 数据预处理(CellTypist 要求 log1p 标准化)
adata = sc.read_h5ad('raw_single_cell.h5ad')
sc.pp.normalize_total(adata, target_sum=1e4) # 归一化到 10000
sc.pp.log1p(adata) # log(x+1) 变换
# 先做聚类(为多数投票提供基础)
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
sc.pp.scale(adata)
sc.tl.pca(adata)
sc.pp.neighbors(adata)
sc.tl.umap(adata)
sc.tl.leiden(adata, resolution=2.0) # 高分辨率预聚类(多数投票用)
# 2. 查看并选择合适的模型
print("可用模型列表:")
print(models.models_description())
# 3. 运行自动注释(PBMC/免疫细胞示例)
predictions = celltypist.annotate(
adata,
model='Immune_All_Low.pkl', # 细分辨率免疫细胞模型
majority_voting=True, # 启用多数投票
over_clustering='leiden', # 基于 leiden 聚类投票
min_prop=0.0 # 不过滤低比例标签
)
# 4. 将预测结果写入 AnnData 对象
adata = predictions.to_adata() # 返回添加了注释的 adata
# 新增的列:
# adata.obs['predicted_labels'] → 单细胞级别的预测(逻辑回归直接输出)
# adata.obs['over_clustering'] → 预聚类标签(Leiden 结果)
# adata.obs['majority_voting'] → 多数投票后的细胞类型(推荐使用这个)
# adata.obs['conf_score'] → 每个预测的置信度分数
print("\n预测细胞类型分布(多数投票结果):")
print(adata.obs['majority_voting'].value_counts())
# 5. 可视化注释结果
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
sc.pl.umap(
adata,
color='majority_voting', # 多数投票注释(更稳健)
title='CellTypist 自动注释(多数投票)',
legend_loc='on data',
legend_fontsize=8,
ax=axes[0], show=False
)
sc.pl.umap(
adata,
color='conf_score', # 置信度分布
title='预测置信度',
color_map='RdYlGn', # 绿色=高置信,红色=低置信
ax=axes[1], show=False
)
plt.tight_layout()
plt.savefig('celltypist_annotation.pdf', dpi=150, bbox_inches='tight')
# 6. 过滤低置信度细胞(可选)
high_conf_mask = adata.obs['conf_score'] > 0.5 # 置信度 >0.5
adata_filtered = adata[high_conf_mask].copy()
print(f"\n高置信度细胞数:{high_conf_mask.sum()}/{len(adata)}")
print(f"过滤掉:{(~high_conf_mask).sum()} 个低置信度细胞")
# 7. 与 Leiden 聚类对比(检查注释合理性)
# 计算每个 Leiden cluster 的主要细胞类型
cluster_ct = pd.crosstab(
adata.obs['leiden'],
adata.obs['majority_voting'],
normalize='index' # 按行归一化,显示各类型比例
) * 100 # 转换为百分比
print("\n各 Leiden cluster 的细胞类型组成(%):")
print(cluster_ct.round(1).to_string())
# 8. 训练自定义模型(如果内置模型不适合)
# 准备训练数据(需要已知细胞类型标注)
adata_train = sc.read_h5ad('labeled_reference.h5ad') # 有标注的参考数据
sc.pp.normalize_total(adata_train, target_sum=1e4)
sc.pp.log1p(adata_train)
# 训练自定义模型
new_model = celltypist.train(
adata_train,
labels='cell_type', # 标注列名
n_jobs=8, # 并行线程数
max_iter=200, # 最大训练迭代次数
use_SGD=True, # 使用随机梯度下降(加速)
feature_selection=True # 自动特征选择(减少过拟合)
)
# 保存自定义模型
new_model.write('my_custom_model.pkl')
print("自定义模型保存完成!")
# 9. 保存最终结果
adata.write_h5ad('celltypist_annotated.h5ad')
常见报错与解决
| 报错 | 原因 | 解决方法 |
|---|
Model not found | 模型未下载 | celltypist.models.download_models() |
注释结果全是 Unassigned | 数据未 log 标准化 | 先做 normalize_total + log1p |
over_clustering key not found | 未做聚类 | 先 sc.tl.leiden(adata) |
| 预测精度低 | 模型选错物种/组织 | 选择更匹配的模型 |
| 内存不足 | 细胞数 >50 万 | 批量处理:每次 10 万细胞 |
速查表
# 安装
# pip install celltypist
# 三行完成注释
import celltypist
predictions = celltypist.annotate(adata, model='Immune_All_High.pkl',
majority_voting=True)
adata = predictions.to_adata()
# 查看所有模型
celltypist.models.models_description()
# 常用模型
# 免疫细胞(人):Immune_All_High.pkl / Immune_All_Low.pkl
# 肠道细胞(人):Human_Colon_Cancer_*.pkl
# PBMC:Healthy_COVID19_PBMC.pkl
# 小鼠:Adult_Mouse_Gut.pkl