单细胞利用机器学习筛选重要基因

本文尝试利用机器学习模型中对特征值的筛选方法,来筛选单细胞中不同亚型中关键的gene。

1. 数据获取:

为方便我们从单细胞分析seurat对象过渡到python分析环境,以下提供seurat 对象转换成H5AD的代码,请参考使用。

# 数据文件格式转换
library(SeuratDisk)
library(Seurat)      
SaveH5Seurat(seurat.obj,filename="test.h5seurat", overwrite = TRUE)
Convert("test.h5seurat", dest = "h5ad", overwrite = TRUE)   

## 数据读取和切分
df = anndata.read("test.h5ad")
X_train, X_test, y_train, y_test = train_test_split(df.X, df.obs.celltype4, random_state=1)

2. 利用随机森林模型选择基因的排序重要性

2.1. 理论背景:随机排列每个特征的值,然后监控模型性能下降的程度。如果获得了更大的下降意味着特征更重要

from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import anndata

rf = RandomForestClassifier(n_estimators=100, random_state=1)
rf.fit(X_train, y_train)
baseline = rf.score(X_test, y_test)
result = permutation_importance(rf, X_test, y_test, n_repeats=10, random_state=1, scoring='accuracy')
importances = result.importances_mean

### 同时,rf模型可以单独输出重要性结果,更加方便
rff = RandomForestClassifier(n_estimators=100, random_state=1)
rff.fit(df.X, df.obs.celltype4)
importances2 = rff.feature_importances_

### 数据保存
import pandas as pd
dff = pd.DataFrame({"a":list(df.var.index),"b" : list(importances)})
dff = dff.sort_values(by="b",ascending=False)
dff.to_csv("frist_importance.csv")

### 可视化
plt.bar(range(len(importances)), importances)
plt.xlabel('Feature Index')
plt.ylabel('Permutation Importance')
plt.show()
rf1.png

2.2. 理论基础:迭代的删除每一个特征,查看模型的准确性下降情况,以推断其特征解释性。

from sklearn.metrics import accuracy_score
import numpy as np

rf3 = RandomForestClassifier(n_estimators=100, random_state=1)
rf3.fit(X_train, y_train)
base_acc = accuracy_score(y_test, rf3.predict(X_test))

importances3 = []
for i in range(X_train.shape[1]):
    X_temp = np.delete(X_train, i, axis=1)
    rf3.fit(X_temp, y_train)
    acc = accuracy_score(y_test, rf3.predict(np.delete(X_test, i, axis=1)))
    importances3.append(base_acc - acc)
 
plt.bar(range(len(importances3)), importances3)
plt.show()

3. 递归去除不重要的特征,以获取到需要的特征数量。

from sklearn.feature_selection import RFE

rf = RandomForestClassifier()
rfe = RFE(rf, n_features_to_select=10)
rfe.fit(df.X, df.obs.celltype4)

print(rfe.ranking_)

4. XGBoost特性重要性

理论基础:计算一个特性用于跨所有树拆分数据的次数。更多的分裂意味着更重要。

import xgboost as xgb

model = xgb.XGBClassifier()
model.fit(df.X, df.obs.celltype4)

importances = model.feature_importances_
importances = pd.Series(importances, index=range(df.X.shape[1]))
importances.plot.bar()

5. 主成分分析 PCA

理论基础:对特征进行主成分分析,并查看每个主成分的解释方差比。在前几个组件上具有较高负载的特性更为重要。注意,该方法不能获取到对应的gene name信息。

from sklearn.decomposition import PCA

pca = PCA()
pca.fit(df.X)

plt.bar(range(pca.n_components_), pca.explained_variance_ratio_)
plt.xlabel('PCA components')
plt.ylabel('Explained Variance')

6. 方差分析 ANOVA

使用f_classif()获得每个特征的方差分析f值。f值越高,表明特征与目标的相关性越强。

from sklearn.feature_selection import f_classif

fval = f_classif(df.X, df.obs.celltype4)
fval = pd.Series(fval[0], index=range(df.X.shape[1]))
fval.plot.bar()

7. 卡方检验

使用chi2()获得每个特征的卡方统计信息。得分越高的特征越有可能独立于目标。

from sklearn.feature_selection import chi2

chi_scores = chi2(df.X, df.obs.celltype4)
chi_scores = pd.Series(chi_scores[0], index=range(df.X.shape[1]))
chi_scores.plot.bar()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容