机器学习--模型评估与ROC曲线

一、模型评估介绍


1.1 模型评估概述


机器学习模型的评估方法主要目的是了解模型在训练数据上的表现,以确定模型是否有过拟合或欠拟合的问题,以及模型在新数据上的泛化能力。

机器学习模型的评估方法涉及到多个方面,包括损失函数、训练误差、验证误差、测试误差、交叉验证、模型选择等。通过综合考虑这些因素,可以优化模型的性能,并选择具有较好泛化能力的模型。

评估指标是针对模型性能优劣的一个定量指标。一种评价指标只能反映模型一部分性能,如果选择的评价指标不合理,那么可能会得出错误的结论,故而应该针对具体的数据、模型选取不同的的评价指标。

1.2 混淆矩阵概述


混淆矩阵(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 即可得到二分类的混淆矩阵,如下图所示。

真正例(True Positive,TP):模型正确地预测了正类别样本。

真负例(True Negative,TN):模型正确地预测了负类别样本。

假正例(False Positive,FP):模型错误地将负类别样本预测为正类别。

假负例(False Negative,FN):模型错误地将正类别样本预测为负类别。

1.3常见的分类模型评估指标

1. 准确率(Accuracy):是模型正确预测的样本数量与总样本数量的比率。它是最常见的评估指标之一,但在不平衡数据集中可能不够准确

Accuracy = (TP+TN)/(TP+FN+FP+TN)

2. 精确率(Precision):是被模型预测为正类别的样本中,实际为正类别的比率。它衡量了模型的预测中有多少是真正正确的。

Precision = (TP)/(TP+FP)

3. 召回率(Recall):是实际为正类别的样本中,被模型正确预测为正类别的比率。它衡量了模型识别出所有真正正例的能力。

Recall = TP/(TP+FN)

4. F1 分数(F1 Score):是精确率和召回率的调和平均数,综合了两者的性能。当需要同时考虑精确率和召回率时,F1 分数是一个很好的选择。

5. ROC 曲线和 AUC(Receiver Operating Characteristic curve and Area Under the Curve):ROC 曲线是以假阳性率(False Positive Rate)为横轴,真阳性率(True Positive Rate)为纵轴绘制的曲线,AUC 则是 ROC 曲线下的面积,用于度量分类器的性能。AUC 值越大,分类器性能越好.

二、代码的实际演示

2.1代码展示

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.metrics import precision_recall_curve, roc_curve
 
# 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
 
# 分割数据为训练集和测试集
split_ratio = 0.8
split_index = int(split_ratio * len(X))
train_data, test_data = X[:split_index], X[split_index:]
train_lable, test_lable = y[:split_index], y[split_index:]
 
#让plt。show显示的图中title能显示中文而不是乱码
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
 
 
# 用于每个数据计算欧式距离
def distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2) ** 2))
 
def knn(train_data, train_lable, test_data, k):
    # 计算所有的训练数据和测试数据的欧式距离
    distances = [distance(test, train) for test in test_data for train in train_data]
 
    # 将distance中的元素从小到大排列,返回其对应的索引
    min_distance = np.argsort(distances)[:k]
 
    k_nearest_labels = [train_lable[i] for i in min_distance]
    prediction = np.mean(k_nearest_labels)  # 取k个最近样本的平均值作为预测值
    return prediction
 
# 计算预测结果
predictions = [knn(train_data, train_lable, np.array([test]), k=3) for test in test_data]
 
# 使用sklearn中的函数计算P-R曲线和ROC曲线
precision, recall, _ = precision_recall_curve(test_lable, predictions)
fpr, tpr, _ = roc_curve(test_lable, predictions)
 
# 绘制P-R曲线和ROC曲线
plt.figure(figsize=(10, 5))
 
# P-R曲线
plt.subplot(1, 2, 1)
plt.plot(recall, precision, marker='o')
plt.title('P-R曲线')
plt.xlabel('召回率')
plt.ylabel('精确率')
 
# ROC曲线
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, marker='o')
plt.title('ROC曲线')
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
 
plt.show()

首先依据上一次实验所写的KNN算法,加以修改,通过用make_classification来生产数据集,make_classification 函数用于生成一个具有指定特征数量、样本数量和类别数量的合成数据集。在这里,n_samples=1000 表示生成1000个样本,n_features=20 表示每个样本有20个特征,n_classes=2 表示数据集有2个类别。random_state=42 是一个随机种子,用于确保每次运行代码时生成的数据集都是一致的。

然后,数据集被按照指定的比例 split_ratio 分割为训练集和测试集。在这里,split_ratio = 0.8 表示80%的数据用于训练,20%的数据用于测试。split_index 计算了分割索引,将数据按照这个索引进行切分。

最后,将生成的数据集 X 和对应的标签 y 分割成训练集和测试集。train_data 和 train_label 是训练集的特征和标签,test_data 和 test_label 是测试集的特征和标签。

这样,我们就得到了用于训练和测试的数据集。在训练集上训练模型,在测试集上评估模型的性能。

2.2效果图展示

K = 3时的PR曲线和ROC曲线

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值