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

定义

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值的正负_第1张图片

代码实现

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,这样既可以知道两条曲线最大的距离是多少,也可以通过符号判断出此处模型是否已经反向预测。

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

你可能感兴趣的:(机器学习,数学)