机器学习01 | 逻辑回归(Logistic Regression)

在生信分析任务中,我们常常面临这样的问题:

给定一组样本的基因表达信息,能否预测它们属于疾病组还是对照组?

这种问题,本质上就是一个典型的二分类任务 ——每个样本要么是“0”(正常),要么是“1”(疾病)。在众多有监督的方法里,逻辑回归(Logistic Regression)是最基础、最经典、同时也是最常用的一个。它的思想简单且明确:

  • 通过一个线性组合,将基因表达与样本分类联系起来

  • 再利用一个 S 形函数(Sigmoid) 把结果转化为概率

  • 最终输出的概率就能告诉我们,一个样本更像是“疾病”还是“正常”

逻辑回归不仅能完成分类任务,还能提供特征的可解释性,逻辑回归的系数能反映基因对分类结果的贡献,从而帮助我们找到可能与疾病发生相关的候选基因,揭示潜在的生物学机制。

模型原理

Step1:线性组合

基因表达量就是每个样本的特征,首先把所有基因的表达量加权组合,构建一个线性模型。

Step2:非线性变换(Sigmoid 函数)

问题来了,计算出来的Z可以是任意实数(-∞ ~ +∞),但我们需要一个概率,必须落在 [0,1] 之间,所以,我们用一个 S 形函数 (Sigmoid) 来把它转化为概率:

Sigmoid 的形状:

当 z→+∞,输出接近 1(样本更可能是疾病)。

当 z→−∞,输出接近 0(样本更可能是正常)。

当 z=0,输出正好 0.5(模型不确定)

Step3:模型训练

通过最大化似然函数(Maximum Likelihood Estimation, MLE),找到一组最合适的 β 系数,让疾病样本的预测概率尽可能接近 1,正常样本的预测概率尽可能接近 0。

建立完模型之后,此时输入一个新的样本,根据基因表达,计算出Z值,转换成预测概率,然后通常我们会设定一个阈值(默认为0.5)

  • 如果概率 ≥ 0.5 → 预测为疾病组 (1)

  • 如果概率 < 0.5 → 预测为正常组 (0)

根据逻辑回归模型的β参数,不仅能预测新的样本标签,还能解释基因的意义

  • β参数>0:说明该基因表达升高会增加患病概率

  • β参数<0:说明该基因表达升高会降低患病概率

  • β参数越大,说明该基因在分类中越重要

代码实现

进行训练的数据,每一行是一个样本,每一列是基因的表达值,然后需要有一列Group,告诉模型每个样本属于那一组

训练完模型之后,想用模型对新数据进行预测,切记输入的数据需要有相同的基因列名(顺序不重要,但列名必须对应)!!!

# 逻辑回归fit <- glm(group ~ ., data = expr, family = binomial)# 用模型进行预测#相同的基因列名(顺序不重要,但列名必须对应)prob <- predict(fit, newdata = new_sample, type = "response")# 按阈值分类pred <- ifelse(prob > 0.5, "trt", "untrt")table(Predicted = pred, Actual = expr$group)#查看基因系数library(ggplot2)coef_df <- data.frame(Gene = names(coef(fit))[-1],                      Estimate = coef(fit)[-1])ggplot(coef_df, aes(x=reorder(Gene, Estimate), y=Estimate, fill=Estimate > 0)) +  geom_bar(stat="identity") +  coord_flip() +  labs(title="Logistic Regression Coefficients", y="Coefficient (log-odds)"

根据这个图,ENSG00000134686系数最大,说明他是trt组(疾病组)影响最大,反之ENSG00000179094是untrt组的强标记,我演示的数据只有8个样本,但是我用了十个基因,所以有些基因的系数不收敛,所以是NA,优化绘图如下:

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容