news 2026/6/16 0:17:31

用mRMR算法给特征排个座次,手把手教你数据瘦身

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用mRMR算法给特征排个座次,手把手教你数据瘦身

利用最大相关最小冗余mRMR算法对特征变量做特征重要性排序,实现特征选择。 通过重要性排序图,选择重要的特征变量,以期实现数据降维的目的。 程序直接替换数据就可以用,程序内有注释,方便学习和使用。 程序语言为matlab。

做机器学习项目最怕遇到高维数据,几百个特征一股脑塞进模型里,训练慢不说效果还容易翻车。这时候就得靠特征选择来救场了,今天咱们玩的这个mRMR(最大相关最小冗余)算法,能帮咱挑出那些既重要又不重复的特征。

先上核心代码(替换你的数据直接就能跑):

function selected_features = mRMR_feature_selection(X, y, num_features) % 输入参数: % X - 特征矩阵(n_samples×n_features) % y - 目标变量(n_samples×1) % num_features - 要选择的特征数量 [n_samples, n_features] = size(X); feature_set = 1:n_features; selected_features = []; % 计算每个特征与目标的互信息 mi_target = zeros(1, n_features); for i = 1:n_features mi_target(i) = mut_info(X(:,i), y); end % 首轮选择互信息最大的特征 [~, first_feature] = max(mi_target); selected_features = [selected_features first_feature]; feature_set(feature_set == first_feature) = []; % 迭代选择后续特征 for k = 2:num_features redundancy = zeros(1, length(feature_set)); relevance = mi_target(feature_set); % 计算候选特征与已选特征的冗余 for i = 1:length(feature_set) candidate = feature_set(i); sum_mi = 0; for j = selected_features sum_mi = sum_mi + mut_info(X(:,candidate), X(:,j)); end redundancy(i) = sum_mi / length(selected_features); } % 计算mRMR得分 mrmr_score = relevance - redundancy; % 选择得分最高的特征 [~, idx] = max(mrmr_score); selected_features = [selected_features feature_set(idx)]; feature_set(idx) = []; end end function mi = mut_info(x, y) % 计算两个变量的互信息 [joint_dist, ~, ~] = histcounts2(x, y, 10); joint_dist = joint_dist / sum(joint_dist(:)); marginal_x = sum(joint_dist, 2); marginal_y = sum(joint_dist, 1); mi = 0; for i = 1:size(joint_dist,1) for j = 1:size(joint_dist,2) if joint_dist(i,j) > 0 mi = mi + joint_dist(i,j) * log2(joint_dist(i,j)/(marginal_x(i)*marginal_y(j))); end end end end

代码重点解析:

  1. 互信息计算部分用了直方图分箱(histcounts2),这里把连续变量离散化成10个区间。实际操作中如果特征是分类变量,可以直接用原始类别计算。
  1. 冗余度计算时取的是与已选特征互信息的平均值,这个设计让算法更倾向于选择与已选特征差异大的候选特征。
  1. 选择过程中不断更新候选集,避免重复选择,这个动态更新机制是mRMR的核心。

可视化重要性排序:

% 假设运行完特征选择得到selected_features figure; barh(sort(mi_target(selected_features), 'descend')); xlabel('mRMR重要性得分'); set(gca,'yticklabel',feature_names(selected_features)); title('特征重要性排序');

这个横向条形图越靠右的特征越重要,建议在拐点位置(类似肘部法则)截断选择特征。比如前5个特征贡献了80%的重要性得分,后面的就可以砍掉。

避坑指南:

  • 数据需要先做归一化!特别是连续特征
  • 目标变量y如果是回归任务,需要修改互信息计算方法
  • 特征数量较多时建议分批计算,否则内存容易爆炸
  • 离散化分箱数不要超过样本量的平方根

最后说个玄学经验:用mRMR筛选后的特征再扔进随机森林跑一遍重要性,两者结果取交集,效果往往比单用某一种方法更稳。毕竟特征选择这事儿,多算法交叉验证才靠谱嘛。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 21:16:58

GitHub Pull Request流程:贡献Miniconda相关开源项目

GitHub Pull Request流程:贡献Miniconda相关开源项目 在数据科学和人工智能项目日益复杂的今天,一个常见的工程痛点是:为什么代码在你的机器上运行正常,却在CI流水线或同事环境中报错? 答案往往指向依赖管理的不一致。…

作者头像 李华
网站建设 2026/6/8 22:40:32

Docker save/load导出导入Miniconda镜像便于迁移

Docker save/load 导出导入 Miniconda 镜像实现高效环境迁移 在人工智能和数据科学项目中,一个常见的痛点是:“代码没问题,但跑不出来。” 这往往不是因为算法有缺陷,而是环境不一致导致的依赖冲突——有人用的是 Python 3.9&…

作者头像 李华
网站建设 2026/6/15 19:09:52

使用tox测试框架验证Miniconda环境兼容性

使用tox测试框架验证Miniconda环境兼容性 在AI与数据科学项目日益复杂的今天,一个令人头疼的问题始终存在:为什么代码在本地运行正常,到了服务器或同事的机器上却频频报错?更典型的情况是,模型训练脚本依赖特定版本的P…

作者头像 李华
网站建设 2026/6/5 2:10:49

AdisInsight数据库的3个应用场景与5个内容模块

AdisInsight是由Springer Nature集团旗下Adis出版社开发一款研发信息数据库,AdisInsight药物研发信息数据库包含关于药物开发、临床试验、药物不良反应事件、交易和专利的信息,其搜索范围涵盖数千种期刊、会议论文集、公司网站和其他已发表的资料&#x…

作者头像 李华
网站建设 2026/6/15 20:41:25

四轴桥板卧加编程:AB轴坐标转换宏程序与VT送出

四轴桥板-卧加-AB轴坐标转换宏程序送VT 四轴桥板卧加编程带刀尖跟随G65p9012配套UG-MC后处理,适用于四轴不带rtcp功能的机床工件任意摆放,一次装夹,任意点位建立坐标,后处理自动计算与回转中心的差值三菱-发那科-新代系统可通用A轴…

作者头像 李华
网站建设 2026/6/7 12:14:29

Python虚拟环境最佳实践:Miniconda取代传统venv方案

Python虚拟环境最佳实践:Miniconda取代传统venv方案 在AI项目日益复杂的今天,你是否曾遇到过这样的场景?——同事发来一份代码说“在我机器上跑得好好的”,结果你刚一运行就报错:ImportError: cannot import name XXX …

作者头像 李华