山东网站建设运营,设计开发网站,深圳建设集团网站,wordpress 内容置顶#x1f4cb; 前言
各位伙伴们#xff0c;大家好#xff01;经过近三周的“打怪升级”#xff0c;我们已经手握逻辑回归、决策树、随机森林等多种强大的机器学习模型。但在实战中#xff0c;一个幸福的烦恼随之而来#xff1a;面对一堆评估指标#xff08;Accuracy, Re… 前言各位伙伴们大家好经过近三周的“打怪升级”我们已经手握逻辑回归、决策树、随机森林等多种强大的机器学习模型。但在实战中一个幸福的烦恼随之而来面对一堆评估指标Accuracy, Recall, F1, AUC…到底该选哪个模型模型A的Recall最高但训练时间最长。模型B的AUC领先但F1-Score稍逊。模型C各方面都还行但都不顶尖。这不就是典型的“选择困难症”吗今天Day 20我们将学习一套科学、客观的“裁判系统”——熵权法 (Entropy Weight Method) TOPSIS它能综合所有指标为我们的模型给出一个公正的最终排名一、为什么需要“评价问题”方法传统的模型选择往往面临三大挑战指标冲突性Accuracy、Recall、F1-Score 等指标往往无法同时达到最优顾此失彼。主观风险性单纯依赖专家经验或个人偏好来“拍脑袋”定权重容易引入偏见难以服众。缺乏统一标准只看单一指标如只看AUC过于片面无法全面、科学地衡量模型的综合性能。而我们今天的主角熵权法TOPSIS正是为了解决这些问题而生的“天选之子”。二、核心思想拆解熵权法 与 TOPSIS整个方法分为两大阶段像一场双人探戈配合得天衣无缝。阶段一熵权法 (Entropy Weight Method) - 客观的“权重分配师”“熵”在信息论中衡量的是不确定性或信息量。熵权法的核心逻辑极其精妙某个指标下各个模型得分的差异越大数据越分散说明该指标提供了越多的有效区分信息信息熵就越小因此应该被赋予越高的权重。举个通俗的例子语文所有模型的得分都在90-92分之间大家表现差不多区分度低→ \to→权重低。数学模型得分从60分到95分不等能真正拉开差距区分度高→ \to→权重高。熵权法就是让数据自己说话客观地告诉我们“哪个指标更重要”。阶段二TOPSIS - 理性的“距离丈量员”TOPSIS (Technique for Order Preference by Similarity to Ideal Solution)的思想非常直观定义两个“标杆”正理想解 (V): 想象一个“完美模型”它在每个指标上都取到了所有模型中的最优值。负理想解 (V-): 想象一个“最差模型”它在每个指标上都取到了所有模型中的最劣值。计算距离计算每个实际模型到“完美模型”和“最差模型”的欧氏距离。计算得分一个模型离“完美模型”越近同时离“最差模型”越远它的综合得分就越高。最终熵权法提供权重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_iter1000,random_state42),Decision Tree:DecisionTreeClassifier(random_state42),Random Forest:RandomForestClassifier(n_estimators100,random_state42),Gradient Boosting:GradientBoostingClassifier(n_estimators100,random_state42)}results_list[]formodel_name,modelinmodels.items():start_timetime.time()model.fit(X_train,y_train)train_timetime.time()-start_time y_predmodel.predict(X_test)y_pred_probamodel.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_dfpd.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_evalresults_df.copy().astype(float)# 2. 数据标准化 (Min-Max)epsilon1e-6forcolinbenefit_cols:min_val,max_valdata_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_valdata_eval[col].min(),data_eval[col].max()data_eval[col](max_val-data_eval[col])/(max_val-min_val)ifmax_val!min_valelse1.0data_evalepsilon# 3. 熵权法计算权重n,mdata_eval.shape Pdata_eval/data_eval.sum(axis0)E-(1/np.log(n))*(P*np.log(P)).sum(axis0)weights(1-E)/(1-E).sum()# 4. TOPSIS 计算与排序Vdata_eval*weights V_plus,V_minusV.max(),V.min()D_plusnp.sqrt(((V-V_plus)**2).sum(axis1))D_minusnp.sqrt(((V-V_minus)**2).sum(axis1))scoresD_minus/(D_plusD_minus)# 5. 整理最终结果final_resultsresults_df.copy()final_results[TOPSIS Score]scores final_results[Rank]final_results[TOPSIS Score].rank(ascendingFalse).astype(int)print(\n【各指标权重 (熵权法)】)print(pd.DataFrame(weights,columns[Weight]).sort_values(byWeight,ascendingFalse))print(\n【最终 TOPSIS 评估排名】)print(final_results.sort_values(byRank))步骤 1-4熵权法TOPSIS 完整流程下面是带有详细注释的代码揭示了每一步的计算细节。点击展开/折叠查看熵权法TOPSIS 详细注释代码# --- 模块一准备工作 ---# 1. 区分指标类型benefit_cols[Accuracy,Recall,F1-Score,AUC]cost_cols[Training Time (s)]data_evalresults_df.copy().astype(float)# --- 模块二数据标准化 (消除量纲统一方向) ---epsilon1e-6# 防止 log(0)# 效益型指标: (x - min) / (max - min)forcolinbenefit_cols:min_val,max_valdata_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_valdata_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_evalepsilon# --- 模块三熵权法计算权重 ---n,mdata_eval.shape# 1. 计算比重 P_ijPdata_eval/data_eval.sum(axis0)# 2. 计算信息熵 E_jk1/np.log(n)E-k*(P*np.log(P)).sum(axis0)# 3. 计算权重 w_jweights(1-E)/(1-E).sum()# --- 模块四TOPSIS 计算与排序 ---# 1. 构建加权规范化矩阵 VVdata_eval*weights# 2. 确定正负理想解 V 和 V-V_plus,V_minusV.max(),V.min()# 3. 计算欧氏距离 D 和 D-D_plusnp.sqrt(((V-V_plus)**2).sum(axis1))D_minusnp.sqrt(((V-V_minus)**2).sum(axis1))# 4. 计算相对接近度 C_i (最终得分)scoresD_minus/(D_plusD_minus)# --- 模块五结果汇总 ---final_resultsresults_df.copy()final_results[TOPSIS Score]scores final_results[Rank]final_results[TOPSIS Score].rank(ascendingFalse).astype(int)print(\n【各指标权重 (熵权法)】)print(pd.DataFrame(weights,columns[Weight]).sort_values(byWeight,ascendingFalse))print(\n【最终 TOPSIS 评估排名】)print(final_results.sort_values(byRank))结果解读运行代码后我们会得到两张关键的表格权重表告诉我们哪个指标在本次评比中“话语权”最重。最终排名表给出了每个模型的综合得分和最终排名。通过分析排名我们可以自信地说“综合来看模型 X 是本次任务的最优选择因为它在各项高权重指标上取得了最佳的平衡。”四、总结与心得Day 19 的学习是思维方式上的一次重要跃迁让我收获巨大从“单点”到“全局”我不再纠结于单一指标的优劣而是学会了从一个多维、全局的视角来审视模型这更贴近现实世界的复杂决策。从“主观”到“客观”熵权法让我第一次感受到了“让数据自己说话”的魅力。它提供了一种强大的、可复现的、消除主观偏见的权重分配方案。从“模糊”到“量化”TOPSIS 将“好坏”这一模糊概念通过与理想解的距离进行了精确的量化最终的得分和排名一目了然极具说服力。从“技能”到“方法论”这套方法论不仅能用于模型评估更能推广到生活和工作中的各种评价问题如供应商选择、方案评估、旅游地选择等是名副其实的“决策神器”。特别感谢 浙大疏锦行 老师的精彩课程带领我们从代码实现者一步步向具备科学决策能力的思考者迈进这趟旅程收获的远不止是代码。复制