当前位置: 首页 > news >正文

【Python学习打卡-Day19】告别选择困难症:熵权法+TOPSIS科学评估你的机器学习模型

📋 前言

各位伙伴们,大家好!经过近三周的“打怪升级”,我们已经手握逻辑回归、决策树、随机森林等多种强大的机器学习模型。但在实战中,一个幸福的烦恼随之而来:面对一堆评估指标(Accuracy, Recall, F1, AUC…),到底该选哪个模型?

  • 模型A的Recall最高,但训练时间最长。
  • 模型B的AUC领先,但F1-Score稍逊。
  • 模型C各方面都还行,但都不顶尖。

这不就是典型的“选择困难症”吗?今天,Day 20,我们将学习一套科学、客观的“裁判系统”——熵权法 (Entropy Weight Method) + TOPSIS,它能综合所有指标,为我们的模型给出一个公正的最终排名!

一、为什么需要“评价问题”方法?

传统的模型选择往往面临三大挑战:

  1. 指标冲突性:Accuracy、Recall、F1-Score 等指标往往无法同时达到最优,顾此失彼。
  2. 主观风险性:单纯依赖专家经验或个人偏好来“拍脑袋”定权重,容易引入偏见,难以服众。
  3. 缺乏统一标准:只看单一指标(如只看AUC)过于片面,无法全面、科学地衡量模型的综合性能。

而我们今天的主角熵权法+TOPSIS,正是为了解决这些问题而生的“天选之子”。


二、核心思想拆解:熵权法 与 TOPSIS

整个方法分为两大阶段,像一场双人探戈,配合得天衣无缝。

阶段一:熵权法 (Entropy Weight Method) - 客观的“权重分配师”

“熵”在信息论中衡量的是不确定性信息量。熵权法的核心逻辑极其精妙:

某个指标下,各个模型得分的差异越大(数据越分散),说明该指标提供了越多的有效区分信息,信息熵就越小,因此应该被赋予越高的权重。

举个通俗的例子

  • 语文:所有模型的得分都在90-92分之间,大家表现差不多,区分度低→ \to权重低
  • 数学:模型得分从60分到95分不等,能真正拉开差距,区分度高→ \to权重高

熵权法,就是让数据自己说话,客观地告诉我们“哪个指标更重要”。

阶段二:TOPSIS - 理性的“距离丈量员”

TOPSIS (Technique for Order Preference by Similarity to Ideal Solution)的思想非常直观:

  1. 定义两个“标杆”
    • 正理想解 (V+): 想象一个“完美模型”,它在每个指标上都取到了所有模型中的最优值
    • 负理想解 (V-): 想象一个“最差模型”,它在每个指标上都取到了所有模型中的最劣值
  2. 计算距离:计算每个实际模型到“完美模型”和“最差模型”的欧氏距离。
  3. 计算得分:一个模型离“完美模型”越近,同时离“最差模型”越远,它的综合得分就越高。

最终,熵权法提供权重,TOPSIS负责加权排序,二者结合,给出一个科学、令人信服的综合排名。


三、实战演练:为我们的风控模型进行综合评估

接下来,我们将对之前训练的四个模型(逻辑回归、决策树、随机森林、梯度提升)进行一次“终极大PK”。

步骤 0:搭建竞技场 - 训练模型并收集指标

首先,我们运行之前的预处理代码,并训练四个模型,得到它们的Accuracy, Recall, F1-Score, AUC, 以及训练时间。这就构成了我们的原始决策矩阵

