期刊复现:机器学习(ML)驱动的关键特征识别利用LASSO+SVM-RFE+RF筛选关键基因

机器学习算法推荐算法

picture.image

✨ 欢迎关注Python机器学习AI ✨

本节介绍:机器学习(ML)驱动的关键特征识别利用LASSO+SVM-RFE+RF筛选关键基因,数据采用模拟数据无任何现实意义,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。完整数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的学习工具~!

✨ 论文信息 ✨

picture.image

picture.image

picture.image

文献描述了一个使用机器学习方法进行特征筛选的过程。首先使用 LASSO (最小绝对收缩和选择算子) 回归方法,从数据中筛选出与目标最相关的特征。然后,通过 支持向量机(SVM)递归特征消除 (SVM-RFE) 方法进一步优化特征的选择。接着,采用 随机森林(RF) 算法来对特征进行筛选。最终,通过这三种不同的机器学习算法筛选出的交集特征被定义为 "核心UC-PET-MP子集"。这个过程通过交叉验证来确保筛选出的特征在预测模型中具有稳定和有效的表现

✨ 模拟实现 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
import warnings  
# 忽略所有警告  
warnings.filterwarnings("ignore")  
  
path = r"2025-11-15公众号Python机器学习AI.xlsx"  
df = pd.read_excel(path)  
from sklearn.model_selection import train_test_split  
# 划分特征和目标变量  
X = df.drop(['fustat'], axis=1)    
y = df[['fustat']]    
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(  
    X,    
    y,   
    test_size=0.3,   
    random_state=42,  
    stratify=df['fustat']  
)

加载一个包含基因相关信息的模拟数据集,并将数据分为特征和目标变量,用于机器学习模型的训练与测试,目标变量为

fustat (模拟生存状态)

  
from sklearn.preprocessing import StandardScaler  
  
# 创建标准化器  
scaler = StandardScaler()  
# 使用训练集的特征拟合标准化器,并对训练集进行转换  
X_train_scaled = scaler.fit_transform(X_train)  
# 将标准化后的 X_train 转换为 DataFrame,并保持列名  
X_train_scaled = pd.DataFrame(X_train_scaled, columns=X_train.columns)  
# 使用相同的标准化器对测试集进行转换  
X_test_scaled = scaler.transform(X_test)  
# 将标准化后的 X_test 转换为 DataFrame,并保持列名  
X_test_scaled = pd.DataFrame(X_test_scaled, columns=X_test.columns)

对训练集和测试集的特征进行标准化,为接下来的LASSO特征筛选做准备,但对于一些非线性的机器学习模型(树模型),标准化可能不会显著影响模型性能,因此也可以选择不进行标准化,标准化并不是机器学习必须要做的一个步骤

  
from sklearn.linear_model import LogisticRegression  
from sklearn.metrics import roc_auc_score  
from sklearn.model_selection import StratifiedKFold  
  
# 定义 λ 值和对应的 C  
lambdas = np.logspace(-3, 1, 100)  
Cs = 1 / lambdas  
  
# 初始化 10 折交叉验证器  
cv = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)  
...  
  
