📋 前言

各位伙伴们,大家好!经过近三周的“打怪升级”,我们已经手握逻辑回归、决策树、随机森林等多种强大的机器学习模型。但在实战中,一个幸福的烦恼随之而来:面对一堆评估指标(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: 模型训练与评估 ---
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score
import time

# ... (划分数据集 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 = []
for model_name, model in models.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-6
for col in benefit_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) if max_val != min_val else 1.0
for col in cost_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) if max_val != min_val else 1.0
data_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)
for col in benefit_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) if max_val != min_val else 1.0
# 成本型指标: (max - x) / (max - min)
for col in cost_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) if max_val != min_val else 1.0
# 添加极小数,防止后续计算 ln(0) 报错
data_eval += epsilon

# --- 模块三:熵权法计算权重 ---
n, m = data_eval.shape
# 1. 计算比重 P_ij
P = data_eval / data_eval.sum(axis=0)
# 2. 计算信息熵 E_j
k = 1 / np.log(n)
E = -k * (P * np.log(P)).sum(axis=0)
# 3. 计算权重 w_j
weights = (1 - E) / (1 - E).sum()

# --- 模块四:TOPSIS 计算与排序 ---
# 1. 构建加权规范化矩阵 V
V = 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. 从“技能”到“方法论”:这套方法论不仅能用于模型评估,更能推广到生活和工作中的各种评价问题,如供应商选择、方案评估、旅游地选择等,是名副其实的“决策神器”。

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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