欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kolmogorov-Smirnov KS 定义 python实现 KS值的正负

程序员文章站 2022-07-15 16:00:40
...

定义

TP: True Postive 预测正类,实际也是正类
FP:False Positive 预测正类,实际是负类
TN:True Negtive 预测负类,实际也是负类
FN:False Negtive 预测负类,实际是正类

TPR:TP / (TP+FN) 所有正例中有多少个正例被分出来。
FPR: FP / (TN+FP) 所有负例中有多少例子被分为正例。

模型预测的结果通常是一个概率值,概率值越大说明这个样本是正例的可能性越大,我们需要一个阈值(threshold)来定义多大的概率以上才是正例,通常这个值设为0.5,表示概率值大于0.5表示这个样本是正例,小于0.5表示这个样本是负例。

TPR曲线:横轴是阈值,纵轴是TPR,通过将阈值从1.0->0来画出很多个TPR的点,连起来得到TPR曲线。
FPR曲线:横轴是阈值,纵轴是FPR,通过将阈值从1.0->0来画出很多歌FPR的点,连起来得到FPR曲线。

KS值:TPR曲线和FPR曲线相距最远的距离值(同一个阈值的TPR和FPR的差值)

如图:
Kolmogorov-Smirnov KS 定义 python实现 KS值的正负

代码实现

from sklearn.metrics import roc_curve
import numpy as np

def ks(y_true, y_score):
    fpr, tpr, _ = roc_curve(y_true, y_score)

    diff = np.subtract(tpr, fpr)

    mins, maxs = diff.min(), diff.max()

    return mins if abs(mins) > abs(maxs) else maxs

按照数学的定义,距离是一个绝对值,在二分类问题的结果当中,一个不稳定的分类器可能导致TPR和FPR相交。

  1. 如果按照两条线距离的绝对值,那么绝对值最大的地方可能是模型反向预测的地方。
  2. 如果按照max(TPR-FPR),我们得到的结果时正向预测的最大值的点,但是无法得到模型区分能力最强的点。
  3. 如果取(TPR-FPR)的最小值和最大值,然后返回这两个值绝对值最大的那个原始值,例如2和-4返回-4,这样既可以知道两条曲线最大的距离是多少,也可以通过符号判断出此处模型是否已经反向预测。

我的代码是第三种,这种情况其实在真实场景中很小概率出现,但是从指标的意义上来说我觉得第三种是最贴近实际生产环境的。