数据挖掘 ROC曲线

一、题目

  • 根据以下表格画出 ROC 曲线
待测样本123456789
样本标记1+++-+----
样本标记2-+--+-++-

二、解题思路

  • 输入一个真实结果
  • 划分阈值:将前 i 个划分为正例,后 n-i 个划分为负例,作为预测结果
  • 计算在每个划分下的TP,TN,FN,FP 及 TPR,FPR
  • 画 ROC 曲线图:以在不同划分下得出的 TPR 为 x 轴,FPR 为 y 轴画图
  • 计算 AUC :计算 ROC 曲线的面积

三、代码实现

# coding = utf - 8
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy


class TestData:
    def __init__(self, x):
        self.x = x
        self.TPR = numpy.zeros(len(self.x) - 1)
        self.FPR = numpy.zeros(len(self.x) - 1)

    def roc(self):
        y = numpy.zeros(len(self.x))            # 预测情况
        for i in range(len(self.x) - 1):
            tp = numpy.zeros(len(self.x) - 1)
            fp = numpy.zeros(len(self.x) - 1)
            tn = numpy.zeros(len(self.x) - 1)
            fn = numpy.zeros(len(self.x) - 1)
            for j in range(len(self.x)):
                if j <= i:                      # 划分阈值
                    y[j] = 1
                else:
                    y[j] = 0
            print('x =', self.x)
            print('y =', y)
            for k in range(len(self.x)):
                if self.x[k] == 1:
                    if y[k] == 1:
                        tp[i] += 1
                    else:
                        fn[i] += 1
                else:
                    if y[k] == 1:
                        fp[i] += 1
                    else:
                        tn[i] += 1
            self.TPR[i] = tp[i] / (tp[i] + fn[i])             # 计算 TPR
            self.FPR[i] = fp[i] / (tn[i] + fp[i])             # 计算 FPR
            print('TP =', tp[i], ' FN =', fn[i], ' TPR =', self.TPR[i])
            print('FP =', fp[i], ' TN =', tn[i], ' FPR =', self.FPR[i])

        # 计算 AUC
        print('TPR =', self.TPR)
        print('FPR =', self.FPR)
        auc = 0
        for k in range(len(self.x)-2):
            auc = auc + (self.TPR[k+1] - self.TPR[k]) * (self.FPR[k] + self.FPR[k+1])
        auc = 0.5 * auc
        print('AUC =', auc, '\n')


if __name__ == "__main__":
    x1 = [1, 1, 1, 0, 1, 0, 0, 0, 0]  # 真实结果1
    x2 = [0, 1, 0, 0, 1, 0, 1, 1, 0]  # 真实结果2
    xx1 = TestData(x1)
    xx1.roc()
    xx2 = TestData(x2)
    xx2.roc()

    # 画 ROC 曲线
    plt.figure(1)
    plt.xlabel('TPR')
    plt.ylabel('FPR')
    plt.xlim(0, 1)
    plt.ylim(0, 1)
    choose_font = mpl.font_manager.FontProperties(fname='C:\Windows\Fonts\simfang.ttf')  # 为显示中文,指定默认字体
    plt.title(u'ROC曲线', fontproperties=choose_font)
    plt.plot(xx1.TPR, xx1.FPR, linestyle='-', marker='o', color='r', label='x1')
    plt.plot(xx2.TPR, xx2.FPR, linestyle='--', marker='^', color='b', label='x2')
    plt.legend(loc='best')  # 使其在同一一个坐标图上显示
    plt.show()

四、输出结果

x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 0. 0. 0. 0. 0. 0. 0. 0.]
TP = 1.0  FN = 3.0  TPR = 0.25
FP = 0.0  TN = 5.0  FPR = 0.0
x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 1. 0. 0. 0. 0. 0. 0. 0.]
TP = 2.0  FN = 2.0  TPR = 0.5
FP = 0.0  TN = 5.0  FPR = 0.0
x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 1. 1. 0. 0. 0. 0. 0. 0.]
TP = 3.0  FN = 1.0  TPR = 0.75
FP = 0.0  TN = 5.0  FPR = 0.0
x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 1. 1. 1. 0. 0. 0. 0. 0.]
TP = 3.0  FN = 1.0  TPR = 0.75
FP = 1.0  TN = 4.0  FPR = 0.2
x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 1. 1. 1. 1. 0. 0. 0. 0.]
TP = 4.0  FN = 0.0  TPR = 1.0
FP = 1.0  TN = 4.0  FPR = 0.2
x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 1. 1. 1. 1. 1. 0. 0. 0.]
TP = 4.0  FN = 0.0  TPR = 1.0
FP = 2.0  TN = 3.0  FPR = 0.4
x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 1. 1. 1. 1. 1. 1. 0. 0.]
TP = 4.0  FN = 0.0  TPR = 1.0
FP = 3.0  TN = 2.0  FPR = 0.6
x = [1, 1, 1, 0, 1, 0, 0, 0, 0]
y = [1. 1. 1. 1. 1. 1. 1. 1. 0.]
TP = 4.0  FN = 0.0  TPR = 1.0
FP = 4.0  TN = 1.0  FPR = 0.8
TPR = [0.25 0.5  0.75 0.75 1.   1.   1.   1.  ]
FPR = [0.  0.  0.  0.2 0.2 0.4 0.6 0.8]
AUC = 0.05 

