机器学习实战KNN模型的性能度量以及PR和ROC曲线绘制

概述

在我们将学习的模型构造出来训练完以后,我们通常需要评估该模型的好坏。

目录

概述

1.分类模型的性能度量

1.1 混淆矩阵

1.2 准确率

1.3 精确率

1.4 召回率

1.5 PR曲线

1.6 AOC曲线

2.实战

2.1 创建数据集

2.2 KNN模型

2.3 预测

2.4 PR曲线绘制

PR曲线效果:

2.5ROC曲线绘制

ROC曲线:

3.全部代码


1.分类模型的性能度量

1.1 混淆矩阵

1.2 准确率

准确率是最常用的分类性能指标。

公式:

 Accuracy = \frac{TP+TN}{TP+TN+FP+FN}

1.3 精确率

精确率只是针对预测正确的正样本而不是所有预测正确的样本,即预测出是正的里面有多少真正是正的。

公式:

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

1.4 召回率

召回率表现出在实际正样本中,分类器能预测出多少。

公式:

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

1.5 PR曲线

横坐标为recall,纵坐标为precision。

将预测结果按照预测为正类概率值排序,然后将阈值由1开始逐渐降低,按此顺序逐个把样本作为正例进行预测,每次可以计算出当前的P,R值,再以此作出PR图。

1.6 AOC曲线

ROC曲线使用的指标是真正率(True positive rate, TPR)与假正率 (False positive rate, FPR),其横坐标为FPR, 纵坐标为TPR.

AUC就是衡量学习器优劣的一种性能指标。从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得。

2.实战

2.1 创建数据集

该数据集调用sklearn库中的make_classification()函数,生成5000个两个特征的二分类样本。

def createData():
    features,actual_labels = make_classification(n_samples = 5000,n_classes = 2,n_features = 2,n_informative = 2,n_redundant = 0,n_clusters_per_class = 1)
    return features,actual_labels

2.2 KNN模型

将5000个样本利用train_test_split()函数划分为训练集和测试集,然后调用sklearn库中自带的KNN函数初始化模型,并用数据集进行训练。

features_train_set,features_test_set,labels_train_set, labels_test_set = train_test_split(features, actual_labels, test_size=.3, random_state=0)#划分训练集和测试集

knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(features_train_set,labels_train_set)#训练模型

2.3 预测

使用predict_proba方法获取测试集样本的预测概率,并提取出正类的概率值。

使用predict方法获取测试集样本的预测值。

最后对预测概率进行排序。

labels_scores = knn.predict_proba(features_test_set)[:, 1]

labels_pred = knn.predict(features_test_set)


# 对预测概率进行排序
sorted_indices = sorted(range(len(labels_scores)), key=lambda k: labels_scores[k], reverse=True)
labels_test_set_sorted = [labels_test_set[i] for i in sorted_indices]
labels_scores_sorted = [labels_scores[i] for i in sorted_indices]

2.4 PR曲线绘制

对预测概率进行排序后,使用precision_recall_curve函数计算出精确率-召回率曲线的数据,并计算出曲线下面积(AUC),最后使用matplotlib库绘制了精确率-召回率曲线图。

precision, recall, thresholds = precision_recall_curve(labels_test_set_sorted, labels_scores_sorted)
pr_auc = auc(recall,precision )
plt.figure(figsize=(20, 6))
plt.subplot(1, 2, 1)
plt.plot(recall , precision , label='PR curve (area = %0.2f)' % pr_auc)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR')
plt.legend(loc="lower left")

PR曲线效果:

2.5ROC曲线绘制

使用roc_curve函数计算了在排序后的标签和预测概率上的假正例率(False Positive Rate)和真正例率(True Positive Rate)。然后,使用auc函数计算了ROC曲线下面积(AUC)。最后,使用matplotlib库绘制了ROC曲线图,并添加了对角线作为参考线。

# 计算ROC曲线的指标
from sklearn.metrics import auc, roc_curve
fpr, tpr, _ = roc_curve(labels_test_set_sorted, labels_scores_sorted)
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure(figsize=(16, 6))
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
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('ROC')
plt.legend(loc="lower right")

ROC曲线:

3.全部代码

from sklearn.metrics import  auc, precision_recall_curve
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

def createData():
    features,actual_labels = make_classification(n_samples = 5000,n_classes = 2,n_features = 2,n_informative = 2,n_redundant = 0,n_clusters_per_class = 1)
    #print(features,actual_labels)
    return features,actual_labels


features,actual_labels = createData()

features_train_set,features_test_set,labels_train_set, labels_test_set = train_test_split(features, actual_labels, test_size=.3, random_state=0)#划分训练集和测试集

knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(features_train_set,labels_train_set)#训练模型



labels_scores = knn.predict_proba(features_test_set)[:, 1]

labels_pred = knn.predict(features_test_set)

# 对预测概率进行排序
sorted_indices = sorted(range(len(labels_scores)), key=lambda k: labels_scores[k], reverse=True)
labels_test_set_sorted = [labels_test_set[i] for i in sorted_indices]
labels_scores_sorted = [labels_scores[i] for i in sorted_indices]


precision, recall, thresholds = precision_recall_curve(labels_test_set_sorted, labels_scores_sorted)
pr_auc = auc(recall,precision )
plt.figure(figsize=(20, 6))
plt.subplot(1, 2, 1)
plt.plot(recall , precision , label='PR curve (area = %0.2f)' % pr_auc)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR')
plt.legend(loc="lower left")


# 计算ROC曲线的指标
from sklearn.metrics import auc, roc_curve
fpr, tpr, _ = roc_curve(labels_test_set_sorted, labels_scores_sorted)
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure(figsize=(16, 6))
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
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('ROC')
plt.legend(loc="lower right")

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值