# 【我的代码】# 本部分代码为Day20作业的完整实现# 包含了数据预处理、模型训练与评估、以及熵权法+TOPSIS的全过程# --- Part 1: 数据预处理 (与之前相同) ---# (此处省略与前几天相同的预处理代码,请参考完整源码)# --- Part 2: 模型训练与评估 ---fromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.treeimportDecisionTreeClassifierfromsklearn.ensembleimportRandomForestClassifier,GradientBoostingClassifierfromsklearn.metricsimportaccuracy_score,recall_score,f1_score,roc_auc_scoreimporttime# ... (划分数据集 X_train, X_test, y_train, y_test) ...models={'Logistic Regression':LogisticRegression(max_iter=1000,random_state=42),'Decision Tree':DecisionTreeClassifier(random_state=42),'Random Forest':RandomForestClassifier(n_estimators=100,random_state=42),'Gradient Boosting':GradientBoostingClassifier(n_estimators=100,random_state=42)}results_list=[]formodel_name,modelinmodels.items():start_time=time.time()model.fit(X_train,y_train)train_time=time.time()-start_time y_pred=model.predict(X_test)y_pred_proba=model.predict_proba(X_test)[:,1]results_list.append({'Model':model_name,'Accuracy':accuracy_score(y_test,y_pred),'Recall':recall_score(y_test,y_pred),'F1-Score':f1_score(y_test,y_pred),'AUC':roc_auc_score(y_test,y_pred_proba),'Training Time (s)':train_time})results_df=pd.DataFrame(results_list).set_index('Model')print("【原始决策矩阵 X】:")print(results_df)# --- Part 3: 熵权法 + TOPSIS ---# 1. 定义指标方向benefit_cols=['Accuracy','Recall','F1-Score','AUC']cost_cols=['Training Time (s)']data_eval=results_df.copy().astype(float)# 2. 数据标准化 (Min-Max)epsilon=1e-6forcolinbenefit_cols:min_val,max_val=data_eval[col].min(),data_eval[col].max()data_eval[col]=(data_eval[col]-min_val)/(max_val-min_val)ifmax_val!=min_valelse1.0forcolincost_cols:min_val,max_val=data_eval[col].min(),data_eval[col].max()data_eval[col]=(max_val-data_eval[col])/(max_val-min_val)ifmax_val!=min_valelse1.0data_eval+=epsilon# 3. 熵权法计算权重n,m=data_eval.shape P=data_eval/data_eval.sum(axis=0)E=-(1/np.log(n))*(P*np.log(P)).sum(axis=0)weights=(1-E)/(1-E).sum()# 4. TOPSIS 计算与排序V=data_eval*weights V_plus,V_minus=V.max(),V.min()D_plus=np.sqrt(((V-V_plus)**2).sum(axis=1))D_minus=np.sqrt(((V-V_minus)**2).sum(axis=1))scores=D_minus/(D_plus+D_minus)# 5. 整理最终结果final_results=results_df.copy()final_results['TOPSIS Score']=scores final_results['Rank']=final_results['TOPSIS Score'].rank(ascending=False).astype(int)print("\n【各指标权重 (熵权法)】:")print(pd.DataFrame(weights,columns=['Weight']).sort_values(by='Weight',ascending=False))print("\n【最终 TOPSIS 评估排名】:")print(final_results.sort_values(by='Rank'))

步骤 1-4:熵权法+TOPSIS 完整流程

下面是带有详细注释的代码,揭示了每一步的计算细节。

点击展开/折叠:查看熵权法+TOPSIS 详细注释代码
# --- 模块一:准备工作 ---# 1. 区分指标类型benefit_cols=['Accuracy','Recall','F1-Score','AUC']cost_cols=['Training Time (s)']data_eval=results_df.copy().astype(float)# --- 模块二:数据标准化 (消除量纲,统一方向) ---epsilon=1e-6# 防止 log(0)# 效益型指标: (x - min) / (max - min)forcolinbenefit_cols:min_val,max_val=data_eval[col].min(),data_eval[col].max()data_eval[col]=(data_eval[col]-min_val)/(max_val-min_val)ifmax_val!=min_valelse1.0# 成本型指标: (max - x) / (max - min)forcolincost_cols:min_val,max_val=data_eval[col].min(),data_eval[col].max()data_eval[col]=(max_val-data_eval[col])/(max_val-min_val)ifmax_val!=min_valelse1.0# 添加极小数,防止后续计算 ln(0) 报错data_eval+=epsilon# --- 模块三:熵权法计算权重 ---n,m=data_eval.shape# 1. 计算比重 P_ijP=data_eval/data_eval.sum(axis=0)# 2. 计算信息熵 E_jk=1/np.log(n)E=-k*(P*np.log(P)).sum(axis=0)# 3. 计算权重 w_jweights=(1-E)/(1-E).sum()# --- 模块四:TOPSIS 计算与排序 ---# 1. 构建加权规范化矩阵 VV=data_eval*weights# 2. 确定正负理想解 V+ 和 V-V_plus,V_minus=V.max(),V.min()# 3. 计算欧氏距离 D+ 和 D-D_plus=np.sqrt(((V-V_plus)**2).sum(axis=1))D_minus=np.sqrt(((V-V_minus)**2).sum(axis=1))# 4. 计算相对接近度 C_i (最终得分)scores=D_minus/(D_plus+D_minus)# --- 模块五:结果汇总 ---final_results=results_df.copy()final_results['TOPSIS Score']=scores final_results['Rank']=final_results['TOPSIS Score'].rank(ascending=False).astype(int)print("\n【各指标权重 (熵权法)】:")print(pd.DataFrame(weights,columns=['Weight']).sort_values(by='Weight',ascending=False))print("\n【最终 TOPSIS 评估排名】:")print(final_results.sort_values(by='Rank'))

