KNN算法绘制ROC曲线与PR曲线

一、关于ROC曲线与PR 曲线的概念

ROC曲线

        在正负样本不平衡时,ROC曲线的AUC经常被来评价模型的效果。因为ROC曲线关注的是TPR(y轴;有多少比例的正样本被识别出来)和FPR(x轴;有多少比例的负样本被错误识别成正样本),因此正负样本的相对大小不会影响这两个指标。相当于把TP用正样本总数归一化,把FP用负样本总数归一化,再看阈值对这两个‘归一化’以后的指标的影响。

         Roc全称Receiver Operating Characteristic,即接收器操做特征曲线,坐标图式的分析工具。在机器学习(machine learning)和数据挖掘(data mining)领域同样是对学习器的泛化性能  进行评估。

计算公式

True Positive真正率:

                                   True Positive Rate=\frac{TP}{TP+FN}

False Positive假正率:

                                 False Positive Rate=\frac{FP}{TN+FP}

        如何理解ROC曲线呢?也就是曲线越接近(1,0)曲线,表明模型泛化性能越好,即AUC越接近1,则它的性能就越好。

PR曲线

        PR曲线它的x轴代表Recall(即TPR;有多少比例的正样本被识别出来),y轴是Percision(识别为正的样本中,有多少比例是正确的)。与ROC曲线十分类似,也适用于评价样本偏斜情况下,模型的效果。但与ROC曲线的‘归一化’思路不同,PR曲线用另外一种方法来缓解数据偏斜问题。由定义可知,PR曲线只关心与正类有关的参数(TP, FN, FP)。因此,即使正负类样本的数目相差较大,由于不包含TN,也不会对最后的曲线结果带来很大的影响。

计算公式

Precision精准率:

                                                    P=\frac{TP}{TP+FP}

Recall召回率

                                                   R=\frac{TP}{TP+FN}

        如何理解PR曲线呢?当曲线越靠近右上方,性能越好,并且根据曲线下方面积大小判断,面积更大的更优于面积小的。我们还可以根据平衡点F判断:平衡点是查准率与查重率相等时的点。

代码实现

# 生成包含1000个样本的随机数据集
np.random.seed(0)
X = np.random.rand(1000, 10)
y = (X[:, 0] + X[:, 1] > 1).astype(int)

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.02, random_state=42)

# 特征标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 初始化KNN分类器并选择K值
k = 5
knn_classifier = KNeighborsClassifier(n_neighbors=k)

# 训练KNN分类器
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

y_pred = knn.predict(X_test)

fpr, tpr, thresholds = roc_curve(y_test, y_pred)
precision, recall, thresholds = precision_recall_curve(y_test, y_pred)


plt.figure(figsize=(8, 4))
plt.subplot(121)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
 
plt.subplot(122)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall curve')
plt.legend(loc="lower left")
 
plt.show()

        上述代码为我们随机生成1000样本的随机数据集,再据此划分为训练集与测试集,特征标准化之后,我们初始化KNN分类器,并且设置k值为5,再接着训练KNN分类器,求出ROC曲线和PR曲线的真正率,假正率,精准率及召回率,最后生成曲线图。

结果展示

ROC曲线

PR曲线

        上述结果即根据KNN算法所绘制出的ROC曲线与PR曲线图。

总结

         通过上述原理的说明,我们知道了ROC曲线与PR曲线的概念以及绘制这两条曲线的原理,还有这两条曲线的含义,并且我们通过KNN算法来获取部分数据,获取数据集,得出最后的预测结果。通过KNN算法强大及简洁的实现,我们可以绘制出ROC曲线与PR曲线,并且我们也知道了通过观察ROC曲线与PR曲线的面积范围可以推断出其性能是否优良,这对算法的检验来说,是具有重要意义。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值