在评估模型时,虽然准确性是训练阶段模型评估和应用模型调整的重要指标,但它并不是模型评估的最佳指标,我们可以使用几个评估指标来评估我们的模型。

因为我们用于构建大多数模型的数据是不平衡的,并且在对数据进行训练时模型可能会过拟合。在本文中,我将讨论和解释其中的一些方法,并给出使用 Python 代码的示例。

混淆矩阵

对于分类模型使用混淆矩阵是一个非常好的方法来评估我们的模型。它对于可视化的理解预测结果是非常有用的,因为正和负的测试样本的数量都会显示出来。并且它提供了有关模型如何解释预测的信息。混淆矩阵可用于二元和多项分类。它由四个矩阵组成:

#Import Libraries:
from random import random
from random import randint
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import roc_curve#Fabricating variables:
#Creating values for FeNO with 3 classes:
FeNO_0 = np.random.normal(15,20, 1000)
FeNO_1 = np.random.normal(35,20, 1000)
FeNO_2 = np.random.normal(65, 20, 1000)#Creating values for FEV1 with 3 classes:
FEV1_0 = np.random.normal(4.50, 1, 1000)
FEV1_1 = np.random.uniform(3.75, 1.2, 1000)
FEV1_2 = np.random.uniform(2.35, 1.2, 1000)#Creating values for Bronco Dilation with 3 classes:
BD_0 = np.random.normal(150,49, 1000)
BD_1 = np.random.uniform(250,50,1000)
BD_2 = np.random.uniform(350, 50, 1000)#Creating labels variable with two classes (1)Disease (0)No disease:
no_disease = np.zeros((1500,), dtype=int)
disease = np.ones((1500,), dtype=int)#Concatenate classes into one variable:
FeNO = np.concatenate([FeNO_0, FeNO_1, FeNO_2])
FEV1 = np.concatenate([FEV1_0, FEV1_1, FEV1_2])
BD = np.concatenate([BD_0, BD_1, BD_2])
dx = np.concatenate([not_asma, asma])#Create DataFrame:
df = pd.DataFrame()#Add variables to DataFrame:
df['FeNO'] = FeNO.tolist()
df['FEV1'] = FEV1.tolist()
df['BD'] = BD.tolist()
df['dx'] = dx.tolist()#Create X and y:
X = df.drop('dx', axis=1)
y = df['dx']#Train and Test split:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)#Build the model:
logisticregression = LogisticRegression().fit(X_train, y_train)#Print accuracy metrics:
print("training set score: %f" % logisticregression.score(X_train, y_train))
print("test set score: %f" % logisticregression.score(X_test, y_test))

现在我们可以构建混淆矩阵并检查我们的模型了:

# Predicting labels from X_test data
y_pred = logisticregression.predict(X_test)# Create the confusion matrix
confmx = confusion_matrix(y_test, y_pred)
f, ax = plt.subplots(figsize = (8,8))
sns.heatmap(confmx, annot=True, fmt='.1f', ax = ax)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix')
plt.show();

可以看到,模型未能对42个标签[1]和57个标签[0]的进行分类。

上面的方法是二分类的情况,建立多分类的混淆矩阵的步骤是相似的。

#Fabricating variables:
#Creating values for FeNO with 3 classes:
FeNO_0 = np.random.normal(15,20, 1000)
FeNO_1 = np.random.normal(35,20, 1000)
FeNO_2 = np.random.normal(65, 20, 1000)#Creating values for FEV1 with 3 classes:
FEV1_0 = np.random.normal(4.50, 1, 1000)
FEV1_1 = np.random.normal(3.75, 1.2, 1000)
FEV1_2 = np.random.normal(2.35, 1.2, 1000)#Creating values for Broncho Dilation with 3 classes:
BD_0 = np.random.normal(150,49, 1000)
BD_1 = np.random.normal(250,50,1000)
BD_2 = np.random.normal(350, 50, 1000)#Creating labels variable with three classes:
no_disease = np.zeros((1000,), dtype=int)
possible_disease = np.ones((1000,), dtype=int)
disease = np.full((1000,), 2, dtype=int)#Concatenate classes into one variable:
FeNO = np.concatenate([FeNO_0, FeNO_1, FeNO_2])
FEV1 = np.concatenate([FEV1_0, FEV1_1, FEV1_2])
BD = np.concatenate([BD_0, BD_1, BD_2])
dx = np.concatenate([no_disease, possible_disease, disease])#Create DataFrame:
df = pd.DataFrame()#Add variables to DataFrame:
df['FeNO'] = FeNO.tolist()
df['FEV1'] = FEV1.tolist()
df['BD'] = BD.tolist()
df['dx'] = dx.tolist()#Creating X and y:
X = df.drop('dx', axis=1)
y = df['dx']#Data split into train and test:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)#Fit Logistic Regression model:
logisticregression = LogisticRegression().fit(X_train, y_train)#Evaluate Logistic Regression model:
print("training set score: %f" % logisticregression.score(X_train, y_train))
print("test set score: %f" % logisticregression.score(X_test, y_test))

