热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于机器学习:评估和选择最佳学习模型的一些指标总结

在评估模型时,尽管准确性是训练阶段模型评估和利用模型调整的重要指标,但它并不是模型评估的最佳指标,咱们能够应用几个评估指标来评估咱们的模型。

在评估模型时,尽管准确性是训练阶段模型评估和利用模型调整的重要指标,但它并不是模型评估的最佳指标,咱们能够应用几个评估指标来评估咱们的模型。

因为咱们用于构建大多数模型的数据是不均衡的,并且在对数据进行训练时模型可能会过拟合。在本文中,我将探讨和解释其中的一些办法,并给出应用 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", fill, 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", 
         fill, 
         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


推荐阅读
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 湍流|低频_youcans 的 OpenCV 例程 200 篇106. 退化图像的逆滤波
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了youcans的OpenCV例程200篇106.退化图像的逆滤波相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 数学建模入门python绘制频率直方图
    文章目录例题数据处理绘图操作调用演示例题数据处理将以下的数据保存到磁盘上17275169551696417165167471716216867165521696216865 ... [详细]
  • 前一段是公司的一个项目环境,由以前的单节点环境升级到到现在集群环境,并且服务器都在同一个机房,考虑部署了一套zabbix监控系统,由于第一次部署的服务器有点多,所以将安装流程写成了 ... [详细]
  • 我正在使用fabricjs,并且具有图像的JSON列表.每个元素代表一个图像,每个图像的信息如左,上等.在我的JavaScript代码中,我有以下内容for(varj0;j ... [详细]
  • 自动化运维工具Ansible的部署步骤详解
    本文来源于http:sofar.blog.51cto.com3535721579894,主要是看到这样一篇好文章,想留下来供各位同僚一起分享。一、基础介绍1、简介ansible是新 ... [详细]
author-avatar
大约在冬季1122_867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有