分类问题评估指标之PR&ROC

机器学习分类问题性能评估指标

在这里插入图片描述
机器学习中,对学习器的泛化能力进行评估,需要有衡量模型泛化能力的评价标准,即“性能度量”,不同的性能度量往往会导致不同的评判结果,这意味着模型的“好坏”是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。(引自《机器学习》周志华)

分类任务中最常用的两种性能度量是: accuracy(准确度)error rate(错误率);它们既适用于二分类任务,也适用于多分类任务。精度是分类正确的样本数占样本总数的比例,错误率是分类错误的样本数占样本总数的比例。
在这里插入图片描述

PR曲线

准确度和错误率虽常用,但并不能满足所有任务需求,例如,在信息检索中,我们经常会关心:检索出的信息中有多少比例是用户感兴趣的;用户感兴趣的信息中有多少被检索出来了;这就涉及到 “查准率”“查全率” 这类性能度量。

针对一个二分类问题,将实例分成正类(postive)或者负类(negative)。但是实际中分类时,会出现四种情况,对应了四个基本指标。
(1)若一个实例是正类,并且被预测为正类,即为 真正类 (True Postive TP)
(2)若一个实例是正类,但是被预测为负类,即为 假负类 (False Negative FN)
(3)若一个实例是负类,但是被预测为正类,即为 假正类 (False Postive FP)
(4)若一个实例是负类,但是被预测为负类,即为 真负类 (True Negative TN)

分类结果的 混淆矩阵 如下,其中1代表正类,0代表负类
在这里插入图片描述
查准率 P P P (又称 精度,precision) 和 查全率 R R R(又称 召回率,recall)分别定义为

P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP

R = T P T P + F N R=\frac{TP}{TP+FN} R=TP+FNTP

精度是分类器判断为正样本的所有样本里,实际真正为正样本的比例,精度越高则假的正例就越低;召回率是所有实际正样本中被分类器正确判断为正样本的比例。如图所示,两者是一对矛盾的度量。

在这里插入图片描述
基于查全率和查准率的调和平均,定义了 F 1 F1 F1度量:

F 1 = 1 2 ∗ ( 1 P + 1 R ) = 2 ∗ T P 2 ∗ T P + F P + F N F1=\frac{1}{2}*(\frac{1}{P}+\frac{1}{R})=\frac{2*TP}{2*TP+FP+FN} F1=21(P1+R1)=2TP+FP+FN2TP

然而,对于precision和recall的重视常常是不同的。例如,在商品推荐时,为了尽少的打扰用户,更希望推荐的内容确实是用户喜欢的,此时查准率更重要;在追查逃犯时,更希望尽少的漏掉逃犯,此时查全率更重要。则有更一般的形式 F β F_\beta Fβ

F β = ( 1 + β 2 ) r p β 2 ∗ p + r F_\beta=\frac{(1+\beta^2)rp}{\beta^2*p+r} Fβ=

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您解答这个问题。 首先,我们需要导入一些必要的库和数据集。在这个例子中,我们将使用sklearn库中的鸢尾花数据集和KNeighborsClassifier模型。代码如下: ```python from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCV, RandomizedSearchCV from sklearn.metrics import classification_report, roc_curve, precision_recall_curve, auc import numpy as np import pandas as pd import matplotlib.pyplot as plt # 导入数据 iris = load_iris() X = iris.data y = iris.target ``` 接下来,我们将使用网格搜索和随机搜索方法对KNN模型中的k值进行优化。具体代码如下: ```python # 定义k值的范围 k_range = np.arange(1, 20, 2) # 定义网格搜索的参数 param_grid = {'n_neighbors': k_range} # 使用网格搜索方法进行模型优化 grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5, scoring='accuracy') grid_search.fit(X, y) # 使用随机搜索方法进行模型优化 random_search = RandomizedSearchCV(KNeighborsClassifier(), param_distributions=param_grid, n_iter=10, cv=5, scoring='accuracy') random_search.fit(X, y) ``` 在执行完上述代码后,我们已经得到了网格搜索和随机搜索优化后的最优模型和k值。接下来,我们将输出多分类的各项性能指标PR曲线和ROC曲线。具体代码如下: ```python # 打印网格搜索和随机搜索得到的最优模型和k值 print("Grid Search Best Model: ", grid_search.best_estimator_) print("Grid Search Best K: ", grid_search.best_params_['n_neighbors']) print("Random Search Best Model: ", random_search.best_estimator_) print("Random Search Best K: ", random_search.best_params_['n_neighbors']) # 定义函数绘制PR曲线和ROC曲线 def plot_curves(model, X_test, y_test): y_scores = model.predict_proba(X_test) # 计算PR曲线和ROC曲线的参数 precision, recall, thresholds = precision_recall_curve(y_test, y_scores[:, 1]) fpr, tpr, thresholds_roc = roc_curve(y_test, y_scores[:, 1]) auc_score = auc(fpr, tpr) # 绘制PR曲线和ROC曲线 fig, axs = plt.subplots(1, 2, figsize=(12, 6)) axs[0].plot(recall, precision) axs[0].set_xlabel("Recall") axs[0].set_ylabel("Precision") axs[0].set_title("PR Curve (AUC = {:.2f})".format(auc_score)) axs[1].plot(fpr, tpr) axs[1].set_xlabel("False Positive Rate") axs[1].set_ylabel("True Positive Rate") axs[1].set_title("ROC Curve (AUC = {:.2f})".format(auc_score)) plt.show() # 定义函数计算多分类的各项性能指标 def print_metrics(model, X_test, y_test): y_pred = model.predict(X_test) report = classification_report(y_test, y_pred) print(report) plot_curves(model, X_test, y_test) # 使用网格搜索和随机搜索得到的最优模型和k值进行预测和评估 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) model_grid = grid_search.best_estimator_ model_random = random_search.best_estimator_ print("Grid Search Performance:") print_metrics(model_grid, X_test, y_test) print("Random Search Performance:") print_metrics(model_random, X_test, y_test) ``` 通过上述代码,我们已经得到了多分类的各项性能指标PR曲线和ROC曲线。您可以根据需要对代码进行修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值