现在我们来创建混淆矩阵

# Predicting labels from X_test data
y_pred = logisticregression.predict(X_test)# Create the confusion matrix
confmx = confusion_matrix(y_test, y_pred)
f, ax = plt.subplots(figsize = (8,8))
sns.heatmap(confmx, annot=True, fmt='.1f', ax = ax)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix')
plt.show();

通过观察混淆矩阵,我们可以看到标签[1]的错误率更高,因此是最难分类的。

评价指标

在机器学习中,有许多不同的指标用于评估分类器的性能。最常用的是:

  • 准确性Accuracy:我们的模型在预测结果方面有多好。此指标用于度量模型输出与目标结果的接近程度(所有样本预测正确的比例)。
  • 精度Precision:我们预测的正样本有多少是正确的?查准率(预测为正样本中,有多少实际为正样本,预测的正样本有多少是对的)
  • 召回Recall:我们的样本中有多少是目标标签?查全率(有多少正样本被预测了,所有正样本中能预测对的有多少)
  • **F1 Score:**是查准率和查全率的加权平均值。

我们还是使用前面示例中构建的数据和模型来构建混淆矩阵。使用sklearn打印所需模型的评估指标是非常简单的,所以我们这里直接使用现有的函数classification_report:

# Printing the model scores:
print(classification_report(y_test, y_pred))

可以看到,标签 [0] 的精度更高,标签 [1] 的 f1 分数更高。在二分类的混淆矩阵中,我们看到了标签 [1] 的错误分类数据较少。

对于多标签分类

# Printing the model scores:
print(classification_report(y_test, y_pred))

通过混淆矩阵,可以看到标签 [1] 是最难分类的,标签 [1] 的准确率、召回率和 f1 分数也是一样的。

ROC和AUC

ROC 曲线,是一种图形表示,它说明了二元分类器系统在其判别阈值变化时的性能。ROC 曲线下的面积通常用于衡量测试的有用性,其中更大的面积意味着更有用的测试。ROC 曲线显示了假阳性率 (FPR) 与真阳性率 (TPR) 的对比。

#Get the values of FPR and TPR:
fpr, tpr, thresholds = roc_curve(y_test,logisticregression.decision_function(X_test))
plt.xlabel("FPR")
plt.ylabel("TPR (recall)")
plt.title("roc_curve");# find threshold closest to zero:
close_zero = np.argmin(np.abs(thresholds))
plt.plot(fpr[close_zero], tpr[close_zero], 'o', markersize=10,
label="threshold zero", fillstyle="none", c='k', mew=2)
plt.legend(loc=4)

PR(precision recall )曲线

在P-R曲线中,Precision为横坐标,Recall为纵坐标。在ROC曲线中曲线越凸向左上角越好,在P-R曲线中,曲线越凸向右上角越好。P-R曲线判断模型的好坏要根据具体情况具体分析,有的项目要求召回率较高、有的项目要求精确率较高。P-R曲线的绘制跟ROC曲线的绘制是一样的,在不同的阈值下得到不同的Precision、Recall,得到一系列的点,将它们在P-R图中绘制出来,并依次连接起来就得到了P-R图。

PR 曲线只是一个图形,y 轴上有 Precision 值,x 轴上有 Recall 值。换句话说,PR 曲线在 y 轴上包含 TP/(TP+FN),在 x 轴上包含 TP/(TP+FP)。

ROC 曲线是包含 x 轴上的 Recall = TPR = TP/(TP+FN) 和 y 轴上的 FPR = FP/(FP+TN) 的图。ROC曲线并且不会现实假阳性率与假阴性率,而是绘制真阳性率与假阳性率。

PR 曲线通常在涉及信息检索的问题中更为常见,不同场景对ROC和PRC偏好不一样,要根据实际情况区别对待。

#Get precision and recall thresholds:
precision, recall, thresholds = precision_recall_curve(y_test,logisticregression.decision_function(X_test))# find threshold closest to zero:
close_zero = np.argmin(np.abs(thresholds))#Plot curve:
plt.plot(precision[close_zero],     recall[close_zero], 'o', markersize=10,label="threshold zero", fillstyle="none", c='k', mew=2)
plt.plot(precision, recall, label="precision recall curve")
plt.xlabel("precision")
plt.ylabel("recall")
plt.title("precision_recall_curve");
plt.legend(loc="best")

https://avoid.overfit.cn/post/decf6f5fade44ffa98554368173062b0

作者:Carla Martins

