基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比

机器学习算法数据库

picture.image

背景

mRMR(最小冗余最大相关)是一种特征选择算法,旨在从大量特征中选择对目标变量最相关且彼此冗余最小的特征。通过计算每个特征与目标变量的相关性和特征之间的冗余性,mRMR平衡两者,确保选出的特征既能最大化目标变量的解释力,又避免信息重复,这种方法尤其适用于高维数据分析场景

mRMR通常假设因变量(目标变量)是分类离散变量,因为其核心计算基于互信息,互信息本质上是用于衡量两个变量之间的相关性,特别适合分类问题。如果目标变量是连续型变量,需要先对目标变量进行离散化(如分箱处理),将其转化为离散类别后再使用mRMR,对于纯回归任务,mRMR并不是最佳选择,推荐使用其他方法,在接下来的代码实现中展示其实现的过程

代码实现

数据读取


          
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
          

          
df = pd.read_excel("2024-12-22公众号Python机器学习AI.xlsx")
      

导入数据并设置绘图的字体和样式,其中数据的目标变量是分类变量,适用于分类任务的分析和处理

使用mRMR算法筛选关键特征


          
import pymrmr
          
# 将目标列放在第一列(pymrmr 要求的格式)
          
target = df.columns[-1]
          
df_reordered = df[[target] + [col for col in df.columns if col != target]]
          

          
# 使用 pymrmr 进行 mRMR 特征筛选
          
# 'MIQ' 模式,选择前 10 个重要特征
          
k = 3
          
selected_features = pymrmr.mRMR(df_reordered, 'MIQ', k)
          

          
# 输出筛选结果
          
print(f"筛选出的前 {k} 个重要特征为:")
          
print(selected_features)
      

picture.image

通过pymrmr库使用mRMR算法(在 "MIQ" 模式下)从数据中筛选出人为指定数量(k=3)的关键特征,但mRMR无法直接确定最优特征数,需要预先设定特征数量,mRMR支持MIQ(Quotient)和MID(Difference)两种模式,前者通过相关性与冗余的比值评估特征,适合平衡特征贡献的场景,后者通过相关性减去冗余性评估特征,更直接但对冗余的惩罚可能不足

基于mRMR筛选和递归特征选择的多模型性能评估与AUC对比


          
from sklearn.metrics import roc_auc_score
          
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, AdaBoostClassifier
          
from xgboost import XGBClassifier
          
from lightgbm import LGBMClassifier
          
from catboost import CatBoostClassifier
          
from sklearn.model_selection import train_test_split
          

          
# 划分特征和目标变量
          
X = df.drop(['y'], axis=1)
          
y = df['y']
          
# 划分训练集和测试集
          
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 
          
                                                    random_state=42, stratify=df['y'])
          

          
# 定义模型
          
models_init = {
          
    "RandomForest": RandomForestClassifier(random_state=42),
          
    "GradientBoosting": GradientBoostingClassifier(random_state=42),
          
    "XGBoost": XGBClassifier(use_label_encoder=False, eval_metric="logloss", random_state=42),
          
    "LightGBM": LGBMClassifier(random_state=42, verbose=-1),
          
    "CatBoost": CatBoostClassifier(verbose=0, random_state=42),
          
    "AdaBoost": AdaBoostClassifier(random_state=42, algorithm='SAMME')
          
}
          

          
# 创建保存结果的列表
          
results = []
          

          
# 递归特征选择并训练模型
          
for num_features in range(1, len(ranked_features) + 1):  # 从 1 个特征到所有特征
          
    row = {"Number_of_Features": num_features}
          
    
          
    # 遍历每个模型
          
    for model_name, model_init in models_init.items():
          
        try:
          
            # 获取当前模型的前 num_features 个特征
          
            top_features = ranked_features[:num_features]
          
            
          
            # 使用这些特征重新训练模型
          
            X_train_subset = X_train[top_features]
          
            X_test_subset = X_test[top_features]
          
            
          
            # 重新初始化并训练模型
          
            model = model_init
          
            model.fit(X_train_subset, y_train)
          
            
          
            # 在测试集上预测并计算 AUC
          
            if hasattr(model, "predict_proba"):
          
                y_pred = model.predict_proba(X_test_subset)[:, 1]  # 获取预测概率
          
            else:
          
                y_pred = model.predict(X_test_subset)  # 如果没有 `predict_proba`,直接用预测值
          
            
          
            auc_score = roc_auc_score(y_test, y_pred)  # 计算AUC
          
        except Exception as e:
          
            print(f"Error for model {model_name} with {num_features} features: {e}")
          
            auc_score = np.nan  # 如果出现问题,设置为NaN
          
        
          
        row[model_name] = auc_score  # 保存 AUC 值
          
    
          
    # 保存每次特征选择的结果
          
    results.append(row)
          

          
