【影像组学】影像组学特征筛选和降维(T检验+LASSO+PCA)
文章目录
- 1. T 检验
- 2. LASSO 特征筛选
- 3. T 检验结合 LASSO 实现影像组学特征筛选
- 4. 特征降维:主成分分析法 (PCA)
1. T 检验
三种 T 检验
- 单样本 T 检验:检验样本均值与已知总体均值的差异性,要求样本服从正态分布。
- 配对样本 T 检验:检验配对样本均值是否有显著性差异,要求差值服从正态分布,无方差齐性要求。
例:同一组病人术前、术后某指标分布的差异性检验 - 两独立样本 T 检验:检验非配对样本均值是否有显著性差异,要求两样本均服从正态分布,要求方差齐。
例:某指标在不同性别间的分布差异性检验
T 检验在 Python 中实现
- 正态性检查:K-S 检验 (p > 0.05,则服从正态分布), 样本量较大时可不做
• Python 函数:scipy.stats.kstest(sample, cdf = 'norm')
• 函数输出:统计量,p 值 - 方差齐性检验:levene 检验 (p > 0.05,则具有方差齐性)
• Python 函数:scipy.stats.levene(sample1, sample2)
- 两独立样本 T 检验 (p < 0.05 具有显著性差异)
• Python 函数:scipy.stats.ttest_ind(sample1, sample2, equal_var)
• 方差齐 equal_var = Ture,执行 T 检验;否则,equal_var = False,执行 Welch’s 检验 - 不服从正态分布的数据,应使用配对 Wilcoxon 秩和检验
2. LASSO 特征筛选
- LASSO = Least Absolute Shrinkage and Selection Operator,套索算法
- 一种嵌入式特征选择方法
- LASSO 核心原理:把不重要的特征系数变为 0
LASSO 特征筛选时到底干了啥?
3. T 检验结合 LASSO 实现影像组学特征筛选
导入包
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler #用于数据归一化处理 from scipy.stats import ttest_ind, levene # T 检验 方差齐性检验 from sklearn.linear_model import LassoCV from sklearn.utils import shuffle # 数据混序
导入数据
xlsx_a = 'data/featureTable/aa.xlsx' xlsx_b = 'data/featureTable/bb.xlsx' data_a = pd.read_excel(xlsx_a) data_b = pd.read_excel(xlsx_b) print(data_a.shape,data_b.shape) # (212, 30) (357, 30)
t 检验特征筛选
print(levene(data_a['A'], data_b['A'])) # a,b 样本的 A 特征方差齐性检验 # LeveneResult(statistic=90.47705934341127, pvalue=5.279775501703329e-20) # p < 0.05 不符合方差齐性print(ttest_ind(data_a['A'], data_b['A'], equal_var=False)) # Ttest_indResult(statistic=22.208797758464524, pvalue=1.6844591259582747e-64) # p < 0.05,A 特征在 a,b 样本之间存在显著性差异。index = [] for colName in data_a.columns[:]: # 遍历所有特征if levene(data_a[colName], data_b[colName])[1] > 0.05: # 有方差齐性if ttest_ind(data_a[colName], data_b[colName])[1] < 0.05: index.append(colName) # 独立样本 T 检验结果具有显著性差异的加入 index 列表else: # 如果不具有方差齐性,equal_var=Falseif ttest_ind(data_a[colName], data_b[colName], equal_var=False)[1] < 0.05: index.append(colName) print(len(index)) # 25 print(index) # ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'M', 'N', 'P', 'Q', 'R', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD']
t 检验后数据处理
data_a = data_a[index] # T 检验筛选出的有差异的特征建表 data_b = data_b[index] rows_a,cols_a = data_a.shape rows_b,cols_b = data_b.shape# 分组合并 a 和 b 组数据 labels_a = np.zeros(rows_a) # a 加标签为 0(分组) labels_b = np.ones(rows_b) # b 加标签为 1 data_a.insert(0, 'label', labels_a) #分别插入标签 data_b.insert(0, 'label', labels_b) data = pd.concat([data_a,data_b]) # 合并 data = shuffle(data) # 混序 data.index = range(len(data)) # 重新编行号X = data[data.columns[1:]] # x 是数据矩阵(第 0 列是分组) y = data['label'] # y 是分组 X = X.apply(pd.to_numeric, errors='ignore') # 将数据类型转化为数值型 colNames = X.columns #读取特征的名字 X = X.fillna(0) # NaN 值填 0 X = X.astype(np.float64) #转换 float64 类型,防止报 warning X = StandardScaler().fit_transform(X) # 数据矩阵归一化处理(把所有特征的分布压缩在一个可比的范围,以得到可比的特征系数) X = pd.DataFrame(X) X.columns = colNamesprint(data.shape) # (569, 26) print(X.head()) # A B C D E F G \ # 0 -0.473535 -1.503204 -0.541199 -0.505082 -1.611206 -1.211208 -1.024816 # 1 1.551487 1.328837 1.471766 1.524754 0.486752 -0.106715 0.962975 # 2 2.874993 0.211845 3.057588 3.145893 3.440117 3.455973 4.243589 # 3 -0.121357 -0.383884 -0.173371 -0.238305 0.223439 -0.469447 -0.543873 # 4 -0.263364 -0.807410 -0.325363 -0.334435 -0.800631 -0.982274 -1.096530 # # H I K ... U V W X \ # 0 -0.965447 -0.725145 -0.279974 ... -0.637646 -1.517252 -0.715492 -0.609263 # 1 1.075889 -0.542598 0.224594 ... 1.070784 0.860267 0.969195 0.950006 # 2 3.927930 3.079138 3.983947 ... 2.019222 -0.274754 2.193393 2.096165 # 3 -0.446730 -0.290683 -0.584952 ... -0.271110 -0.349662 -0.341978 -0.341181 # 4 -1.177705 -0.655777 -0.775518 ... -0.385006 -0.851221 -0.454568 -0.428374 # # Y Z AA AB AC AD # 0 -1.664826 -1.205453 -1.225520 -1.336990 -1.004247 -0.757302 # 1 0.895629 -0.443803 0.602144 0.487156 -0.983215 -1.276549 # 2 1.632072 1.082296 1.478172 1.677876 0.519703 -0.213673 # 3 -0.546572 -0.761237 -0.470102 -0.362945 -0.619215 -0.794985 # 4 -0.857807 -0.761237 -1.252098 -1.364398 -0.404050 -0.005310 # # [5 rows x 25 columns]
LASSO 特征筛选
alphas = np.logspace(-4,1,50) # alphas 实际上是 λ 值,常量,通过模型优化选择,但可以给定范围,10e-4 到 1 范围内,等分 50 份,以 log 为间隔(以 10 为底,以等差数列中的每个值为指数),取 50 个值。model_lassoCV = LassoCV(alphas = alphas, max_iter = 100000).fit(X,y) # max_iter 最大迭代数coef = pd.Series(model_lassoCV.coef_, index = X.columns) #以 LASSO 计算的系数做一个序列,并以 X.columns 特征名为名称print(model_lassoCV.alpha_) # 选出的最优 alpha 值 0.00040949150623804275 print('%s %d'%('Lasso picked', sum(coef != 0))) # 系数不等于 0 的特殊个数 Lasso picked 21 print(coef[coef != 0]) # 输出系数不等于 0 的名称和相应系数 B -0.034295 # D 0.002491 # E 0.017027 # F 0.184738 # G -0.122652 # H -0.092809 # I 0.001634 # K -0.157311 # M 0.018898 # N 0.086753 # P -0.012537 # Q 0.116439 # R -0.067602 # U -0.516894 # V -0.030768 # X 0.349906 # Y -0.065249 # AA -0.078566 # AB -0.010136 # AC -0.048976 # AD -0.056062 # dtype: float64
4. 特征降维:主成分分析法 (PCA)
主成分分析
- 主成分分析,PCA = Principle component analysis
- 矩阵乘法
◆ 一个 m 行 n 列的矩阵,与一个 n 行 r 列的矩阵相乘(前面的矩阵列数必须与后面的矩阵行数相等,否则不能相乘),将得到一个 m 行 r 列的矩阵: Dm×n × Tn×r = Pm×r
◆ 在影像组学中,m
对应病例数,n
对应原始提取出的特征数,主成分分析法就是 以一个合适 Tn×r 矩阵将 Dm×n 变换为 Pm×r ,这时特征数也就从 n 降到了 r,即r
为降维后的特征数。
- 主成分分析的数学流程
① 将 m 个病例,每个病例已提取 n 个特征,组成 m × n 的矩阵
② 中心化(每个特征都减去该特征在所有病例中的均值,即【影像组学】影像组学特征筛选和降维(T检验+LASSO+PCA)相关推荐
- 影像组学视频学习笔记(23)-主成分析PCA、降维和特征筛选的区别、Li‘s have a solution and plan.
本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(23)主要讲解: 主成分析PCA,影像组学降维和特征筛选的区别 0. PCA(Principal component analysis) ...
- 影像组学视频学习笔记(7)-特征筛选之LASSO回归(代码)、Li‘s have a solution and plan.
本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(7)主要介绍: 特征筛选之LASSO回归分析(代码实现) import pandas as pd import numpy as np ...
- 影像组学视频学习笔记(6)-特征筛选之LASSO回归(理论)、Li‘s have a solution and plan.
本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(6)主要介绍: 特征筛选之LASSO回归分析(理论通俗讲解) LASSO (Least Absolute Shrinkage Selec ...
- 影像组学视频学习笔记(5)-特征筛选之方差选择法、Li‘s have a solution and plan.
本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(5)主要介绍: 特征筛选之方差选择法 针对医疗人员在影像组学研究中碰到的编程问题,李博士建议: 如果有一门编程语言基础的话会比较轻松 先 ...
- Li‘s 影像组学视频学习笔记(10)-T检验+lasso+随机森林、Li‘s have a solution and plan.
本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(10)主要介绍: T检验+lasso+随机森林 李博士借用和女朋友一起吃饭这个实例来说明:爱情和机器学习一样,复杂深奥.难以揣测. im ...
- 影像组学|影像组学导论
前言 "请问特征提取之后我该如何分析?" "我想找出有统计学差异的特征,要用什么统计学方法?" "LASSO的内涵是什么?真的这么厉害?" ...
- iMeta | 俄亥俄州立大学郑庆飞组发表多组学方法研究肿瘤微生物组综述
点击蓝字 关注我们 多组学方法在肿瘤微生物组研究中的应用 原文链接DOI: https://doi.org/10.1002/imt2.73 综 述 ● 2023年1月9日,俄亥俄州立大学郑庆飞团队在 ...
- 易基因:多组学关联分析及组学分子实验验证方法(表观组+转录组+微生物组)|干货系列
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因. 生物过程具有复杂性和整体性,单组学数据难以系统全面解析复杂生理过程的分子调控机制.而多组学(Multi-omics)联合分析可同时实现从 ...
- 西湖大学鞠峰组招聘微生物组学、病毒组学与生物信息学博士后
# 点击蓝字 关注我们 # 课题组介绍 环境微生物组学研究环境中全部微生物及其遗传信息,其方法学基础与理论拓展应用是国际学术前沿和热点,关键科学问题包括:1)如何全面高效定量识别微生物群落? 2)群落 ...
最新文章
- Activity的知识
- 数学图形(2.8)Viviani曲线
- NYOJ 110 剑客决斗
- d3.js 制作简单的贪吃蛇
- 简单的Gradle Web应用程序
- 从零开始的全栈工程师——html篇1.2
- ROS路由器脚本文件编辑更新器
- word2016排版脚注问题
- 机器学习——决策树(ID3)的实现
- 【阿里巴巴】数据开发暑期实习生面试面经 技术面 已凉凉
- springboot 生成二维码
- 计算机基础-打字删除后面的字连同消失是怎么回事
- 宏观经济学和微观经济学
- SQL SERVER 2008 R2 清除数据库日志 sql语句
- 二分搜索树--二叉树
- 中国十大美女最多学校
- 数据可视化的七大趋势
- UI设计的几个基本的设计原则
- 数据处理(一):数据质量分析
- 2021世界区块链大会 | 章鱼网络刘毅金句演讲视频
热门文章
- 影像组学视频学习笔记(23)-主成分析PCA、降维和特征筛选的区别、Li‘s have a solution and plan.