首页 > 其他分享 >R:LASSO 回归特征筛选与路径分析脚本

R:LASSO 回归特征筛选与路径分析脚本

时间:2024-12-15 15:54:05浏览次数:7  
标签:plot 路径分析 字体大小 text element axis 筛选 LASSO size

# 清理环境和加载必要包
rm(list = ls())
setwd("C:\\Users\\Administrator\\Desktop\\machine learning\\LASSO回归\\CAZy") # 设置工作目录
train <- read.table("matched_otu.txt", header = TRUE, row.names = 1, sep = "\t")

############################################## 预处理数据
# 将目标变量转换为因子
train$group <- as.factor(train$group)

# 分离特征和目标变量
x <- as.matrix(train[, -1])  # 特征数据
y <- train$group            # 目标变量

############################################## Lasso 回归及交叉验证
library(glmnet)
library(reshape2)
library(ggplot2)

# 执行 Lasso 回归
set.seed(123)
lasso_cv <- cv.glmnet(x, y, alpha = 1, family = "binomial", type.measure = "class", nfolds = 10)

# 提取最佳 Lambda 值
lambda_min <- lasso_cv$lambda.min  # 最优 lambda
lambda_1se <- lasso_cv$lambda.1se  # 最简化模型的 lambda

cat("最佳 Lambda 值为:", lambda_min, "\n")

# 绘制交叉验证曲线
plot(lasso_cv)

# 提取交叉验证误差数据
cv_data <- data.frame(
  log_lambda = log(lasso_cv$lambda),
  cvm = lasso_cv$cvm,
  cvup = lasso_cv$cvup,
  cvlo = lasso_cv$cvlo
)

# 绘制交叉验证误差图
ggplot(cv_data, aes(x = log_lambda, y = cvm)) +
  geom_point() +
  geom_errorbar(aes(ymin = cvlo, ymax = cvup), width = 0.2) +
  geom_vline(xintercept = log(lambda_min), linetype = "dashed", color = "red") +
  geom_vline(xintercept = log(lambda_1se), linetype = "dashed", color = "blue") +
  labs(title = "Cross-Validation Error Plot", x = "Log(Lambda)", y = "Mean Cross-Validation Error") +
  theme_minimal()

############################################## 提取重要特征
# 使用最佳 lambda 训练 Lasso 模型
lasso_model <- glmnet(x, y, alpha = 1, family = "binomial", lambda = lambda_min)

# 提取非零系数
coefficients <- coef(lasso_model)
important_features <- data.frame(
  Feature = rownames(coefficients)[which(coefficients != 0)],
  Coefficient = coefficients[which(coefficients != 0)]
)

# 移除截距项(如果不需要)
important_features <- important_features[important_features$Feature != "(Intercept)", ]

# 将结果保存为 CSV 文件到当前工作目录
write.csv(important_features, "important_features.csv", row.names = FALSE)

cat("重要特征已保存到 important_features.csv 文件中\n")

############################################## 绘制 LASSO 路径图
# 获取 LASSO 路径数据
lasso_path <- glmnet(x, y, alpha = 1, family = "binomial")

# 提取系数矩阵并转换为普通矩阵
coef_matrix <- as.matrix(lasso_path$beta)  # 每列对应一个 lambda 值

# 转换为长格式数据框
path_data_long <- melt(coef_matrix)
colnames(path_data_long) <- c("Feature", "Lambda_Index", "Coefficient")

# 添加 Lambda 值
path_data_long$Lambda <- lasso_path$lambda[path_data_long$Lambda_Index]

# 绘制美化后的 LASSO 路径图
p1 <- ggplot(path_data_long, aes(x = log(Lambda), y = Coefficient, color = Feature)) +
  theme_minimal(base_size = 14) +  # 设置基本主题和字体大小
  geom_line(size = 1.2) +  # 增加线条粗细
  geom_vline(xintercept = log(lambda_min), linetype = "dashed", color = "#FF4500", size = 1.5) +  # 标注 lambda.min
  geom_vline(xintercept = log(lambda_1se), linetype = "dashed", color = "#00BFFF", size = 1.5) +  # 标注 lambda.1se
  annotate("text", x = max(log(path_data_long$Lambda)) - 2.3, 
           y = max(path_data_long$Coefficient, na.rm = TRUE) * 0.9, 
           label = paste0("lambda.min: ", round(lambda_min, 4)), 
           color = "#FF4500", hjust = 0, size = 5) +  # 在右上角写 lambda.min 信息
  annotate("text", x = max(log(path_data_long$Lambda)) - 2.3, 
           y = max(path_data_long$Coefficient, na.rm = TRUE) * 0.8, 
           label = paste0("lambda.1se: ", round(lambda_1se, 4)), 
           color = "#00BFFF", hjust = 0, size = 5) +  # 在右上角写 lambda.1se 信息
  labs(
    title = "LASSO Coefficient Path",
    x = "Log Lambda",
    y = "Coefficient"
  ) +
  theme(
    legend.position = "none",  # 隐藏图例
    plot.title = element_text(hjust = 0.5, size = 20, face = "bold"),  # 设置标题居中和字体样式
    panel.grid.major = element_blank(),  # 去掉主要网格线
    panel.grid.minor = element_blank(),  # 去掉次要网格线
    axis.line = element_line(size = 1.2, colour = "black"),  # 自定义坐标轴线粗细
    axis.text.x = element_text(size = 16),  # 自定义横坐标刻度标签大小
    axis.text.y = element_text(size = 16),  # 自定义纵坐标刻度标签大小
    axis.title.x = element_text(size = 18),  # 自定义横坐标标题大小
    axis.title.y = element_text(size = 18),  # 自定义纵坐标标题大小
    axis.ticks = element_line(size = 1.2)  # 自定义刻度线粗细
  ) +
  scale_x_continuous(
    breaks = seq(floor(log(min(path_data_long$Lambda))), ceiling(log(max(path_data_long$Lambda))), by = 2),
    labels = round(seq(floor(log(min(path_data_long$Lambda))), ceiling(log(max(path_data_long$Lambda))), by = 2), 1)
  ) +  # 设置自定义横坐标刻度
  scale_color_manual(values = rainbow(length(unique(path_data_long$Feature))))  # 使用彩虹色区分特征