评估和选择最佳学习模型的一些指标总结相关推荐

  1. Nature子刊:用于阿尔茨海默病痴呆评估的多模态深度学习模型

    在全球范围内,每年有近1000万新发痴呆病例,其中阿尔茨海默病(AD)最为常见.需要新的措施来改善对各种病因导致认知障碍的个体的诊断.作者报告了一个深度学习框架,该框架以连续方式完成多个诊断步骤,以识 ...

  2. 边缘设备上的实时AI人员检测:选择深度学习模型

    下载数据-19.3 MB 下载模型-43.5 MB 下载结果-36.66 MB 在本系列的介绍性文章中,我们讨论了为边缘设备创建DL人员检测器的简单方法,该方法是找到合适的DNN模型并编写代码以在设备 ...

  3. 《机器学习》周志华-CH2 模型评估与选择

    写在前面 CH1讲述了机器学习领域的基本概念,包括算法.模型.数据集等重要的专有名词.在算法的帮助下,能从数据集中提取了模型:对于同一数据集而言,给定不同的算法,会提取不同的模型,甚至给定同一算法的不 ...

  4. 手动/自动/交叉验证评估Keras深度学习模型的性能

    Keras是Python中一个的强大而易用的库,主要用于深度学习. 在设计和配置你的深度学习模型时,需要做很多决策.大多数决定必须通过反复试错的方法来解决,并在真实的数据上进行评估. 因此,有一个可靠 ...

  5. 提升深度学习模型的表现,你需要这20个技巧

    选自machielearningmastery 机器之心编译 作者:Jason Brownlee 参与:杜夏德.陈晨.吴攀.Terrence.李亚洲 本文原文的作者 Jason Brownlee 是一 ...

  6. 最佳回归模型选择指标——马洛斯CP值

    本文介绍最佳回归模型选择指标--马洛斯CP指标,并通过示例说明选择过程及如何计算. 马洛斯CP(Mallows'Cp) 指标用于在多个不同模型中选择最佳回归模型.其计算公式为: Cp = RSSp/S ...

  7. 评估方法提高深度学习模型泛化能力

    三种经典的评估方法提高模型泛化能力 ①留出验证:评估模型时,将数据划分为训练集.验证集.测试集.(比较适合大数据集) 在训练数据上训练模型,在验证数据上评估模型,最后在测试数据上测试最佳参数的模型. ...

  8. AL遮天传 DL-深度学习模型的训练技巧

    本文介绍一些常用的优化方法.处理过拟合的一些手段.批归一化的方法和超参数的选取. 一.优化器 回忆:随机梯度下降(SGD)及动量(momentum) 训练中需要调整学习率  随机梯度下降算法对每批数据 ...

  9. Stanford机器学习笔记-6. 学习模型的评估和选择

    6. 学习模型的评估与选择 Content 6. 学习模型的评估与选择 6.1 如何调试学习算法 6.2 评估假设函数(Evaluating a hypothesis) 6.3 模型选择与训练/验证/ ...

最新文章

  1. USACO Barn Repair
  2. Linux(CentOS)目录操作命令、文件操作命令、压缩解压缩命令
  3. JAVA中定义常量的几种方式
  4. jlink烧写Nor Flash时出错正确解决方法汇总:PC of target system has unexpected value after programming (2011
  5. 菲律宾谋定农业大建特建构想 对话国际农民丰收节贸易会
  6. Java关于equals()方法和“==”逻辑运算符的区别简介
  7. webqq2协议分析和qq聊天机器人简单实现(转)
  8. mysql锁争用_关于MYSQL条件竞争与锁的问题
  9. android+tv+无线键盘,手机键盘有那些 5款适合手机使用的无线键盘推荐
  10. Mysql 索引底层原理
  11. Java生鲜电商平台-用户管理的架构与实战
  12. Underscore.js (1.7.0)-函数预览
  13. jquery-自定义通用方法-jquery通用方法-所有对象的通用方法
  14. 60-008-000-使用-命令
  15. 【Chromium中文文档】线程
  16. 西点军校的经典法则[转]
  17. DOTA版设计模式——责任链
  18. 文化人类学课后习题答案
  19. 7-6 平面向量加法
  20. oracle 添加索引

热门文章

  1. 3.7 百分比堆积柱形图
  2. 苹果x要不要升ios14.4系统?
  3. 查询出只有两门课程的全部学生的学号和姓名
  4. Ubuntu下使用VS Code构建CMake工程
  5. 立体表情包贺卡,蓝海赚钱副业小项目
  6. 「 机器人/自动化控制 」“SCI检索论文与会议”小结
  7. 乐播投屏为什么显示登录服务器失败,升级iOS11后电视投屏没法用?可以试试这两个办法...
  8. GitLab提交代码SSL证书过期解决
  9. CIS/CZTS/CISe/CZTSe/CIGSeCIGS量子点(生物标记)
  10. 算法书籍推荐及网络资源