Python-sklearn-评估指标

Sklearn 评估指标大全

sklearn.metrics 模块提供了分类、回归、聚类、排序等任务的评估指标。


📊 分类指标(Classification Metrics)

1. accuracy_score --- 准确率 ⭐

python 复制代码
from sklearn.metrics import accuracy_score

acc = accuracy_score(y_true, y_pred)
acc_normalized = accuracy_score(y_true, y_pred, normalize=True)
acc_count = accuracy_score(y_true, y_pred, normalize=False)  # 返回正确数

2. confusion_matrix --- 混淆矩阵

python 复制代码
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

cm = confusion_matrix(y_true, y_pred)
# 输出: [[TN, FP],
#        [FN, TP]]

# 含标签
cm = confusion_matrix(y_true, y_pred, labels=[0, 1, 2])

# 可视化
ConfusionMatrixDisplay.from_predictions(y_true, y_pred, cmap='Blues')
ConfusionMatrixDisplay.from_estimator(model, X, y, cmap='Blues')
import matplotlib.pyplot as plt
plt.show()

3. classification_report --- 分类报告 ⭐

一键输出所有主要指标。

python 复制代码
from sklearn.metrics import classification_report

# 文本形式报告
report = classification_report(
    y_true, y_pred,
    target_names=['class_0', 'class_1', 'class_2'],
    labels=[0, 1, 2],
    zero_division=0,        # 分母为 0 时的处理: 'warn', 0, 1
    digits=2                # 小数位数
)
print(report)

# 字典形式
report_dict = classification_report(y_true, y_pred, output_dict=True)

输出示例:

复制代码
              precision    recall  f1-score   support
   class_0       0.95      0.93      0.94        50
   class_1       0.88      0.91      0.90        50
   class_2       0.90      0.88      0.89        50
   accuracy                           0.91       150
  macro avg       0.91      0.91      0.91       150
weighted avg      0.91      0.91      0.91       150

4. precision_score / recall_score / f1_score / fbeta_score

python 复制代码
from sklearn.metrics import (
    precision_score, recall_score,
    f1_score, fbeta_score
)

# 核心参数
# average: 'micro', 'macro', 'weighted', 'samples', None
# zero_division: 'warn', 0, 1

# 二分类
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)

# 多分类
p_macro = precision_score(y_true, y_pred, average='macro')    # 宏平均
p_micro = precision_score(y_true, y_pred, average='micro')    # 微平均
p_weighted = precision_score(y_true, y_pred, average='weighted') # 加权平均
p_none = precision_score(y_true, y_pred, average=None)        # 每类分别返回

# F-beta(如 F2 更重视召回,F0.5 更重视精确率)
f2 = fbeta_score(y_true, y_pred, beta=2.0, average='macro')

average 参数对比:

average 说明 适用场景
'micro' 全局计算 TP/FP/FN 样本均衡时
'macro' 各类指标算术平均 关注小类表现
'weighted' 按支持度加权平均 类别不均衡时
None 返回每类的指标值 需要逐类分析
'samples' 多标签的样本级平均 多标签任务

5. 概率预测指标

python 复制代码
from sklearn.metrics import (
    roc_auc_score, roc_curve,
    precision_recall_curve, average_precision_score,
    log_loss, brier_score_loss
)

# ROC-AUC(二分类/多分类)
auc = roc_auc_score(y_true, y_score)
auc_multi = roc_auc_score(y_true, y_score, multi_class='ovr')  # 'ovo' 或 'ovr'

# ROC 曲线
fpr, tpr, thresholds = roc_curve(y_true, y_score)

# 精确率-召回率曲线(适合样本不均衡)
precision, recall, thresholds = precision_recall_curve(y_true, y_score)

# 平均精确率(PR 曲线下面积)
ap = average_precision_score(y_true, y_score)

# 对数损失(交叉熵)
ll = log_loss(y_true, y_prob, normalize=True, labels=[0, 1])

# Brier 分数(概率校准)
brier = brier_score_loss(y_true, y_prob)