# 显示图
print(p1)

# 保存图像
ggsave('LASSO Path.png', width = 8, height = 8, bg = 'white', dpi = 1200)
###################################################################################
# 绘制美化后的交叉验证误差图
cv_plot <- ggplot(cv_data, aes(x = log_lambda, y = cvm)) +
  theme_minimal(base_size = 14) +  # 设置基本主题和字体大小
  geom_point(size = 3) +  # 调整点的大小
  geom_errorbar(aes(ymin = cvlo, ymax = cvup), width = 0.2, size = 1) +  # 调整误差线粗细
  geom_vline(xintercept = log(lambda_min), linetype = "dashed", color = "#FF4500", size = 1.5) +  # 标注 lambda.min
  geom_vline(xintercept = log(lambda_1se), linetype = "dashed", color = "#00BFFF", size = 1.5) +  # 标注 lambda.1se
  annotate("text", x = min(cv_data$log_lambda) - 1, 
           y = max(cv_data$cvm, na.rm = TRUE) * 1.1, 
           label = paste0("lambda.min: ", round(lambda_min, 4)), 
           color = "#FF4500", hjust = 0, size = 5) +  # 在左上角写 lambda.min 信息
  annotate("text", x = min(cv_data$log_lambda) - 1, 
           y = max(cv_data$cvm, na.rm = TRUE) * 1.07, 
           label = paste0("lambda.1se: ", round(lambda_1se, 4)), 
           color = "#00BFFF", hjust = 0, size = 5) +  # 在左上角写 lambda.1se 信息
  labs(
    title = "Cross-Validation Error Plot",
    x = "Log Lambda",
    y = "Mean Cross-Validation Error"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5, size = 20, face = "bold"),  # 设置标题居中和字体样式
    panel.grid.major = element_blank(),  # 去掉主要网格线
    panel.grid.minor = element_blank(),  # 去掉次要网格线
    axis.line = element_line(size = 1.2, colour = "black"),  # 自定义坐标轴线粗细
    axis.text.x = element_text(size = 16),  # 自定义横坐标刻度标签大小
    axis.text.y = element_text(size = 16),  # 自定义纵坐标刻度标签大小
    axis.title.x = element_text(size = 18),  # 自定义横坐标标题大小
    axis.title.y = element_text(size = 18),  # 自定义纵坐标标题大小
    axis.ticks = element_line(size = 1.2)  # 自定义刻度线粗细
  )

# 显示图
print(cv_plot)

# 保存图像
ggsave('Cross-Validation Error Plot.png', plot = cv_plot, width = 8, height = 8, bg = 'white', dpi = 1200)
###################################################################################
# 读取映射文件
label_map <- read.table("feature_labels.txt", header = FALSE, sep = "\t", stringsAsFactors = FALSE)
colnames(label_map) <- c("Internal_Name", "Readable_Name")  # 设置列名

# 检查映射数据
head(label_map)

# 将重要特征的内部名称替换为可读名称
important_features$Readable_Name <- label_map$Readable_Name[match(important_features$Feature, label_map$Internal_Name)]

# 如果有未映射的特征,保持原名
important_features$Readable_Name[is.na(important_features$Readable_Name)] <- important_features$Feature[is.na(important_features$Readable_Name)]

# 过滤绝对值大于 0.1 的特征
filtered_features <- important_features[abs(important_features$Coefficient) > 0.1, ]

