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-总览\|← 返回总览\]