分类模型评估指标实战:Python sklearn 5行代码计算6大指标(附样本不平衡案例)

📅 2026/7/5 12:08:19
分类模型评估指标实战:Python sklearn 5行代码计算6大指标(附样本不平衡案例)
分类模型评估指标实战Python sklearn 5行代码计算6大指标附样本不平衡案例在机器学习项目中分类模型的性能评估是验证模型有效性的关键环节。本文将带您快速掌握六大核心评估指标的计算方法并通过Python代码实现一键输出特别针对样本不平衡场景提供解决方案。1. 评估指标快速入门分类模型的评估不能仅凭直觉判断需要量化指标来客观衡量。以下是六个最常用的评估指标及其应用场景准确率Accuracy整体预测正确率适用于类别平衡的数据精确率Precision预测为正例的样本中实际为正的比例召回率Recall实际正例中被正确预测的比例F1分数精确率和召回率的调和平均数ROC曲线反映模型在不同阈值下的分类能力AUC值ROC曲线下面积衡量模型整体区分能力# 基础评估指标计算示例 from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score y_true [0, 1, 1, 0, 1] y_pred [0, 1, 0, 0, 1] print(f准确率: {accuracy_score(y_true, y_pred):.2f}) print(f精确率: {precision_score(y_true, y_pred):.2f}) print(f召回率: {recall_score(y_true, y_pred):.2f}) print(fF1分数: {f1_score(y_true, y_pred):.2f})2. 一键计算六大指标使用sklearn的classification_report可以一次性输出多个指标from sklearn.metrics import classification_report def evaluate_model(y_true, y_pred): print(classification_report(y_true, y_pred)) # ROC和AUC需要预测概率值 # 假设y_probs是模型输出的概率 # roc_auc roc_auc_score(y_true, y_probs) # print(fAUC值: {roc_auc:.2f}) # 示例使用 evaluate_model(y_true, y_pred)3. 样本不平衡场景实战当数据集中正负样本比例严重失衡时如1:99准确率会失去参考价值。以下是处理样本不平衡的三种方法3.1 重采样技术from imblearn.over_sampling import SMOTE from imblearn.under_sampling import RandomUnderSampler # 过采样少数类 smote SMOTE(sampling_strategyminority) X_res, y_res smote.fit_resample(X, y) # 欠采样多数类 under RandomUnderSampler(sampling_strategymajority) X_res, y_res under.fit_resample(X, y)3.2 类别权重调整from sklearn.linear_model import LogisticRegression # 按类别比例自动调整权重 model LogisticRegression(class_weightbalanced) model.fit(X_train, y_train)3.3 阈值移动技术from sklearn.metrics import precision_recall_curve # 获取预测概率 y_probs model.predict_proba(X_test)[:, 1] # 找到最佳阈值 precisions, recalls, thresholds precision_recall_curve(y_test, y_probs) f1_scores 2*precisions*recalls/(precisionsrecalls) best_threshold thresholds[np.argmax(f1_scores)]4. 可视化分析工具4.1 混淆矩阵可视化from sklearn.metrics import ConfusionMatrixDisplay import matplotlib.pyplot as plt ConfusionMatrixDisplay.from_predictions(y_true, y_pred) plt.title(混淆矩阵) plt.show()4.2 ROC曲线绘制from sklearn.metrics import RocCurveDisplay RocCurveDisplay.from_predictions(y_true, y_probs) plt.plot([0, 1], [0, 1], k--) # 随机猜测线 plt.title(ROC曲线) plt.show()5. 完整实战案例以下是一个处理医疗诊断数据样本不平衡的完整流程# 导入必要库 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, roc_auc_score # 创建不平衡数据集正负样本1:9 X, y make_classification(n_samples1000, weights[0.9], flip_y0.1) # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3) # 训练模型自动类别权重 model RandomForestClassifier(class_weightbalanced) model.fit(X_train, y_train) # 预测并评估 y_pred model.predict(X_test) y_probs model.predict_proba(X_test)[:,1] print(评估报告:) print(classification_report(y_test, y_pred)) print(fAUC值: {roc_auc_score(y_test, y_probs):.2f}) # 阈值优化 precisions, recalls, thresholds precision_recall_curve(y_test, y_probs) f1_scores 2*precisions*recalls/(precisionsrecalls) optimal_idx np.argmax(f1_scores) optimal_threshold thresholds[optimal_idx] print(f最佳F1分数: {f1_scores[optimal_idx]:.2f} (阈值{optimal_threshold:.2f}))通过这个案例可以看到在正样本仅占10%的情况下单纯看准确率会得到误导性结论而F1分数和AUC能更真实反映模型性能。