关于混淆矩阵、ROC曲线和KS值

一、定义

混淆矩阵是分类器模型性能评估中常用的一种工具,也可以称为误差矩阵。该矩阵展示了分类器在预测过程中真实类别与预测类别之间的对比情况,包括真实为正/负类而被预测为正/负类的样本数。

预测值:正例预测值:负例
真实值:正例TPFN
真实值:负例FPTN

二、计算

混淆矩阵可以用来评价分类模型的性能,并帮助我们更好地了解模型在不同分类情况下的表现,常用于二分类问题。通过分析混淆矩阵的各个元素,在实际应用中可得到以下信息:

  1. 精确度(Precision):精确度是指预测为“正例”(Positive)的样本中实际为“正例”的比例。计算公式为 TP/(TP+FP)。

  2. 召回率(Recall):召回率是指实际为“正例”的样本中被预测为“正例”的比例。计算公式为 TP/(TP+FN)。

  3. F1 值:F1 值是精确度和召回率的调和平均数,它是一个综合评价指标,可以综合考虑精确度和召回率的影响。计算公式为 2*precision*recall/(precision+recall)。

  4. 准确率(Accuracy):准确率是指预测正确的样本占总样本数的比例。计算公式为 (TP+TN)/(TP+FP+FN+TN)。

通过计算上述指标,我们可以对分类模型在不同方面的性能表现进行评估,从而更好地优化模型。此外,混淆矩阵还可以帮助我们观察模型在不同分类情况下的表现,如是否存在偏差、误判率高的情况等。因此,混淆矩阵是评价分类模型性能的重要工具之一。

三、ROC曲线

ROC曲线(Receiver Operating Characteristic curve)是评估二分类模型性能的重要工具,通常用于检验分类器的准确性。ROC曲线是以假阳性率(False Positive Rate,FPR)为横坐标,真阳性率(True Positive Rate,TPR)为纵坐标,将所有可能的预测阈值下的TPR和FPR进行绘制得到的曲线。

ROC曲线可以展示出分类器在不同阈值下的综合性能,而曲线下面积(AUC)则是ROC曲线评价指标中的常用参数,可以衡量区分正负样本的能力。AUC越大,说明模型的性能越好。

计算公式:TPR = TP / (TP + FN)       /     FPR = FP / (FP + TN)

四、KS值/KS曲线

KS(Kolmogorov-Smirnov)值是对两个样本分布是否相同的一种检验方法,它的计算方法是将两个样本的累积分布函数(CDF)相减,得到最大差距,即KS值。在分类问题中,我们可以将正例和负例样本的预测概率作为“样本”,计算它们的预测概率分布,然后通过比较它们的CDF曲线来计算KS值。计算公式:KS=max(TPR−FPR)

KS曲线是一种用于评估分类器性能的常用工具,可以直观地展示正负样本之间的分布差异及模型在不同阈值下的分类性能。

说明K-S曲线的做法: 

1、将样本按照模型预测概率从高到低排序;

2、从最小到最大的预测概率取一个作为分类器的阈值,将样本分为“正例”和“负例”,统计每个阈值下的正负样本数量及其累积比例;

3、根据样本的累积比例,绘制出正负样本的累积分布函数曲线(CDF曲线),其中蓝色曲线表示“正例”样本的CDF曲线,红色曲线表示“负例”样本的CDF曲线,X轴表示预测概率,Y轴表示样本的累积比例;

4、计算每个阈值下的TPR和FPR值,并计算每个阈值下的KS值;

5、在K-S曲线上绘制每个阈值下的KS值对应的点,得到KS曲线。

通常情况下,KS值的取值范围在0和1之间,KS值越大,代表模型对正负样本的区分能力越强。一般来说,模型构建初期KS基本要满足在0.3以上;而当KS值大于0.6时,认为分类器的性能非常优秀。

五、相关代码尝试

from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc
import matplotlib.pyplot as plt
from pylab import mpl
import pandas as pd

def calculate_metrics(df):
    """
    基于pandas和scikit-learn库计算分类器的相关指标。
    输入:一个包含真实值和预测值的DataFrame。必需包含两列,分别命名为'y_true'和'y_pred'。
    输出:一个字典,包含混淆矩阵和Accuracy、Precision、Recall、F1-Score、ROC曲线、KS值等指标。
    """
    # 检查输入数据是否包含'y_true'和'y_pred'两列
    if 'y_true' not in df.columns or 'y_pred' not in df.columns:
        raise ValueError("输入DataFrame必需包含'y_true'和'y_pred'两列。")

    # 计算混淆矩阵
    tn, fp, fn, tp = confusion_matrix(df['y_true'], df['y_pred']).ravel()

    # 计算准确率(Accuracy)
    acc = accuracy_score(df['y_true'], df['y_pred'])

    # 计算精确率(Precision)
    prec = precision_score(df['y_true'], df['y_pred'])

    # 计算召回率(Recall)
    rec = recall_score(df['y_true'], df['y_pred'])

    # 计算F1值(F1-Score)
    f1 = f1_score(df['y_true'], df['y_pred'])

    # 计算ROC曲线的真正率、假正率和阈值
    fpr, tpr, thresholds = roc_curve(df['y_true'], df['y_pred'])

    # 计算ROC曲线下面积(AUC)
    auc_score = auc(fpr, tpr)

    # 计算KS值
    ks = max(abs(tpr - fpr))

    # 绘制ROC曲线
    plt.figure(figsize=(6, 6))
    plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % auc_score)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic')
    plt.legend(loc="lower right")

    # 将计算结果封装成字典并返回
    metrics_dict = {
        'tn(两负)': tn,
        'fp(负正)': fp,
        'fn(正负)': fn,
        'tp(正正)': tp,
        'accuracy': acc,
        'precision': prec,
        'recall': rec,
        'f1_score': f1,
        'fpr(假正率)': fpr,
        'tpr(真正率)': tpr,
        'thresholds(阈值)': thresholds,
        'auc_score(ROC曲线下面积)': auc_score,
        'ks_score(ks值)': ks
    }

    return metrics_dict

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值