ks值 机器学习 - CSDN
  • 分类模型评判指标 - KS曲线与KS值 从统计角度,我们知道KS是分析两组数据分布是否相同的检验指标。在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定...

    KS检验-风控角度

    分类模型评判指标 - KS曲线与KS值

    从统计角度,我们知道KS是分析两组数据分布是否相同的检验指标在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。

    一般来说。好人样本的分布同坏人样本的分布应该是有很大不同的,KS正好是有效性指标中的区分能力指标:KS用于模型风险区分能力进行评估,KS指标衡量的是好坏样本累计分布之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。

    横轴:阈值or数据集百分比

    纵轴:TPR(真正率)与FPR(假正率)

    实现:

    def compute_ks(data1,data2):
        df1 = DataFrame()
        df1['pred'] = data2
        df1['label'] = data1
        # 按照样本为正样本的概率值升序排序,也即坏样本的概率从高到低排序
        sorted_list = df1.sort_values(['pred'], ascending=[True])
        # print(sorted_list)
        """
          pred     label
    17  0.055966    0.0
    8   0.056266    0.0
    14  0.063441    0.0
    15  0.066217    0.0
    0   0.070942    0.0
    4   0.074102    0.0
    3   0.087055    0.0
    2   0.090387    0.0
    18  0.092003    1.0
    6   0.098286    0.0
    16  0.105280    0.0
    10  0.107256    0.0
    12  0.123415    0.0
    5   0.137829    0.0
    7   0.139731    0.0
    1   0.159905    0.0
    13  0.180385    0.0
    9   0.203199    0.0
    11  0.217903    0.0
        """
        total_good = sorted_list['label'].sum() # label为1的样本有多少个,真实为1的样本
        # print(sorted_list['label'])
        # print(total_good)
        total_bad = sorted_list.shape[0] - total_good # label为0的样本有多少个,真实为0的样本
    
        max_ks = 0.0
        good_count = 0.0
        bad_count = 0.0
        for index, row in sorted_list.iterrows(): #按照标签和每行拆开
            # print(index)
            # print('-'*5)
            # print(row)
            """
            index: 17
            row:
                pred     0.055966
                label    0.000000
            """
            if row['label'] == 0:
                bad_count += 1
            else:
                good_count += 1
            val = abs(bad_count/total_bad - good_count/total_good)
            max_ks = max(max_ks, val)
        return max_ks
    
    
    
    def cal_auc(labels, preds):
        """
        先排序,然后统计有多少正负样本对满足:正样本预测值>负样本预测值, 再除以总的正负样本对个数
        复杂度 O(NlogN), N为样本数
        """
        n_pos = sum(labels)
        n_neg = len(labels) - n_pos
        total_pair = n_pos * n_neg
    
        labels_preds = zip(labels, preds)
        labels_preds = sorted(labels_preds, key=lambda x: x[1])
        accumulated_neg = 0
        satisfied_pair = 0
        for i in range(len(labels_preds)):
            if labels_preds[i][0] == 1:
                satisfied_pair += accumulated_neg
            else:
                accumulated_neg += 1
    
        return satisfied_pair / float(total_pair)
    
    def approximate_auc(labels, preds, n_bins=100):
        """
        近似方法,将预测值分桶(n_bins),对正负样本分别构建直方图,再统计满足条件的正负样本对
        复杂度 O(N)
        这种方法有什么缺点?怎么分桶?
    
        """
        n_pos = sum(labels)
        n_neg = len(labels) - n_pos
        total_pair = n_pos * n_neg
    
        pos_histogram = [0 for _ in range(n_bins)]
        neg_histogram = [0 for _ in range(n_bins)]
        bin_width = 1.0 / n_bins
        for i in range(len(labels)):
            nth_bin = int(preds[i] / bin_width)
            if labels[i] == 1:
                pos_histogram[nth_bin] += 1
            else:
                neg_histogram[nth_bin] += 1
    
        accumulated_neg = 0
        satisfied_pair = 0
        for i in range(n_bins):
            satisfied_pair += (pos_histogram[i] * accumulated_neg + pos_histogram[i] * neg_histogram[i] * 0.5)
            accumulated_neg += neg_histogram[i]
    
        return satisfied_pair / float(total_pair)

    掉包侠的结果好像是错的,逃不掉自己写

    # official
    def calc_ks(y_true, y_prob, n_bins=10):
        percentile = np.linspace(0, 100, n_bins + 1).tolist()
        bins = [np.percentile(y_prob, i) for i in percentile]
        bins[0] = bins[0] - 0.01
        bins[-1] = bins[-1] + 0.01
        binids = np.digitize(y_prob, bins) - 1
        y_1 = sum(y_true == 1)
        y_0 = sum(y_true == 0)
        bin_true = np.bincount(binids, weights=y_true, minlength=len(bins))
        bin_total = np.bincount(binids, minlength=len(bins))
        bin_false = bin_total - bin_true
        true_pdf = bin_true / y_1
        false_pdf = bin_false / y_0
        true_cdf = np.cumsum(true_pdf)
        false_cdf = np.cumsum(false_pdf)
        ks_list = np.abs(true_cdf - false_cdf).tolist()
        ks = max(ks_list)
        return ks
    
    
    # 在网上看其他人实现的方案,但是感觉是错的,和我们的问题可能有出入,
    # 等之后再研究吧
    from scipy.stats import ks_2samp
    get_ks = lambda y_pred,y_true: ks_2samp(y_pred[y_true==1], y_pred[y_true!=1]).statistic
    get_ks(x,y)
    # mine
    ks = ks_2samp(y, y_pred)
    print("ks:",ks.statistic)

    首先我们有一份样本数据,包含两个指标,1.label(0,1) 2.信用分(假定是0到5)

    label指标属于原始数据,有过逾期的用户为0, bad clients; 信用一直良好的为1,good clients信用分为预测指标,模型输出数据(0到5)。

    作为一个常识,我们应该知道信用分的分布应该符合正态分布,也就是说接近5的人和接近0的人应该是极少极少的,大部分都在2到4之间。

    信用分是0到5,那现在想知道,如果我们要贷款给用户,那把钱贷给信用分为多少的人呢?
    在选择这个值的时候,我们需要考虑是希望能把钱贷给尽可能多的好人和尽可能少的坏人。如果我们选择信用分大于4的人,也许确实能过滤掉大部分坏人,但好人也被过滤掉了,用户也就少了。
    这个时候我们就需要ks值了。

    下面解释ks值:

    f(bad) 预测为负,真实为负除以所有真实负样本数。假正例率:

    • FPRate的意义是所有真实类别为0的样本中,预测类别为1的比例。(好人为1)

    f(good) 预测为负,真实为正除以所有真实正样本数。真正例率:

    • TPRate的意义是所有真实类别为1的样本中,预测类别为1的比例。(坏人为0)

    这里的负指的是bad clients,也就是逾期用户。而我们的目标就是希望找到一个值,区分bad和good用户,使f(bad)尽可能大,f(good)尽可能小。

    可以画出如下类似的图:

    横坐标代表信用分,纵坐标代表比率。 两条曲线分别是f(bad) 和 f(good)

    极端情况下,我们假设信用分小于5的都是坏人,这样所有的人都是坏人了f(bad)=1了,但f(good)=1(也就是右上角的两个点),表明模型还是很不好的,把好人也当坏人了。 而ks值在这里恰好可以找到一个信用分点,满足上述的条件:f(bad)大,f(good)小。

    如图所示,在横坐标2.5处,找到了我们的ks值0.4,在这个点我们找到了70%的真实坏人,而且只把30%的好人误认为是坏人了。 ks=70% - 30%; 相对于其它点来说已经是最好的了。

    所以,ks值是越大越好的,再考虑极端情况,如果有模型能找到所有的坏人(也就是f(bad)=100%),并且没有误判任何一个好人f(good)=0,那么它的ks值就=1了,属于完美模型了。 当然,对于风控模型,因为信用分几乎都符合正态分布,是不可能出现这种情况的,也只能说越大越好。

    def ks_2samp(data1, data2):
        """
        Computes the Kolmogorov-Smirnov statistic on 2 samples.
        This is a two-sided test for the null hypothesis that 2 independent samples
        are drawn from the same continuous distribution.
    
    功能:计算ks值,输出对应分割点和累计分布函数曲线图
    输入值:
    data: 而为数组或dataframe,包括模型得分和真实的标签
    score_col:一维数组或series,代表模型得分(一般为预测正类的概率)
    class_col:一维数组或series,代表真实的标签((0,1)or(-1,1))
    输出值:
    ks:ks值
    cdf_df:好坏人累积概率分布以及其差值gap
    
        Parameters
        ----------
        data1, data2 : sequence of 1-D ndarrays
            two arrays of sample observations assumed to be drawn from a continuous
            distribution, sample sizes can be different
        Returns
        -------
        statistic : float
            KS statistic
        pvalue : float
            two-tailed p-value
        Notes
        -----
        This tests whether 2 samples are drawn from the same distribution. Note
        that, like in the case of the one-sample K-S test, the distribution is
        assumed to be continuous.
        This is the two-sided test, one-sided tests are not implemented.
        The test uses the two-sided asymptotic Kolmogorov-Smirnov distribution.
        If the K-S statistic is small or the p-value is high, then we cannot
        reject the hypothesis that the distributions of the two samples
        are the same.
        Examples
        --------
        >>> from scipy import stats
        >>> np.random.seed(12345678)  #fix random seed to get the same result
        >>> n1 = 200  # size of first sample
        >>> n2 = 300  # size of second sample
        For a different distribution, we can reject the null hypothesis since the
        pvalue is below 1%:
        >>> rvs1 = stats.norm.rvs(size=n1, loc=0., scale=1)
        >>> rvs2 = stats.norm.rvs(size=n2, loc=0.5, scale=1.5)
        >>> stats.ks_2samp(rvs1, rvs2)
        (0.20833333333333337, 4.6674975515806989e-005)
        For a slightly different distribution, we cannot reject the null hypothesis
        at a 10% or lower alpha since the p-value at 0.144 is higher than 10%
        >>> rvs3 = stats.norm.rvs(size=n2, loc=0.01, scale=1.0)
        >>> stats.ks_2samp(rvs1, rvs3)
        (0.10333333333333333, 0.14498781825751686)
        For an identical distribution, we cannot reject the null hypothesis since
        the p-value is high, 41%:
        >>> rvs4 = stats.norm.rvs(size=n2, loc=0.0, scale=1.0)
        >>> stats.ks_2samp(rvs1, rvs4)
        (0.07999999999999996, 0.41126949729859719)
        """
        data1 = np.sort(data1)
        data2 = np.sort(data2)
        n1 = data1.shape[0]
        n2 = data2.shape[0]
        data_all = np.concatenate([data1, data2])
        cdf1 = np.searchsorted(data1, data_all, side='right') / (1.0*n1)
        cdf2 = np.searchsorted(data2, data_all, side='right') / (1.0*n2)
        d = np.max(np.absolute(cdf1 - cdf2))
        # Note: d absolute not signed distance
        en = np.sqrt(n1 * n2 / float(n1 + n2))
        try:
            prob = distributions.kstwobign.sf((en + 0.12 + 0.11 / en) * d)
        except:
            prob = 1.0
    
        return Ks_2sampResult(d, prob)

    在实际情况下,我们一般计算违约概率的ks值,这时是不存在NAN值的。所以以上三种方法计算ks值均可。但是当我们计算单变量的ks值时,有时数据质量不好,存在NAN值时,继续采用ks_calc_auc和ks_calc_2samp就会存在问题。

    解决办法有两个 1. 提前去除数据中的NAN值 2. 直接采用ks_calc_cross计算。 


    参考:

    houhaichao830

    4.4.2分类模型评判指标(四) - ROC,AUC,GINI,KS,Lift,Gain,MSE总结

    python绘制 

    auc和ks是强相关的指标

    互联网金融:Vintage的应用

    astype转成一样的浮点数才可以进行减法操作!!!要dtype查看,之前这里报错辽~?

    展开全文
  • KS值— —概念— —KS值越大,表示模型能够将正、负客户区分开的程度越大。 通常来讲,KS>0.2即表示模型有较好的预测准确性。柯尔莫哥洛夫-斯米尔诺夫检验(Колмогоров-Смирнов...

    title: ‘二分类模型评价指标-KS值’
    author: “”
    date: “2018年7月13日”
    output: word_document

    knitr::opts_chunk$set(echo = TRUE,eval=FALSE)
    

    1. KS值

    1.1 概念

      KS值越大,表示模型能够将正、负客户区分开的程度越大。
      通常来讲,KS>0.2即表示模型有较好的预测准确性。

      柯尔莫哥洛夫-斯米尔诺夫检验(Колмогоров-Смирнов检验)基于累计分布函数,用以检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同。

      绘制方式与ROC曲线略有相同,都要计算TPR和FPR。但是TPR和FPR都要做纵轴,横轴为把样本分成多少份。
    步骤:

    1. 按照分类模型返回的概率降序排列
    2. 把0-1之间等分N份,等分点为阈值,计算TPR、FPR
    3. 对TPR、FPR描点画图即可

    KS值即为Max(TPR-FPR)

    ###1.2 代码

      提供R代码一份,仅供参考。

    # 获取数据 --------------------------------------------------------------------
    #以ROCR包里自带数据为例
    
    # 获取数据 --------------------------------------------------------------------
    #以ROCR包里自带数据为例
    library(ROCR)
    data(ROCR.simple)
    result <- data.frame(pre_prob=ROCR.simple$predictions,true_label=ROCR.simple$labels)
    #概率大于0.5为正类,小于0.5负类
    result <- within(result,{
      pre_label <- NULL
      pre_label[pre_prob>0.5] <- 1
      pre_label[pre_prob<=0.5] <- 0
    })
    head(result)
    
    
    #install.packages("gmodels")
    library(gmodels)
    CrossTable(x=result$true_label,y=result$pre_label,prop.chisq=FALSE)
    #画PRC曲线:横轴TPR纵轴Precision.Threshold
    TPR <- NULL
    FPR <- NULL
    for(i in seq(from=1,to=0,by=-0.1)){
      #判为正类实际也为正类
      TP <- sum((result$pre_prob >= i) * (result$true_label == 1)) 
      #判为正类实际为负类
      FP <- sum((result$pre_prob >= i) * (result$true_label == 0))
      #判为负类实际为负类
      TN <- sum((result$pre_prob < i) * (result$true_label == 0)) 
      #判为负类实际为正类
      FN <- sum((result$pre_prob < i) * (result$true_label == 1)) 
      TPR <- c(TPR,TP/(TP+FN))
      FPR <- c(FPR,FP/(FP+TN))
    }
    library(ggplot2)
    ggplot(data=NULL,mapping = aes(x=seq(0,1,0.1),y=TPR))+
      geom_point()+
      geom_smooth(se=FALSE,formula = y ~ splines::ns(x,10), method ='lm')+
      geom_line(mapping = aes(x=seq(0,1,0.1),y=FPR),linetype=6)
    max(TPR-FPR)#KS值为0.69
    
    

    下面的图坐标轴标题有误,纵轴tpr/fpr,横轴为threshold阈值(感谢sinat_27339001指出)

    knitr::include_graphics("../Picture/Pic09-KS.png",dpi = 600)
    

    这里写图片描述
    PS:并没有觉得这个KS值有什么用啊~

    2. Lift值

      以一个例子计算:
      对于某二分类模型,针对1000名顾客打分。如果实际数据中有90名顾客产生购买行为。那么,Random Rate=9%。按照概率降序排序,取前10%。如果其中60个人产生购买行为,那么排名前10%的用户其实际购买率的Lift=(60/100)/9%=6.67

    3. 捕获率及响应率

    1. 按照概率降序排序,0-1等分,等分点为阈值
    2. 响应率为各个等分区间内的属于正1的占该区间或者累计区间总体观察数量的百分比
    3. 捕获率为各个等分区间内的属于正1的占该区间或者累计区间总体观察属于正1数量的百分比

                          2017-06-05 于杭州
                          2018-07-13 于南京市建邺区新城科技园

    展开全文
  • 目录 背景介绍 一ROC曲线和AUC值 二 KS曲线 三 GINI系数 ...参考另一篇:[机器学习] 性能评估指标(精确率、召回率、ROC、AUC) ...在模型建立之后,必须对...在分类模型评估中,最常用的两种评估标准就是KS值和GIN...

    目录

    背景介绍

    一 ROC曲线和AUC值

    二 KS曲线

    三 GINI系数

    四 Lift , Gain

    五 模型稳定度指标PSI


    参考另一篇:[机器学习] 性能评估指标(精确率、召回率、ROC、AUC) 

    背景介绍

    在模型建立之后,必须对模型的效果进行评估,因为数据挖掘是一个探索的过程,评估-优化是一个永恒的过程。在分类模型评估中,最常用的两种评估标准就是KS值和GINI, AUC值.可能有人会问了,为什么不直接看正确率呢?你可以这么想,如果一批样本中,正样本占到90%,负样本只占10%,那么我即使模型什么也不做,把样本全部判定为正,也能有90%的正确率咯?所以,用AUC值够保证你在样本不均衡的情况下也能准确评估模型的好坏,而KS值不仅能告诉你准确与否,还能告诉你模型对好坏客户是否有足够的区分度。

    这里先整体给大家一个直观的介绍。

    概括:

    Confusion Matrix -> Lift,Gain,ROC。

    ROC -> AUC,KS -> GINI。

    在介绍之前,我们先重新明确一下这些图表的名称,中文、英文、简称,全部来熟悉一下:

    记住这个之后,我们来理解一下他们之间的关系。

    拟人化概括

    其实,这些图之间的关系不是很复杂。我尝试着用一个小故事概括一下人物之间的关系。

    故事是这样的:

    首先,混淆矩阵是个元老,年龄最大也资历最老。创建了两个帮派,一个夫妻帮,一个阶级帮。

    之后,夫妻帮里面是夫妻两个,一个Lift曲线,一个Gain曲线,两个人不分高低,共用一个横轴。

    再次,阶级帮里面就比较混乱。

               1. 帮主是ROC曲线。

               2. 副帮主是KS曲线,AUC面积

               3. AUC养了一个小弟,叫GINI系数

     

    下图是曲线与指标的综合对比图

     

    一 ROC曲线和AUC值

    在逻辑回归、随机森林、GBDT、XGBoost这些模型中,模型训练完成之后,每个样本都会获得对应的两个概率值,一个是样本为正样本的概率,一个是样本为负样本的概率。把每个样本为正样本的概率取出来,进行排序,然后选定一个阈值,将大于这个阈值的样本判定为正样本,小于阈值的样本判定为负样本,然后可以得到两个值,一个是真正率,一个是假正率。

    真正率即判定为正样本且实际为正样本的样本数/所有的正样本数,假正率为判定为正样本实际为负样本的样本数/所有的负样本数。每选定一个阈值,就能得到一对真正率和假正率,由于判定为正样本的概率值区间为[0,1],那么阈值必然在这个区间内选择,因此在此区间内不停地选择不同的阈值,重复这个过程,就能得到一系列的真正率和假正率,以这两个序列作为横纵坐标,即可得到ROC曲线了。而ROC曲线下方的面积,即为AUC值。

    对于AUC值,也许有一个更直观的理解,那就是,在按照正样本概率值对所有样本排序后,任意选取一对正负样本,正样本排在负样本之前的概率值,即为AUC值。也就是说,当所有的正样本在排序后都能排在负样本之前时,就证明所有的样本都被正确分类了,此时的AUC值也会为1。那么AUC值也就很好算了,如果有N个负样本,其中正样本有M个,那么可取的所有带正样本的样本对数对于排在第一位的正样本来说,有M+N-1个,但其中包含M-1对(正,正)的样本,而对于后面所有的正样本而言,能够取到的正样本概率大于负样本对数肯定小于其位置-1。


    二 KS曲线

    KS曲线其实数据来源和本质和ROC曲线是一致的,只是ROC曲线是把真正率和假正率当作横纵轴,而K-S曲线是把真正率和假正率都当作是纵轴,横轴则由选定的阈值来充当。

    KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估,指标衡量的是好坏样本累计分部之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。

    KS的计算步骤如下:
    1. 计算每个评分区间的好坏账户数。
    2. 计算每个评分区间的累计好账户数占总好账户数比率(good%)和累计坏账户数占总坏账户数比率(bad%)。
    3. 计算每个评分区间累计坏账户占比与累计好账户占比差的绝对值(累计good%-累计bad%),然后对这些绝对值取最大值即得此评分卡的KS值。

     

    下面这一段解释得更详细的KS和AUC的区别是参考的这篇博客:

    https://blog.csdn.net/sinat_30316741/article/details/80018932

    由于KS值能找出模型中差异最大的一个分段,因此适合用于cut_off,像评分卡这种就很适合用ks值来评估。但是ks值只能反映出哪个分段是区分最大的,而不能总体反映出所有分段的效果,因果AUC值更能胜任。
    ROC值一般在0.5-1.0之间。值越大表示模型判断准确性越高,即越接近1越好。ROC=0.5表示模型的预测能力与随机结果没有差别。
    KS值表示了模型将+和-区分开来的能力。值越大,模型的预测准确性越好。一般,KS>0.2即可认为模型有比较好的预测准确性。
    KS值一般是很难达到0.6的,在0.2~0.6之间都不错。一般如果是如果负样本对业务影响极大,那么区分度肯定就很重要,此时K-S比AUC更合适用作模型评估,如果没什么特别的影响,那么用AUC就很好了。

    区分度指标(KS)是度量具体模型下正常样本和违约样本分布的最大差距,首先按照样本的信用分数或预测违约率从小到大进行排序,然后计算每一个分数或违约率下好坏样本的累计占比。正常和违约样本的累计占比差值的最大值即为区分度指标(KS)

     

    风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)
     

    实际上是就是你建立好模型后,按照评分从大到小排列后:检验你所谓的好客户和坏客户两类客户分布的差异性,即模型区分度。分布根据好坏两个客户评分的累积密度分布曲线,画出来的:比如好坏客户共100个,按照评分排序后前百分之十的客户即10个,其中好的客户有8个,坏的客户有2个(总体样本中好客户80个,坏客户20个),那么前10%的客户的累积密度为:好客户10%,坏客户10%。同理前20%的客户中其中好的客户有15个,坏的客户有5个那么前20%的客户的累积密度为:好客户18.75%,坏客户25%
    以此类推可以得出前30%,40%。。。。100%的累积密度。以10%,20%,30%。。。100%为横坐标,以两类客户累积密度为纵坐标,即可画出KS曲线图。

     

    三 GINI系数

     

    ·GINI系数:也是用于模型风险区分能力进行评估。
    GINI统计值衡量坏账户数在好账户数上的的累积分布与随机分布曲线之间的面积,好账户与坏账户分布之间的差异越大,GINI指标越高,表明模型的风险区分能力越强。

    GINI系数的计算步骤如下:
    1. 计算每个评分区间的好坏账户数。
    2. 计算每个评分区间的累计好账户数占总好账户数比率(累计good%)和累计坏账户数占总坏账户数比率(累计bad%)。
    3. 按照累计好账户占比和累计坏账户占比得出下图所示曲线ADC。
    4. 计算出图中阴影部分面积,阴影面积占直角三角形ABC面积的百分比,即为GINI系数。

    四 Lift , Gain

    前三个指标应用场景更多一些
    Lift图衡量的是,与不利用模型相比,模型的预测能力“变好”了多少,lift(提升指数)越大,模型的运行效果越好。
    Gain图是描述整体精准度的指标。
    计算公式如下:
                                           
                                                           
                      
    作图步骤:
    1. 根据学习器的预测结果(注意,是正例的概率值,非0/1变量)对样本进行排序(从大到小)-----这就是截断点依次选取的顺序
    2. 按顺序选取截断点,并计算Lift和Gain ---也可以只选取n个截断点,分别在1/n,2/n,3/n等位置
    例图:

       
     

     

    五 模型稳定度指标PSI

    群体稳定性指标PSI(Population Stability Index)是衡量模型的预测值与实际值偏差大小的指标。

    PSI = sum((实际占比-预期占比)* ln(实际占比/预期占比))

    举例:

    比如训练一个logistic回归模型,预测时候会有个概率输出p。
    测试集上的输出设定为p1吧,将它从小到大排序后10等分,如0-0.1,0.1-0.2,......。
    现在用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。
    实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。
    意义就是如果模型跟稳定,那么p1和p2上各区间的用户应该是相近的,占比不会变动很大,也就是预测出来的概率不会差距很大。

    一般认为PSI小于0.1时候模型稳定性很高,0.1-0.25一般,大于0.25模型稳定性差,建议重做。

    PS:除了按概率值大小等距十等分外,还可以对概率排序后按数量十等分,两种方法计算得到的psi可能有所区别但数值相差不大。

     

    参考:

    1. https://blog.csdn.net/Orange_Spotty_Cat/article/details/82425113
    2. https://blog.csdn.net/shy19890510/article/details/79501582
    展开全文
  • 前面 分类问题一般围绕错误率展开,即错分样本占据的比例。而分类算法可以给出预测概率,那么通过设置不同的阈值,来获得更好的结果,此时混淆矩阵就是分类问题评价指标的基础。 混淆矩阵 假设二分类问题,P代表正类...

    前面

    分类问题一般围绕错误率展开,即错分样本占据的比例。而分类算法可以给出预测概率,那么通过设置不同的阈值,来获得更好的结果,此时混淆矩阵就是分类问题评价指标的基础。

    混淆矩阵

    假设二分类问题,P代表正类,N代表负类。

    正类 负类
    正类 TP(真正类) FP(假正类)
    负类 FN(假负类) TN (真负类)

    TP:正类被预测为正类的数量
    FP:正类被预测为负类的数量
    TN:负类被预测为负类的数量
    FN:负类被预测为正类的数量
    假设判断为正类的概率阈值设置为0,所有的样本划分为正类,如果数据中是正负类极端不平衡的,可能Precision(精确率)可能比较高,但是算法没有什么用。
    定义几个值:
    查全率/召回率:正类正确分类的概率
    TPR=TP/(TP+FN)TPR = TP / (TP + FN)
    负类分错的概率:
    FPR=FP/(FP+TN)FPR = FP / (FP + TN)

    AUC/KS

    - auc
    横轴: FPR
    纵轴: TPR
    画出的曲线叫ROC 曲线,auc=ROC 曲线与横轴之间的面积

    - ks
    横轴: 评分区间划分段
    纵轴: FPR TPR
    ks=两条曲线之间的最大差值的绝对值

    - 举个梨子
    6个样本
    真实标签: y_true = (1,1,0,0,1,1)
    预测概率:y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
    概率取值范围在[0,1],划分为10个,横轴依次取值
    (0.1,0.2,0.3,…,1),也就是判定样本预测是正负类的阈值分别是(0.1,0.2,0.3,…,1)。

    1. thres = 0.1, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (1,1,1,1,1,1)
      y_true = (1,1,0,0,1,1)
      TPR=4/4=1TPR = 4/4 = 1
      FPR=2/2=1FPR =2/2 = 1
    2. thres = 0.2, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (1,1,1,1,1,1)
      y_true = (1,1,0,0,1,1)
      TPR=4/4=1TPR = 4/4 = 1
      FPR=2/2=1FPR =2/2 = 1
    3. thres = 0.3, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (1,1,1,1,1,1)
      y_true = (1,1,0,0,1,1)
      TPR=4/4=1TPR = 4/4 = 1
      FPR=2/2=1FPR =2/2 = 1
    4. thres = 0.4, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (1,1,1,0,1,1)
      y_true = (1,1,0,0,1,1)
      TPR=4/4=1TPR = 4/4 = 1
      FPR=1/2=0.5FPR =1/2 = 0.5
    5. thres = 0.5, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (0,1,1,0,1,1)
      y_true = (1,1,0,0,1,1)
      $TPR = 3/4 $
      FPR=1/2=0.5FPR =1/2 = 0.5
    6. thres = 0.6, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (0,1,0,0,1,1)
      y_true = (1,1,0,0,1,1)
      TPR=3/4TPR = 3/4
      FPR=0/2=0FPR =0/2=0
    7. thres = 0.7, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (0,1,0,0,1,0)
      y_true = (1,1,0,0,1,1)
      TPR=2/4TPR = 2/4
      FPR=0/2=0FPR =0/2=0
    8. thres = 0.8, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (0,0,0,0,1,0)
      y_true = (1,1,0,0,1,1)
      TPR=1/4TPR = 1/4
      FPR=0/2=0FPR =0/2=0
    9. thres = 0.9, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (0,0,0,0,0,0)
      y_true = (1,1,0,0,1,1)
      TPR=0/4=0TPR = 0/4=0
      FPR=0/2=0FPR =0/2 = 0
    10. thres = 1.0, if y>=thres : y=positive(P) else y=negative(N)
      y_predict = (0.4,0.7,0.55,0.3,0.8,0.65)
      y_pred_label = (0,0,0,0,0,0)
      y_true = (1,1,0,0,1,1)
      TPR=0/4=0TPR = 0/4=0
      FPR=0/2=0FPR =0/2 = 0

    画图

    评分区间段:(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)
    TPR:(1,1,1, 1, 3/4, 3/4, 2/4, 1/4, 0, 0)
    FPR:(1,1,1,1/2, 0, 0, 0, 0, 0, 0)

    # -*- coding: UTF-8 -*-
    import numpy as np
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    x=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
    TPR=[1,1,1, 1,   3/4, 3/4,  2/4, 1/4,  0, 0]
    FPR=[1,1,1,1/2,  0,   0,     0,     0,    0, 0]
    plt.title('auc/ks')
    plt.plot(TPR, FPR, color='green', label='ROC')
    plt.plot(x, TPR, color='red', label='TPR')
    plt.plot(x, FPR, color='black', label='FPR')
    print('KS:',max(abs(np.array(TPR)-np.array(FPR))))
    plt.legend()  
    

    在这里插入图片描述

    展开全文
  • KS_AUC的详解

    2020-07-30 23:32:03
    计算KS 和AUC 过程;柯尔莫可洛夫-斯米洛夫检验(Kolmogorov–Smirnov test,K-S test)
  • KS检验及其在机器学习中的应用什么是KS检验Kolmogorov–Smirnov 检验,简称KS检验,是统计学中的一种非参数假设检验,用来检测单样本是否服从某一分布,或者两样本是否服从相...
  • KS横轴为阈值,纵轴为不同阈值下的TPR,FPR,KS值是MAX(TPR - FPR),即两曲线相距最远的距离 ks值 含义 > 0.3 模型预测性较好 0,2~0.3 模型可用 0~0.2 模型预测能力较差 < 0 模型...
  • 根据要进行的机器学习的类型,有许多度量标准可以衡量机器学习模型的性能。在本文中,我们研究了分类和回归模型的性能指标,并讨论了优化效果更好的指标。有时,要看的指标会根据最初要解决的问题而有所不同。 分类...
  • 机器学习流程介绍

    2018-03-27 09:34:31
    本文只是对机器学习的流程做一个简单的描述,每个环节涉及的东西很多,不是本文介绍的范围,对其中比较重要的知识点稍微提及一下,具体的可以参考其他文章学习。先上一张流程图。机器学习从数据准备到上线流程:接...
  • 机器学习思维导图

    2018-11-26 11:45:15
    机器学习思维导图机器学习思维导图思维导图解释需求分析与数据获取数据预处理特征工程算法模型模型评估 机器学习思维导图 思维导图解释 需求分析与数据获取 在需求分析与数据获取中,我们往往要考虑以下几个...
  • 机器学习中,常用到的AUC能很好地描述模型整体性能的高低。除了AUC,还有一个指标也能达到相同的效果,那便是ks。不仅如此,ks还能给出最佳的划分阈值。那么,ks具体是什么指标?计算方式和AUC有何不同? KS评价...
  • 机器学习中的度量指标:ROC曲线,AUC,K-S曲线 首先,回顾一下二分类问题的一些定义: 预测 1 0 实 1 TP FN ​际 0 FP TN 上表中,四个项分别为:TP真阳性;FN假阴性;FP假阳性;TN真阴性 注意,真假表示预测的...
  • 评价指标与机器学习任务具有相关性。分类、回归、排序、聚类、主题建模等任务都有不同的度量标准。一些度量标准,如精度、召回率,可用于多个任务。分类、回归和排序是监督学习的例子,它包含了大多数机器学习应用...
  • 机器之心平台来源:腾讯技术工程模型可...本文对机器学习模型可解释性相关资料汇总survey。综述机器学习业务应用以输出决策判断为目标。可解释性是指人类能够理解决策原因的程度。机器学习模型的可解释性越高,人...
  • KS-检验与t-检验等方法不同的是KS检验不需要知道数据的分布情况,可以算是一种非参数检验方法。当然这样方便的代价就是当检验的数据分布符合特定的分布时,KS-检验的灵敏度没有相应的检验来的高。在样本量比较小的...
  • 正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟形曲线。 使用K-S检验一个数列是否服从正态分布、两个数列是否服从相同的分布。...在进行机器学习过程中,需要对数据集进行异...
  • 导语:机器学习在风控中的作用究竟如何,有哪些关键技术,其优势与缺点又有哪些呢? 一个普遍的看法是,机器学习等人工智能技术会最先在金融领域落地。金融行业是最早实现信息化的行业,有...
  • IV衡量的是某一个变量的信息量,从公式来看的话,相当于是自变量WOE的一个加权求和,其的大小决定了自变量对于目标变量的影响程度,对于分组 i ,其对应的IV参考下图,其中n是分组个数,注意,在变量的任何...
  • 1. 混淆矩阵---确定截断点后,评价学习器性能 TP(实际为正预测为正),FP(实际为负但预测为正),FN(实际为正但预测为负),TN(实际为负预测为负) 通过混淆矩阵我们可以给出各指标的: 查全率(召回率,...
  • 精确率、召回率、F1、AUC和ROC曲线都是评价模型好坏的指标,那么它们之间有什么不同,又有什么联系呢。下面让我们分别来看一下这几个指标分别是什么意思。 针对一个二分类问题,将实例分成正类(postive)或者负类...
1 2 3 4 5 ... 20
收藏数 1,988
精华内容 795
热门标签
关键字:

ks值 机器学习