目录
2.ROC曲线(Receiver Operating Characteristic)
3.AUC-ROC曲线下的面积(area under the curve)
(还没完善好,学别人的算法直接生成的数据,想试试和之前那篇knn所得到的数据集进行绘制,还在努力)
一.模型评估概述
1.概念
模型评估(model assessment)是指对于一种具体方法输出的最终模型,使用一些指标和方法来评价它的泛化能力。这一步骤通常在模型训练和模型选择之后,正式部署模型之前。模型评估方法不针对模型本身,只针对问题和数据,因此可以用来评价来自不同方法的模型的泛化能力,进行用于部署的最终模型的选择。
2.模型评估的类型
机器学习的任务有回归,分类和聚类,针对不同的任务有不同的评价指标。按照数据集的目标值不同,可以把模型评估分为分类模型评估和回归模型评估。
二.常见的分类模型评估指标
1.混淆矩阵
混淆矩阵(confusion matrix)是一个评估分类问题常用的工具,对于 k 元分类,其实它是一个k x k的表格,用来记录分类器的预测结果。例如对于常见的二分类,它的混淆矩阵是 2 x 2 的。 在二分类中,可以将样本根据其真实结果和模型的预测结果的组合划分为真阳性(true positive,TP)、真阴性(true negative,TN)、假阳性(false positive,FP)、假阴性(false negative,FN)。根据 TP、TN、FP、FN 即可得到二分类的混淆矩阵,如下图所示。
1.1.准确率(Accuracy)
准确率是指分类正确的样本占总样本个数的比例。准确率是针对所有样本的统计量。
1.2.精确率(Precision)
精确率又称为查准率,是针对预测结果而言的一个评价指标。指在分类正确的正样本个数占分类器判定为正样本的样本个数的比例。
1.3.召回率(recall)
召回率是指分类正确的正样本个数占真正的正样本个数的比例。召回率也是对部分样本的统计量,侧重对真实的正类样本的统计。
2.ROC曲线(Receiver Operating Characteristic)
ROC曲线为 FPR 与 TPR 之间的关系曲线,这个组合以 FPR 对 TPR,即是以代价 (costs) 对收益 (benefits),显然收益越高,代价越低,模型的性能就越好。
1.FPR
x 轴为假阳性率(FPR):在所有的负样本中,分类器预测错误的比例
2.TPR
y 轴为真阳性率(TPR):在所有的正样本中,分类器预测正确的比例(等于Recall)
3.ROC曲线的特性
a.若一个学习器的ROC曲线被另一个学习器的曲线完全包住,则后者优于前者。
b.若两个学习器的ROC曲线发生交叉,则可根据曲线下方的面积大小来比较,ROC曲线下方的面积为AUC(Area Under ROC Curve).
3.AUC-ROC曲线下的面积(area under the curve)
AUC(Area Under Curve)被定义为ROC曲线下的面积(ROC的积分),通常大于0.5小于1。
4.P-R曲线
1.概念
P:查准率,也称准确率
R:查全率,也称召回率
2.曲线分析
1.若曲线a完全“包住”曲线b,则a性能优于b。
2.若曲线a和曲线b发生了相交,则无法比较。
3.比较曲线a和曲线b曲线下面积的大小。面积大则性能优。
三.ROC曲线与P-R曲线的差异
1.差异
横纵坐标不同,ROC曲线的横坐标是假正例率(FPR),纵坐标是真正例率(TPR)。P-R曲线的横坐标是查全率(同TPR),纵坐标是查准率(精确率)。
ROC 曲线关注的是真正例率和假正例率的变化,适用于正负样本比例相对均衡的情况。
PR 曲线关注的是精确率和召回率的变化,适用于正负样本比例不平衡的情况,更能反映分类器在预测正例时的性能。
2.实现准备
查阅资料后发现所需要用到sklearn包中的roc_curve函数绘制
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, auc
from sklearn.preprocessing import StandardScaler
3.PR曲线的绘制
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
def plot(dict, lists): # 画出函数图像
fig = plt.figure()
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
plt.xlabel('查全率(R)', fontproperties=font)
plt.ylabel('查准率(P)', fontproperties=font)
x = np.arange(0, 1.0, 0.2)
y = np.arange(0, 1.0, 0.2)
plt.xticks(x)
plt.yticks(y)
plt.plot(dict, lists)
plt.show()
def caculate():
num_real = 0
# 初始化样本标签,假设1为正例,0为负例
trainlabel = np.random.randint(0, 2, size=100)
# 产生100个概率值(置信度),即单个样本值为正例的概率
traindata = np.random.rand(100)
# 将样本数据为正例概率从大到小排序返回索引值
sortedTraindata = traindata.argsort()[::-1]
k = []
v = []
# 统计样本中实际正例的数量
num = np.sum(trainlabel == 1)
for i in range(100):
num_guess = i + 1 # 假设为真的数量
for j in range(0, i + 1):
a = sortedTraindata[j]
if trainlabel[a] == 1:
num_real += 1 # 假设为真中实际也为真的数量
p = float(num_real / (num_guess))
r = float(num_real / (num))
v.append(p)
k.append(r)
num_real = 0
plot(k, v)
if __name__ == '__main__':
caculate()
4.ROC曲线的绘制,以及不同k值下的图像
# 生成一些样本数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 不同k值下的ROC曲线
k_values = [1, 2, 3, 4, 5,10,100]
plt.figure(figsize=(8, 6))
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_score = knn.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, label=f'k={k}, AUC={roc_auc:.2f}')
plt.plot([0, 1], [0, 1], linestyle='--', color='grey', label='Random Guess')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve for KNN with Different k Values')
plt.legend()
plt.show()
四.实验结果及分析
1(0,0)即FPR=TPR=0,可以发现该分类器将所有的样本都分为负样本。
2(1,1)即FPR=TPR=1,同理该分类器将所有的样本都分成正样本。
3一条特殊的线是图中的虚线y=x。在这条对角线上的点其实表示的是一个采用随机猜测策略的分类器对样本进行分类的结果,例如(0.5,0.5)就表示分类器随机对一半的样本猜测为正样本,另一半的样本为负样本的分类结果。
4当k值增大时,模型的泛化能力增强