6. 其他分类指标

python 复制代码
from sklearn.metrics import (
    hamming_loss,            # 汉明损失(多标签)
    jaccard_score,           # Jaccard 相似系数
    matthews_corrcoef,       # Matthews 相关系数(MCC)
    cohen_kappa_score,       # Cohen's Kappa(一致性)
    balanced_accuracy_score, # 平衡准确率
    top_k_accuracy_score,    # Top-K 准确率
    hinge_loss,              # Hinge 损失(SVM)
)

# 平衡准确率(考虑类别不均衡)
b_acc = balanced_accuracy_score(y_true, y_pred)

# Cohen's Kappa
kappa = cohen_kappa_score(y_true, y_pred)

# Matthews 相关系数(-1 到 1)
mcc = matthews_corrcoef(y_true, y_pred)

# Top-K 准确率
top3 = top_k_accuracy_score(y_true, y_score, k=3)

# 汉明损失(多标签)
hl = hamming_loss(y_true, y_pred)

7. 可视化函数

python 复制代码
from sklearn.metrics import (
    ConfusionMatrixDisplay,
    PrecisionRecallDisplay,
    RocCurveDisplay,
    DetCurveDisplay,
    PredictionErrorDisplay,
    CalibrationDisplay,
    LearningCurveDisplay,
    ValidationCurveDisplay,
)
import matplotlib.pyplot as plt

# 混淆矩阵
ConfusionMatrixDisplay.from_predictions(y_true, y_pred, cmap='Blues')
plt.show()

# ROC 曲线
RocCurveDisplay.from_predictions(y_true, y_score, name='Model')
plt.show()

# P-R 曲线(适合不均衡数据)
PrecisionRecallDisplay.from_predictions(y_true, y_score)

# 预测误差图(回归)
PredictionErrorDisplay.from_predictions(y_true, y_pred)

📈 回归指标(Regression Metrics)

1. 核心回归指标

python 复制代码
from sklearn.metrics import (
    mean_squared_error,           # MSE
    mean_absolute_error,          # MAE
    mean_absolute_percentage_error, # MAPE
    r2_score,                     # R²
    explained_variance_score,     # 解释方差
    max_error,                    # 最大误差
    mean_squared_log_error,       # MSLE
    root_mean_squared_error,      # RMSE
    mean_squared_error,           # MSE
)

# MSE(均方误差)⭐
mse = mean_squared_error(y_true, y_pred, squared=True)
rmse = mean_squared_error(y_true, y_pred, squared=False)  # 1.4+
# 或
from sklearn.metrics import root_mean_squared_error
rmse = root_mean_squared_error(y_true, y_pred)

# MAE(平均绝对误差)
mae = mean_absolute_error(y_true, y_pred)

# MAPE(平均绝对百分比误差)
mape = mean_absolute_percentage_error(y_true, y_pred)

# R² 分数 ⭐
r2 = r2_score(y_true, y_pred)
# 也可多输出
r2_multi = r2_score(y_true, y_pred, multioutput='uniform_average')

# 解释方差
evs = explained_variance_score(y_true, y_pred, multioutput='uniform_average')

# 最大误差
me = max_error(y_true, y_pred)

# 均方对数误差
msle = mean_squared_log_error(y_true, y_pred)

2. 多输出回归参数

multioutput 参数:

  • 'raw_values' --- 每个输出分别返回
  • 'uniform_average' --- 等权平均(默认)
  • 'variance_weighted' --- 按方差加权
  • array-like --- 自定义权重
python 复制代码
from sklearn.metrics import r2_score

# 自定义各输出权重
r2 = r2_score(y_true, y_pred, multioutput=[0.3, 0.7])

3. 距离/配对指标

python 复制代码
from sklearn.metrics import (
    d2_absolute_error_score,
    d2_pinball_score,
    d2_tweedie_score,
    mean_pinball_loss,
    mean_tweedie_deviance,
    median_absolute_error,
)

# 中位数绝对误差
medae = median_absolute_error(y_true, y_pred)