x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 0. 0. 0. 0. 0. 0. 0. 0.]
TP = 0.0  FN = 4.0  TPR = 0.0
FP = 1.0  TN = 4.0  FPR = 0.2
x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 1. 0. 0. 0. 0. 0. 0. 0.]
TP = 1.0  FN = 3.0  TPR = 0.25
FP = 1.0  TN = 4.0  FPR = 0.2
x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 1. 1. 0. 0. 0. 0. 0. 0.]
TP = 1.0  FN = 3.0  TPR = 0.25
FP = 2.0  TN = 3.0  FPR = 0.4
x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 1. 1. 1. 0. 0. 0. 0. 0.]
TP = 1.0  FN = 3.0  TPR = 0.25
FP = 3.0  TN = 2.0  FPR = 0.6
x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 1. 1. 1. 1. 0. 0. 0. 0.]
TP = 2.0  FN = 2.0  TPR = 0.5
FP = 3.0  TN = 2.0  FPR = 0.6
x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 1. 1. 1. 1. 1. 0. 0. 0.]
TP = 2.0  FN = 2.0  TPR = 0.5
FP = 4.0  TN = 1.0  FPR = 0.8
x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 1. 1. 1. 1. 1. 1. 0. 0.]
TP = 3.0  FN = 1.0  TPR = 0.75
FP = 4.0  TN = 1.0  FPR = 0.8
x = [0, 1, 0, 0, 1, 0, 1, 1, 0]
y = [1. 1. 1. 1. 1. 1. 1. 1. 0.]
TP = 4.0  FN = 0.0  TPR = 1.0
FP = 4.0  TN = 1.0  FPR = 0.8
TPR = [0.   0.25 0.25 0.25 0.5  0.5  0.75 1.  ]
FPR = [0.2 0.2 0.4 0.6 0.6 0.8 0.8 0.8]
AUC = 0.6000000000000001 

ROC曲线

五、问题及解决方法

1、pycharm 安装模块包失败

  • 更换下载地址镜像,镜像地址有多种,这里采用清华的镜像地址:
    https://pypi.tuna.tsinghua.edu.cn/simple/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、中文乱码

  • 尝试多种方式均失败,最后采用添加如下代码的方式解决
choose_font = mpl.font_manager.FontProperties(fname='C:\Windows\Fonts\simfang.ttf')  # 为显示中文,指定默认字体
    plt.title(u'ROC曲线', fontproperties=choose_font)

3、各曲线显示于同一坐标图上

  • 起初尝试设置一个函数,输入变量,即可得到计算结果与 ROC 曲线图,并且这些曲线能在同一个坐标图上,但此时输出结果为一条曲线一张图,无法在同一个坐标图上显示。原因可能为,如下所示的几行代码需紧挨着执行。
    plt.plot(xx1.TPR, xx1.FPR, linestyle='-', marker='o', color='r', label='x1')
    plt.plot(xx2.TPR, xx2.FPR, linestyle='--', marker='^', color='b', label='x2')
    plt.legend(loc='best')  # 使其在同一一个坐标图上显示
  • 反复尝试,暂时找不到较为简便且不增加算法复杂度的方式,于是只好把画 ROC 曲线的部分放到主函数里来执行。

六、评价

  • 优点:设置类,并将计算部分封装在函数内,有利于对象输入与调用
  • 缺点:绘制 ROC 曲线的过程未封装在函数内,不够便捷,降低了算法的通用性
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机森林的ROC曲线用于评估模型的分类性能。ROC曲线显示了分类器在不同阈值下的真阳性率(TPR)和假阳性率(FPR)之间的关系。通过改变分类的阈值,可以在TPR和FPR之间做出权衡。在ROC曲线上,横轴是FPR,纵轴是TPR。曲线越靠近左上角,表示模型的分类性能越好,TPR越高,FPR越低。当ROC曲线处于对角线上方时,表示模型的性能优于随机猜测。而当ROC曲线处于对角线以下时,表示模型的性能不如随机猜测。通过计算ROC曲线下的面积(AUC),可以综合评估分类器的性能,AUC值越接近1,表示模型的性能越好。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [数据挖掘术语解析](https://blog.csdn.net/weixin_30925411/article/details/96595770)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Python随机森林模型预测及ROC曲线可视化](https://blog.csdn.net/ByteHero/article/details/132329068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值