结果解读

运行代码后,我们会得到两张关键的表格:

  1. 权重表:告诉我们哪个指标在本次评比中“话语权”最重。
  2. 最终排名表:给出了每个模型的综合得分和最终排名。

通过分析排名,我们可以自信地说:“综合来看,模型 X 是本次任务的最优选择,因为它在各项高权重指标上取得了最佳的平衡。”


四、总结与心得

Day 19 的学习,是思维方式上的一次重要跃迁,让我收获巨大:

  1. 从“单点”到“全局”:我不再纠结于单一指标的优劣,而是学会了从一个多维、全局的视角来审视模型,这更贴近现实世界的复杂决策。
  2. 从“主观”到“客观”:熵权法让我第一次感受到了“让数据自己说话”的魅力。它提供了一种强大的、可复现的、消除主观偏见的权重分配方案。
  3. 从“模糊”到“量化”:TOPSIS 将“好坏”这一模糊概念,通过与理想解的距离进行了精确的量化,最终的得分和排名一目了然,极具说服力。
  4. 从“技能”到“方法论”:这套方法论不仅能用于模型评估,更能推广到生活和工作中的各种评价问题,如供应商选择、方案评估、旅游地选择等,是名副其实的“决策神器”。

特别感谢 @浙大疏锦行 老师的精彩课程,带领我们从代码实现者,一步步向具备科学决策能力的思考者迈进!这趟旅程,收获的远不止是代码。
复制

http://www.jsqmd.com/news/79971/

相关文章:

  • 基于 STM32 的数控 BUCK-BOOST 升降压电源设计
  • Qwen系列模型性能优化指南:官方推荐参数配置与开放下载渠道公布
  • Kimi-VL多模态模型技术突破:小参数实现大能力的范式革新
  • 突破行业壁垒:阶跃星辰开源全链路语音交互模型,重新定义智能语音交互标准
  • 图像编辑新突破:Qwen-Image-Edit-MeiTu模型实现专业级视觉优化与场景适配
  • Qwen3-VL-4B-Thinking-FP8震撼发布:多模态AI新纪元,量化模型性能不减的技术突破
  • Qwen3-VL-4B-Instruct-FP8震撼发布:多模态交互新纪元的技术突破
  • 腾讯混元大模型系列:引领多场景高效部署的开源新范式
  • 多语言文档解析新突破:dots.ocr以1.7B参数实现多任务SOTA性能
  • 重磅发布:Granite-4.0-H-Small-Unsloth-BNB-4bit模型开源,引领轻量级AI应用新纪元
  • 中国AI再创全球标杆:HiDream E1.1登顶国际图像编辑榜单,开源技术引领行业变革
  • Holo1.5:开启智能交互新纪元的计算机使用代理基础模型
  • OpenAI Whisper参数全解析:从入门到精通的语音转文本配置指南
  • FLUX.1 Kontext Dev:开源图像编辑领域的革命性突破
  • 文本驱动视频编辑革命:Lucy Edit AI重新定义动态视觉创作边界
  • CoDA:革新代码生成的扩散适配语言模型震撼登场
  • 7100万参数改写行业格局:T-one引领俄语电话语音识别技术变革
  • 本地AI革命:Locally AI重塑移动设备隐私计算新范式
  • Mistral AI发布Magistral Small 1.2:24B参数模型实现多模态推理跃升,消费级硬件即可部署
  • 区块链可投会议CCF B--CSF 2026 截止1.29 附录用率
  • JavaScript 的全栈同构渲染(Isomorphic Rendering):前后端响应式状态的序列化与重新激活逻辑
  • 智谱AI发布GLM-4.5V-FP8视觉语言模型,多模态理解能力突破行业纪录
  • 韩松团队突破4位量化技术瓶颈:SVDQuant让FLUX模型推理效率飙升
  • 沁言学术深度体验:一款重新定义科研写作的智能伙伴
  • IBM推出Granite 4.0开源语言模型:以混合架构解决企业AI部署成本难题
  • 轻量化AI模型的取舍:推理效率与知识覆盖的平衡之道
  • springboot的docker容器实战之上传文件中文乱码
  • 251212哇居然有人因为打球打起来了
  • 2025年AI推理里程碑:Inclusion AI开源万亿参数模型Ring-1T,数学推理性能跃升14%
  • Qwen3-4B:新一代开源大模型的突破性进展与多场景应用指南