🎯 聚类指标(Clustering Metrics)

有真实标签的聚类评估

python 复制代码
from sklearn.metrics import (
    adjusted_rand_score,              # 调整兰德指数(ARI)
    adjusted_mutual_info_score,       # 调整互信息(AMI)
    normalized_mutual_info_score,     # 归一化互信息(NMI)
    homogeneity_score,                # 同质性
    completeness_score,               # 完整性
    v_measure_score,                  # V-measure
    fowlkes_mallows_score,            # FMI
    rand_score,                       # 兰德指数
)

# ARI(调整兰德指数,-1 到 1)⭐
ari = adjusted_rand_score(y_true, y_pred)

# NMI(归一化互信息,0 到 1)
nmi = normalized_mutual_info_score(y_true, y_pred)

# AMI(调整互信息)
ami = adjusted_mutual_info_score(y_true, y_pred)

# 同质性、完整性、V-measure
h = homogeneity_score(y_true, y_pred)    # 每个簇是否只含一类
c = completeness_score(y_true, y_pred)    # 每类是否归到同一个簇
v = v_measure_score(y_true, y_pred)       # H 和 C 的调和平均

无真实标签的聚类评估

python 复制代码
from sklearn.metrics import (
    silhouette_score,           # 轮廓系数
    silhouette_samples,         # 每个样本的轮廓系数
    calinski_harabasz_score,    # CH 指标(方差比准则)
    davies_bouldin_score,       # DB 指数
)

# 轮廓系数 ⭐(-1 到 1,越高越好)
sil = silhouette_score(X, labels, metric='euclidean')
sil_per_sample = silhouette_samples(X, labels)

# CH 指标(越高越好)
ch = calinski_harabasz_score(X, labels)

# DB 指数(越低越好)
db = davies_bouldin_score(X, labels)

配对混淆矩阵

python 复制代码
from sklearn.metrics.cluster import (
    pair_confusion_matrix, contingency_matrix
)

# 配对混淆矩阵
pair_cm = pair_confusion_matrix(y_true, y_pred)
# 返回 (TN, FP, FN, TP)

# 列联表
cont = contingency_matrix(y_true, y_pred)

🔁 其他指标

make_scorer() --- 自定义评分器

python 复制代码
from sklearn.metrics import make_scorer
from sklearn.metrics import mean_squared_error
import numpy as np

# 自定义损失函数作为评分器
def rmse(y_true, y_pred):
    return np.sqrt(mean_squared_error(y_true, y_pred))

# 创建评分器(越大越好)
rmse_scorer = make_scorer(
    rmse,
    greater_is_better=False,  # 越小越好
    needs_proba=False,
    needs_threshold=False
)

# 用于 GridSearchCV
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(model, params, scoring=rmse_scorer)

内置评分器字符串:

python 复制代码
# 分类
'scoring': 'accuracy'
'scoring': 'roc_auc'
'scoring': 'f1_macro'
'scoring': 'precision_weighted'
'scoring': 'recall_micro'
'scoring': 'neg_log_loss'      # 注意负号(越大越好)

# 回归
'scoring': 'r2'
'scoring': 'neg_mean_squared_error'
'scoring': 'neg_mean_absolute_error'
'scoring': 'neg_root_mean_squared_error'

# 聚类
'scoring': 'adjusted_rand_score'
'scoring': 'normalized_mutual_info_score'

get_scorer() --- 获取评分器

python 复制代码
from sklearn.metrics import get_scorer

scorer = get_scorer('roc_auc')
score = scorer(model, X_test, y_test)

get_scorer_names() --- 列出所有评分器名

python 复制代码
from sklearn.metrics import get_scorer_names

all_names = get_scorer_names()
# ['accuracy', 'adjusted_mutual_info_score', 'adjusted_rand_score', ...]

auc() --- 曲线下面积(梯形法则)

python 复制代码
from sklearn.metrics import auc

area = auc(x, y)  # 梯形数值积分

ndcg_score() --- 归一化折损累计增益

用于排序质量评估。

