跳转至

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