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的差值)
如图:
代码实现
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相交。
- 如果按照两条线距离的绝对值,那么绝对值最大的地方可能是模型反向预测的地方。
- 如果按照max(TPR-FPR),我们得到的结果时正向预测的最大值的点,但是无法得到模型区分能力最强的点。
- 如果取(TPR-FPR)的最小值和最大值,然后返回这两个值绝对值最大的那个原始值,例如2和-4返回-4,这样既可以知道两条曲线最大的距离是多少,也可以通过符号判断出此处模型是否已经反向预测。
我的代码是第三种,这种情况其实在真实场景中很小概率出现,但是从指标的意义上来说我觉得第三种是最贴近实际生产环境的。
上一篇: 协方差矩阵的模拟及独立性、相关性的判断
下一篇: uniapp 上传本地图片