plt.figure(figsize=(10, 6))  
plt.errorbar(np.log10(results_df['lambda']), results_df['Mean AUC'], yerr=results_df['AUC Std'], fmt='o', color='red', ecolor='gray', capsize=3)  
best_row = results_df.loc[results_df['Mean AUC'].idxmax()]  
best_lambda_log = np.log10(best_row['lambda'])  
plt.axvline(best_lambda_log, linestyle='--', color='#87CEFA', label=r'$\lambda_{best}$')  
plt.xlabel(r'log ($\lambda$)', fontsize=18, weight='bold')  
plt.ylabel('AUC', fontsize=18, weight='bold')  
plt.xticks(fontsize=18, weight='bold', rotation=45)  
plt.yticks(fontsize=18, weight='bold')  
plt.legend()  
plt.savefig("lasso-1.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.tight_layout()  
plt.show()

picture.image

通过10 交叉验证对LASSO正则化的逻辑回归模型进行训练和评估,计算不同λ值下的AUC,并绘制λ与AUC的关系图,帮助选择最佳的λ值

  
from matplotlib.font_manager import FontProperties  
import matplotlib.cm as cm  
  
plt.figure(figsize=(12, 6))  
  
num_features = coef_df.shape[1]  
cmap = cm.get_cmap('tab20b', num_features)    
colors = [cmap(i) for i in range(num_features)]  
# 公众号:Python机器学习AI  
for i, col in enumerate(coef_df.columns):  
    plt.plot(coef_df.index, coef_df[col], label=col, color=colors[i], linewidth=1.5)  
  
best_lambda = results_df.loc[results_df['Mean AUC'].idxmax(), 'lambda']  
plt.axvline(np.log10(best_lambda), linestyle='--', color='#87CEFA', linewidth=2, label=r'$\lambda_{best}$')  
  
plt.axhline(0, color='black', linestyle='-', linewidth=1)  
  
plt.xlabel('log($\\lambda$)', fontsize=16, weight='bold')  
plt.ylabel('Coefficient', fontsize=16, weight='bold')  
plt.xticks(fontsize=14, weight='bold')  
plt.yticks(fontsize=14, weight='bold')  
plt.grid(False)  
  
bold_font = FontProperties(weight='bold', size=10)  
plt.savefig("lasso-2.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.tight_layout()  
plt.show()

picture.image

根据最佳λ值绘制LASSO回归模型中各个特征的系数变化曲线,并剔除系数为0的特征,以确定最终的特征选择,对于LASSO进行特征筛选的工作原理是如何进行的参考往期文章——期刊复现:如何正确使用LASSO进行二分类特征选择?避开常见误区,掌握实用技巧

  
X\_train\_scaled[selected\_features.index]

picture.image

从标准化后的训练集X_train_scaled中选择经过LASSO特征选择后对应的特征列

  
from sklearn.svm import SVC  
from sklearn.feature_selection import RFECV  
  
# 使用 SVM 作为 estimator  
svm = SVC(kernel='linear', random_state=42)  
  
# 设置 RFECV  
rfecv = RFECV(  
    estimator=svm,  
    step=1,       # 每次去掉一个特征  
    cv=10,         # 交叉验证折数  
    scoring='roc_auc',  # 使用 ROC AUC 作为评分标准  
    n_jobs=-1      # 并行处理  
)  
  
# 拟合 RFECV  
rfecv.fit(X_train_scaled, y_train)  
  
# 输出结果:最佳特征数量  
print("RFECV 最佳特征数量:", rfecv.n_features_)  
  
# 获取 RFECV 选出的最终特征名  
selected_features = X_train_scaled.columns[rfecv.support_]  
  
print("\nRFECV 选出的最终特征:")  
print(selected_features)

使用支持向量机(SVM)和递归特征消除交叉验证(RFECV)方法,通过ROC AUC评分标准,自动选择出最佳数量的特征,并输出最终选出的特征名称,这里考虑到模型为SVM同样使用的是标准化后的数据

  
RFECV 最佳特征数量: 13  
RFECV 选出的最终特征:  
Index(['GSM1620820', 'GSM1620821', 'GSM1620822', 'GSM1620827', 'GSM1620828',         'GSM1620834', 'GSM1620839', 'GSM1620842', 'GSM1620843', 'GSM1620846',         'GSM1620850', 'GSM1620859', 'GSM1620862'],  
      dtype='object')

结果表示通过 RFECV方法,最终选择13个特征(如 'GSM1620820'、'GSM1620821' 等),这些特征在SVM模型中能提供最佳的预测性能,这里直接是通过RFECV函数进行的特征选择,如果为了使得选择过程更透明可参考递归特征选择原理进行自定义实现,参考往期文章——期刊复现:基于递归特征筛选的XGBoost、RSF、COX、GBSA与SSVM生存分析模型性能提升,当然还有更多灵活使用递归特征选择的文章,读者可通过历史文章自行检索

对于小样本数据,使用K折交叉验证时,每一折的样本数量较少,可能导致模型筛选结果的不稳定性和波动。因为每次训练和验证的数据划分不同,样本量不够大使得每折的表现可能存在较大差异,进而影响特征选择的稳定性。增加样本量或尝试不同的折数设置可以有助于提高模型的稳定性和结果的可靠性

  
from sklearn.ensemble import RandomForestClassifier  
  
rf = RandomForestClassifier(random_state=42, n_estimators=500)  
rf.fit(X_train, y_train)  
import matplotlib.cm as cm  
  
# 获取特征重要性  
feature_importances = rf.feature_importances_  
# 获取特征名称  
feature_names = X_train.columns  
# 按重要性排序,取前16个特征  
sorted_idx = np.argsort(feature_importances)[::-1][:30]  
  
# 创建颜色映射  
norm = plt.Normalize(vmin=np.min(feature_importances[sorted_idx]), vmax=np.max(feature_importances[sorted_idx]))  
cmap = cm.viridis  # 使用viridis colormap,你可以根据需要选择其他colormap  
  
plt.figure(figsize=(10, 6))  
  
# 绘制每个特征的棒棒糖图(将每个特征的重要性画为一个点,并用线条连接)  
for i in range(len(sorted_idx)):  
    plt.plot([0, feature_importances[sorted_idx[i]]], [i, i], color='black', linewidth=2)  # 线条  
    plt.scatter(feature_importances[sorted_idx[i]], i,   
                color=cmap(norm(feature_importances[sorted_idx[i]])), s=100, zorder=5)  # 圆点,带颜色映射  
# 添加一条红色实线  
plt.axvline(x=0.025, color='red', linewidth=2, linestyle='-')  
  
# 设置特征名称  
plt.yticks(np.arange(len(sorted_idx)), feature_names[sorted_idx], fontsize=13, fontweight='bold')  
plt.xlabel('IncNodePurity', fontsize=13, fontweight='bold')  
plt.xticks(fontsize=13, fontweight='bold')  
plt.gca().invert_yaxis()  
ax = plt.gca()  
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)  
sm.set_array([])  # 设置空的array,以便绘制颜色条  
plt.colorbar(sm, ax=ax, shrink=0.8)  
plt.tight_layout()  
plt.savefig("importance of Variables for top 30 gens.pdf",   
            format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

使用随机森林模型计算特征重要性,绘制前30个特征的棒棒糖图,展示每个特征的重要性值,添加红色实线作为阈值

红色实线作为阈值,表示小于该阈值的特征贡献度较低,可以被剔除,而大于该阈值的特征则被认为是贡献度较高且具有显著性差异的特征,因此会被保留下来。值得注意的是,这个阈值是人为设定的,并不代表一种常见的实践。在实际应用中,通常会利用随机森林模型得到特征的排名,再通过递归特征消除(RFECV)等方法进行特征筛选,而不是仅凭借一个人为设定的贡献度阈值来直接剔除特征

  
# 获取所有特征重要性大于0.025的特征  
important_features = feature_names[feature_importances > 0.025].tolist()

筛选出所有特征重要性大于0.025的特征,即经过RF所保留的特征

  
from matplotlib_venn import venn3  
  
plt.figure(figsize=(8, 8))  
venn = venn3([rf, SVM_RFE, LASSO], set_labels=('RF', 'SVM-RFE', 'LASSO'))  
# 设置集合标签的字体大小和加粗  
for label in venn.set_labels:  
    label.set_fontsize(18)  
    label.set_fontweight('bold')  
  
# 设置交集标签的字体大小和加粗  
for label in venn.subset_labels:  
    if label is not None:  # 确保标签不为空  
        label.set_fontsize(18)  
        label.set_fontweight('bold')  
  
plt.title("Feature Selections (RF, SVM-RFE, LASSO)", fontsize=18, fontweight='bold')  
plt.tight_layout()  
plt.savefig("Feature Selections (RF, SVM-RFE, LASSO).pdf",   
            format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

绘制一个包含RF、SVM-RFE和LASSO特征选择方法交集的韦恩图,结果显示每个方法单独选择的特征数量以及它们的交集部分,即三者共同选择的特征数量

  
# 获取三者的共同交集特征  
common_features = rf & SVM_RFE & LASSO  
  
# 打印出共同特征  
print("共同选择的特征:", common_features)

最终输出RF、SVM-RFE和LASSO三个特征选择方法之间的共同交集特征,即它们共同选择的特征

  
共同选择的特征: {'GSM1620850', 'GSM1620846', 'GSM1620827', 'GSM1620862', 'GSM1620859'}

最后值得强调的是,取交集的做法并不是为了最大化模型的性能,因为不同的特征筛选方法(如 RF、SVM-RFE、LASSO)具有不同的原理,导致筛选结果会有所不同。更多的是为了后续的特征解释,交集反映了多个特征选择方法都选中了这些特征,显示它们在模型构建中的重要性,而不是为了模型性能达到最高

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到公众号后台获取作者的公众号合集。截至目前为止,合集已包含300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 合集获取 ✨

picture.image

欢迎到公众号后台,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!

✨ 赠书活动 ✨

picture.image

支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《DeepSeek高效数据分析从数据清洗到行业案例》这本精彩书籍📚!

💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!

✨ AI工具推荐 ✨

picture.image

往期推荐

期刊配图:模型SHAP解释特征类别柱状图、饼图与蜂巢图的组合展示

期刊复现:基于自动机器学习的预测模型构建及其残差和部分依赖分析

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况最优模型的SHAP解释

期刊复现:单变量特征降维与共线性分析结合RFE集成排名进行特征筛选下的组合拳流程

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况优化与最优模型选择可视化

期刊复现:基于相关系数与AUC值优化特征选择剔除冗余特征精简模型(附代码)

期刊复现:如何正确使用LASSO进行二分类特征选择?避开常见误区,掌握实用技巧

期刊复现:融合聚类与多分类转二分类的亚型可解释SHAP机器学习模型构建

期刊复现:基于LightGBM、XGBoost与RF的Lasso回归堆叠模型在连续和分类特征上的模型解释

期刊复现:基于LightGBM、XGBoost与RF的堆叠模型贝叶斯优化调参与Lasso回归元模型,结合10倍交叉验证

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论