背景
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)
通过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
通过结合mRMR筛选特征的排序结果与递归特征选择,逐步增加特征数量并评估多种模型的 AUC性能,从而间接解决了mRMR无法直接确定最优特征数量的问题,通过模型性能来选择最佳特征数
可视化递归特征选择的多模型AUC曲线与最优特征定位
通过可视化递归特征选择中不同特征数量下的模型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))
# 提取整体数据集的所有特征和目标变量
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))
通过对比结果可以看出,使用筛选后的8个最优特征时,模型的AUC分数从0.8303提升到了0.9244,整体精度和性能明显提高,这表明特征筛选成功在降低模型维度的同时提升了模型的准确性,验证了机器学习的峰值定理——特征并非越多或越少越好,而是在特定组合下能够达到最优表现
往期推荐
期刊配图:ALE(累积局部效应)模型解释方法解决部分依赖图PDP多重共线性问题
期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考