# 绘制系数量化图,使用过滤后的特征
coef_plot <- ggplot(filtered_features, aes(x = reorder(Readable_Name, Coefficient), y = Coefficient, fill = Coefficient > 0)) +
  geom_bar(stat = "identity") +  # 使用条形图
  coord_flip() +  # 翻转坐标轴,水平显示特征
  scale_fill_manual(
    values = c("TRUE" = "#8FC9E2", "FALSE" = "#ECC97F")  # 正系数蓝色,负系数橙色
  ) +
  labs(
    title = "Coefficient Plot (|Coefficient| > 0.1)",
    x = "Feature",
    y = "Coefficient Value"
  ) +
  theme_minimal(base_size = 14) +  # 设置主题和字体大小
  theme(
    plot.title = element_text(hjust = 0.5, size = 20, face = "bold"),  # 标题居中
    axis.text.x = element_text(size = 14),  # 横坐标字体大小
    axis.text.y = element_text(size = 14),  # 纵坐标字体大小
    axis.title.x = element_text(size = 16),  # 横坐标标题字体大小
    axis.title.y = element_text(size = 16),  # 纵坐标标题字体大小
    panel.grid.major = element_blank(),  # 去掉主要网格线
    panel.grid.minor = element_blank(),  # 去掉次要网格线
    axis.line = element_line(size = 1.2, colour = "black"),  # 自定义坐标轴线粗细
    legend.position = "none"  # 隐藏图例
  )

# 显示图
print(coef_plot)

# 保存图像
ggsave('Coefficient_Plot.png', plot = coef_plot, width = 10, height = 8, bg = 'white', dpi = 1200)

 

标签:plot,路径分析,字体大小,text,element,axis,筛选,LASSO,size
From: https://www.cnblogs.com/wzbzk/p/18608058

相关文章

  • R : 数据行匹配与筛选脚本
    #清除工作空间rm(list=ls())#设置工作目录setwd("C:\\Users\\Administrator\\Desktop\\machinelearning\\Heatmap\\CAZy")#读取数据otu<-read.table("TPM.CAZy.raw.txt",sep="\t",header=TRUE,row.names=1)lda<-......
  • 【代码设计】Java 用注解简洁明了的标注数据筛选特性
    基础设计默认值:仅包含正常状态数据,例如账户:不包含离职账户的正常账户即为deletedData=false,wantsEnabled=true,wantsDisabled=false场景举例:场景一:正常的只展示正常的账户,则为默认的情况场景二:只搜索不正常的已经删除的账户,则与上一条完全相反,则为wantsEnabled=......
  • python 筛选目标区域内的站点
    想处理一下黄河流域内的国家站点数据,那么我需要筛选黄河流域内有哪些站点这里涉及到:青海、四川、甘肃、宁夏、陕西、内蒙、山西、河南、山东有这些省的所有国家站列表,但是需要筛出黄河流域内的站点我用文心一言查了查代码,py使用的是3.9,代码和文心一言给出的有点出入,尤其是使用:s......
  • 无痕检测是否注册iMessage服务,iMessages数据筛选,iMessage蓝号检测协议
    一、实现iMessage蓝号数据筛选的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写协议......
  • 质数-质数筛选、质因数分解、互质判定
    质数筛选对于一个正整数N,一次性求出 1~N 之间所有的质数,即为质数筛选。显然根据上述「质数判定」的内容,我们可以通过枚举 1~N 的所有数,再依次使用「试除法」来判定其是否为质数,从而完成质数的筛选。但此种方法的时间复杂度过高,为 O(N√N) 。质数筛选经典方法:「Eratosthene......
  • 筛选器命令FF(Find)
    命令名称:FFFind重复Find功能需求:选中一个图元,判断其所属图层,再次指定区域,亮现区域内所有此图层的图元思路:建立2个选择集SS存源图元不喜欢点选图元就框选通过(ssget)获得源图元图层SSS存符合条件的区域图元AUTOLISP实现(DEFUNC:TE(/SSenENDATAENLAYERl......
  • 查询数据的筛选
    1在input框中模糊查处输入的内容input框失去焦点点击查看代码exportfunctionfuzzyQuery(list,keyWord){console.log('要筛选的数据',list)console.log('筛选的关键词',keyWord)vararr=[];for(vari=0;i<list.length;i++){if(list[i].na......
  • 埃拉托斯特尼筛法(筛选素数)
    要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。算法思想:先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......//埃拉托斯特尼筛法,生成所有小......
  • 防范信息流过载不仅是减少信息的数量,更在于提升对信息的处理能力和选择性。通过设定信
    信息流过载(informationoverload)是指个体面对大量、快速流动的信息时,感到无法有效处理、消化或应用这些信息,导致决策困难、压力增加和工作效率下降。现代社会的信息量庞大,尤其在数字化时代,信息流过载已成为普遍的挑战。要有效防范信息流过载,可以采取以下策略:1. 设定信息消费的边......
  • 操作筛选器的 1 个应用实例:自动启用事务
    前言在数据库操作过程中,有一个概念是绕不开的,那就是事务。事务能够确保一系列数据库操作要么全部成功提交,要么全部失败回滚,保证数据的一致性和完整性。在Asp.NetCoreWebAPI中,我们可以使用操作筛选器给所有的数据库操作API加上事务控制,省心又省力,效果还很好。看看Step......