results_df = pd.DataFrame(results)
          
results_df
      

picture.image

通过结合mRMR筛选特征的排序结果与递归特征选择,逐步增加特征数量并评估多种模型的 AUC性能,从而间接解决了mRMR无法直接确定最优特征数量的问题,通过模型性能来选择最佳特征数

可视化递归特征选择的多模型AUC曲线与最优特征定位

picture.image

通过可视化递归特征选择中不同特征数量下的模型AUC表现,筛选并排序特征数量范围,绘制多模型AUC曲线,并标注最优特征数量及其对应的模型和AUC值,直观呈现最优特征选择结果,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系, 从图中可以看出,选择8个特征时性能最佳,对应的最优模型是CatBoost,其AUC分数达到了0.9244

基于最优特征和全特征的CatBoost模型性能对比分析


          
# 提取所需的 8 个特征
          
selected_features = ranked_features[:8]  # 替换为你选择的特征名称
          

          
# 选择数据中对应的特征和目标变量
          
X = df[selected_features]  
          
y = df["y"]  
          
X_train, X_test, y_train, y_test = train_test_split(
          
    X, y, test_size=0.2, random_state=42, stratify=y
          
)
          

          
# 初始化并训练 CatBoost 模型
          
catboost_model = CatBoostClassifier(verbose=0, random_state=42)
          
catboost_model.fit(X_train, y_train)
          

          
# 在测试集上进行预测
          
y_pred_proba = catboost_model.predict_proba(X_test)[:, 1]  # 获取正类概率
          
y_pred = catboost_model.predict(X_test)
          
auc_score = roc_auc_score(y_test, y_pred_proba)
          
print(f"AUC Score: {auc_score:.4f}")
          
from sklearn.metrics import classification_report
          
print("\nClassification Report:")
          
print(classification_report(y_test, y_pred))
      

picture.image


          
# 提取整体数据集的所有特征和目标变量
          
X = df.drop(columns=["y"]) 
          
y = df["y"]  
          

          
# 划分训练集和测试集
          
X_train, X_test, y_train, y_test = train_test_split(
          
    X, y, test_size=0.2, random_state=42, stratify=y
          
)
          

          
# 初始化并训练 CatBoost 模型(使用所有特征)
          
catboost_model = CatBoostClassifier(verbose=0, random_state=42)
          
catboost_model.fit(X_train, y_train)
          
y_pred_proba = catboost_model.predict_proba(X_test)[:, 1]  # 获取正类的概率
          
y_pred = catboost_model.predict(X_test)
          
auc_score = roc_auc_score(y_test, y_pred_proba)
          
print(f"AUC Score: {auc_score:.4f}")
          
print("\nClassification Report:")
          
print(classification_report(y_test, y_pred))
      

picture.image

通过对比结果可以看出,使用筛选后的8个最优特征时,模型的AUC分数从0.8303提升到了0.9244,整体精度和性能明显提高,这表明特征筛选成功在降低模型维度的同时提升了模型的准确性,验证了机器学习的峰值定理——特征并非越多或越少越好,而是在特定组合下能够达到最优表现

往期推荐

期刊配图:ALE(累积局部效应)模型解释方法解决部分依赖图PDP多重共线性问题

期刊配图:基于t-sne降维与模型预测概率的分类效果可视化

期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用

置信区间+误差条:机器学习分类评价指标精美呈现

SCI图表:基于相关性和标准差的多模型评价——泰勒图解析

期刊文章配图:基于分组折线图的多机器学习模型表现评估对比

复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展

复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化

SCI图表复现:特征相关性气泡热图展示

一图胜千言:回归预测模型训练集与测试集的进阶可视化

期刊文章配图:基于雷达图的多机器学习模型表现评估对比

期刊文章配图:斯皮尔曼相关系数热图反应非线性变量相关性

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

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