分类模型,模型评估指标KS的画图中有交叉是否正确?

发布于 2022-09-11 17:33:29 字数 1767 浏览 13 评论 0

我再利用真正例率和假正例率计算KS的时候发现,这两跟曲线会交叉,平时看到别人的都没有交叉,是我的代码错了?还是我的数据表现就是这样的?
这个是我的图

clipboard.png

这是别人的图(两个用的数据不一样的,我的关键问题是我的图这种交叉正常吗?)
至于我的图和别人的图的方向不一样这个我可以理解。
clipboard.png

from process.unsup_bin import AssignGroup
def cal_ks(rel_y,pre_y,is_plt):
    '''
    :param rel_y: 真实的分类,数组或者系列
    :param pre_y: 预测的分类 逻辑回归预测出来的概率值
    :param cut_number: 需要将阈值划分的区间数目 针对0-1的区间进行性划分
    :return: AUC ks
    '''
    bin = np.arange(0, 1.1, 0.1)
    #计算0-1的个数
    #组合成数据框方便计算
    data = pd.DataFrame({'rel_y':rel_y,'pre_y':pre_y})
    #split probabilt  accout to the cut point
    data['cut_point'] = data['pre_y'].map(lambda x: AssignGroup(x, bin))
    crossfreq = pd.crosstab(data['cut_point'], data['rel_y'] )
    god_ctn = crossfreq.sum()[0] #真实的好样本的数量
    bad_ctn = crossfreq.sum()[1]#真实的坏样本的数量
    crossdens =pd.DataFrame()
    crossdens[1]= 1 - crossfreq[1].cumsum(axis=0)/bad_ctn #真正率
    crossdens[0] =1 -  crossfreq[0].cumsum(axis=0)/god_ctn  #假正率
    # crossdens = 1- crossfreq.cumsum(axis=0) / crossfreq.sum()
    crossdens['gap'] = abs(crossdens[1] - crossdens[0])
    ks = crossdens[crossdens['gap'] == crossdens['gap'].max()]
    print([1] + crossdens[1].tolist())
    print( [1] + crossdens[1].tolist()+[0])
    print([0] + crossdens.index.tolist()+[1] )
    if is_plt ==1:
        plt.plot([0] + crossdens.index.tolist()+[1] , [1] + crossdens[1].tolist()+[0], label='真正例率TPR')
        plt.plot([0] + crossdens.index.tolist()+[1],  [1] + crossdens[0].tolist()+[0], label='假正例率FPR')
        # 显示图例
        plt.legend()
        # 显示图形
        plt.show()
    return ks,crossdens

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文