AUC-ROC 是评估二分类模型性能的指标,通过绘制真正例率(TPR,纵轴)和假正例率(FPR,横轴)的 ROC 曲线,计算曲线下的面积。AUC 值越接近 1,模型性能越好;0.5 表示随机猜测。
在癌症筛查中,使用逻辑回归模型的 AUC-ROC 达到 0.92,表明模型能有效区分良性与恶性肿瘤。
RMSE 是回归任务中衡量预测值与真实值误差的指标,公式为:
R M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} RMSE=n1i=1∑n(yi−y^i)2
值越小,模型拟合效果越好。
在房价预测任务中,XGBoost 模型的 RMSE 从 28.5 优化至 19.2,通过特征交互工程降低了误差。
衡量聚类结果质量的指标,计算公式:
轮廓系数 = b ( a − b ) m a x ( a , b ) \text{轮廓系数} = \frac{b(a - b)}{max(a, b)} 轮廓系数=max(a,b)b(a−b)
其中:
在用户行为聚类中,当簇数 K=5 时轮廓系数达到 0.73,显著优于 K-means 默认的 K=3 分群效果。
PR 曲线下面积,横轴为召回率(Recall),纵轴为精确率(Precision)。AUC 越接近 1,模型在正类识别上越强。
class_weight='balanced'
)。在电信诈骗检测中,LightGBM 模型通过类别权重调整使 PR AUC 提升 18%,成功拦截 95% 的欺诈交易。
指标 | 核心目标 | 适用任务 | 调优重点 |
---|---|---|---|
AUC-ROC | 平衡正负类分类性能 | 二分类(均衡) | 阈值调整、模型复杂度 |
RMSE | 最小化预测值与真实值误差 | 回归 | 模型选择、特征工程 |
轮廓系数 | 评估聚类紧密度与分离度 | 聚类 | 簇数选择、数据预处理 |
PR AUC | 优化正例识别(尤其数据不平衡) | 二分类(不平衡) | 采样方法、类别权重调整 |
选择建议:在医学诊断等正例稀缺场景,PR AUC 比 AUC-ROC 更能反映实际业务价值;回归任务需结合业务目标选择 RMSE/MSE 或 MAE。
场景:二分类任务(如垃圾邮件检测)
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt
# 生成模拟数据
X, y = make_classification(n_samples=1000, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测概率
y_proba = model.predict_proba(X_test)[:, 1]
# 计算 AUC-ROC
auc = roc_auc_score(y_test, y_proba)
print(f"AUC-ROC: {auc:.4f}")
# 绘制 ROC 曲线
fpr, tpr, _ = roc_curve(y_test, y_proba)
plt.plot(fpr, tpr, label=f'AUC = {auc:.2f}')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.show()
mean_squared_error
计算)场景:回归任务(未直接展示,但代码框架类似)
from sklearn.metrics import mean_squared_error
from math import sqrt
# 示例伪代码(需配合回归模型)
# y_pred = model.predict(X_test)
# rmse = sqrt(mean_squared_error(y_test, y_pred))
场景:聚类任务(如客户分群)
from sklearn.datasets import make_classification
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 生成模拟数据
X, _ = make_classification(n_samples=1000, n_features=2, random_state=42)
# 聚类模型
kmeans = KMeans(n_clusters=2, random_state=42)
labels = kmeans.fit_predict(X)
# 计算轮廓系数
score = silhouette_score(X, labels)
print(f"Silhouette Score: {score:.4f}")
场景:不平衡二分类任务(如欺诈检测)
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_recall_curve, auc
# 生成不平衡数据(正类占比 10%)
X, y = make_classification(n_samples=1000, n_classes=2, weights=[0.9, 0.1], random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练模型
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# 预测概率
y_proba = model.predict_proba(X_test)[:, 1]
# 计算 PR AUC
precision, recall, _ = precision_recall_curve(y_test, y_proba)
pr_auc = auc(recall, precision) # 注意参数顺序:先 recall 后 precision
print(f"PR AUC: {pr_auc:.4f}")
sklearn.datasets
生成模拟数据:
make_classification
:生成分类数据make_regression
:生成回归数据(未直接展示)make_blobs
:生成聚类数据(KMeans
示例中未展示,但原理相同)任务类型 | 模型 |
---|---|
分类任务 | LogisticRegression , RandomForestClassifier |
回归任务 | RandomForestRegressor |
聚类任务 | KMeans |
roc_auc_score
直接计算。mean_squared_error
结合 sqrt
计算。silhouette_score
直接计算。precision_recall_curve
获取曲线数据,再用 auc
计算(注意参数顺序:auc(recall, precision)
)。matplotlib
绘制。plt.plot(recall, precision, label=f'PR AUC = {pr_auc:.2f}')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend()
plt.show()