python 复制代码
from sklearn.metrics import ndcg_score, dcg_score

ndcg = ndcg_score(y_true, y_score, k=5)
dcg = dcg_score(y_true, y_score)

pairwise_distances() --- 成对距离矩阵

python 复制代码
from sklearn.metrics import pairwise_distances
from sklearn.metrics.pairwise import (
    cosine_similarity,      # 余弦相似度
    euclidean_distances,    # 欧氏距离
    manhattan_distances,    # 曼哈顿距离
    rbf_kernel,             # RBF 核
    linear_kernel,          # 线性核
    polynomial_kernel,      # 多项式核
    sigmoid_kernel,         # Sigmoid 核
    laplacian_kernel,       # 拉普拉斯核
    chi2_kernel,            # Chi² 核
    additive_chi2_kernel,   # 加性 Chi² 核
    pairwise_kernels,       # 成对核函数
    paired_distances,       # 配对距离
    paired_cosine_distances,
    paired_euclidean_distances,
    paired_manhattan_distances,
)

# 余弦相似度
sim = cosine_similarity(X, Y)

# 欧氏距离
dist = euclidean_distances(X, Y)

# 通用成对距离
dist = pairwise_distances(X, Y, metric='cosine')

📝 实践模板

分类任务完整评估

python 复制代码
from sklearn.metrics import (
    accuracy_score, classification_report, confusion_matrix,
    roc_auc_score, f1_score, precision_score, recall_score
)

def evaluate_classification(model, X_train, X_test, y_train, y_test):
    """分类模型完整评估"""
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    y_prob = model.predict_proba(X_test) if hasattr(model, 'predict_proba') else None

    results = {
        'accuracy': accuracy_score(y_test, y_pred),
        'precision': precision_score(y_test, y_pred, average='weighted'),
        'recall': recall_score(y_test, y_pred, average='weighted'),
        'f1': f1_score(y_test, y_pred, average='weighted'),
    }

    if y_prob is not None:
        results['roc_auc'] = roc_auc_score(
            y_test, y_prob, multi_class='ovr'
        )

    print(classification_report(y_test, y_pred))
    return results

回归任务完整评估

python 复制代码
from sklearn.metrics import (
    mean_squared_error, mean_absolute_error,
    r2_score, mean_absolute_percentage_error
)
import numpy as np

def evaluate_regression(model, X_train, X_test, y_train, y_test):
    """回归模型完整评估"""
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)

    results = {
        'R2': r2_score(y_test, y_pred),
        'MSE': mean_squared_error(y_test, y_pred),
        'RMSE': np.sqrt(mean_squared_error(y_test, y_pred)),
        'MAE': mean_absolute_error(y_test, y_pred),
        'MAPE': mean_absolute_percentage_error(y_test, y_pred),
    }
    return results

\[sklearn-总览\|← 返回总览\]

相关推荐
2601_963869951 小时前
【计算机毕业设计】基于Java的线上就医平台设计与实现
大数据·人工智能·课程设计
guyiICtestsocket1 小时前
国内支持定制的手机LPDDR芯片测试座工厂多种结构
人工智能·python·智能手机
for_ever_love__1 小时前
python基础语法学习: 变量, 输入输出, 运算符
网络·python·学习
你挚爱的强哥1 小时前
【exportExcel】单纯靠js不用任何其他第三方插件导出xls格式文件
开发语言·javascript·ecmascript
努力搬砖的咸鱼1 小时前
AI Agent测试全景图:它到底改变了什么
人工智能·python·ai·集成测试·pytest·agent·ai编程
Hello_Damon_Nikola1 小时前
AC7911从入门到精通
开发语言·嵌入式硬件·物联网·php
worxfr1 小时前
Go 并发控制:从 Channel 方向约束到实战模式
开发语言·后端·golang
DeepIntelli1 小时前
品牌AI搜索审计怎么做:从可见度基线到可复测的改进闭环
人工智能·chatgpt
带鱼吃猫1 小时前
预处理器:宏、运算符与条件编译
c语言·开发语言