一、关于ROC曲线与PR 曲线的概念
ROC曲线
在正负样本不平衡时,ROC曲线的AUC经常被来评价模型的效果。因为ROC曲线关注的是TPR(y轴;有多少比例的正样本被识别出来)和FPR(x轴;有多少比例的负样本被错误识别成正样本),因此正负样本的相对大小不会影响这两个指标。相当于把TP用正样本总数归一化,把FP用负样本总数归一化,再看阈值对这两个‘归一化’以后的指标的影响。
Roc全称Receiver Operating Characteristic,即接收器操做特征曲线,坐标图式的分析工具。在机器学习(machine learning)和数据挖掘(data mining)领域同样是对学习器的泛化性能 进行评估。
计算公式
True Positive真正率:
False Positive假正率:
如何理解ROC曲线呢?也就是曲线越接近(1,0)曲线,表明模型泛化性能越好,即AUC越接近1,则它的性能就越好。
PR曲线
PR曲线它的x轴代表Recall(即TPR;有多少比例的正样本被识别出来),y轴是Percision(识别为正的样本中,有多少比例是正确的)。与ROC曲线十分类似,也适用于评价样本偏斜情况下,模型的效果。但与ROC曲线的‘归一化’思路不同,PR曲线用另外一种方法来缓解数据偏斜问题。由定义可知,PR曲线只关心与正类有关的参数(TP, FN, FP)。因此,即使正负类样本的数目相差较大,由于不包含TN,也不会对最后的曲线结果带来很大的影响。
计算公式
Precision精准率:
Recall召回率
如何理解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曲线的面积范围可以推断出其性能是否优良,这对算法的检验来说,是具有重要意义。