专业的编程技术博客社区

网站首页 > 博客文章 正文

python机器学习:分类问题学习模型的评价方法及代码实现

baijin 2024-10-29 13:05:15 博客文章 9 ℃ 0 评论

一篇文章写清楚一个问题,关注我,自学python!

解决一个机器学习问题都是从问题建模开始,我们首先要收集问题资料,深入理解问题后将其抽象成机器可预测的问题。那么我们的学习模型表现究竟怎么样,该如何进行评估呢?今天就给大家写一写分类问题的评估方法。

评价指标介绍:

介绍指标之前先给大家介绍一下混淆矩阵confusion matrix

对于一个二分类问题,我们可以得到如图所示的的混淆矩阵

1.准确率(accuracy)

准确率表示模型在测试集中预测正确的样本(TP和TN)在所有测试样本(all data)中占的比例。

  注意:在数据集不平衡时,准确率将不能很好地表示模型的性能。可能会存在准确率很高,而少数类样本全分错的情况,此时应选择其它模型评价指标。


2、精确率(查准率)和召回率(查全率)

positive class的精确率(precision)计算公式如下:

positive class的召回率(recall)计算公式如下:

positive class的召回率只和真实为positive的样本相关,与真实为negative的样本无关;而精确率则受到两类样本的影响。请大家仔细理解这句话,理解好这句话才能真正理解为什么我们需要F1score。

3、F1score

F1 Score是precision和recall整合在一起的判定标准。

F1 Score的一般式子为

β是使用者自行定义的参数,由一般式可见F-score能同时考虑precision和recall这两种数值。分子为precision和recall相乘,根据这个式子,只要precision或recall趋近于0,F-score就会趋近于0,代表着这个算法的精确度非常低。一个好的算法,最好能够平衡recall和precision,且尽量让两种指标都很高。

当precision和recall的权重一样时有

F-score最理想的数值是趋近于1,做法是让precision和recall都有很高的值。若两者皆为1,则F-score也为1,代表该算法有着最佳的精确度。

4、ROC曲线

ROC曲线是受试者工作特征曲线 (receiver operating characteristic curve,简称ROC曲线)

ROC曲线纵轴表示真正例率TPR,横轴表示假正例率FPR。

  • 纵轴:真实为正样本中预测是正样本的比例
  • 横轴:真实为负样本中预测是正样本的比例

ROC曲线的绘制过程是:给定数量正样本和负样本,按照预测为正样本的可能性排序,我们先假定阈值为最大,让所有的样本都预测为负样本,这样就可以使得TPR和FPR都为0,于是我们就得到点(0,0);然后让阈值依次取样本的预测值,若为真正例,则上移 ,若为假正例,则右移 ,这样得到的是一个类似阶梯的形状,连成平滑曲线即为ROC曲线。

ROC曲线的作用有2个:

  1. 当需要用ROC曲线来评判两个模型的好坏时,一般比较曲线下的面积AUC,AUC较大的表示性能较好。
  2. 对于同一个模型,ROC曲线可以帮助我们决定模型最佳阈值。

评价指标python实操

现在进行实操,首先,导入数据,训练模型:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
col = ["num_preg", "plasma_glucose_conc", "D_blood_pressure", "skin_fold_thickness", "serum_insulin", "body_mass_index", "pedigree_func", "age", "diabetes"]
diabetes_data = pd.read_csv("dataset/diabetes.txt", names = col)
X = diabetes_data.drop('diabetes', axis = 1)
y = diabetes_data.diabetes
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(max_iter=1000)
mlp.fit(x_train, y_train)

解释一下上面的代码,首先读入了一个糖尿病数据库(请关注私信获取),然后对数据列进行命名,划分训练集和测试集后训练了一个多层感知机模型来预测一个病人是否患糖尿病,模型不作为本文重点,重点看模型评价方法。

准确率accuracy

在本例中就是正确预测的(所有将患糖尿病和不患糖尿病都正确预测的)测试样本数除以所有测试样本。

代码实现


from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test, y_pred)
accRecall (Sensitivity)



精确率precision

在本例中就是在所有预测为患有糖尿病的测试样本中究竟有多少真的得病。

代码实现:

from sklearn.metrics import precision_score
precision_score(y_test, y_pred)



召回率Recall (Sensitivity)

在本例就是在所有真的有糖尿病的测试样本中模型预测出了多少为真。

代码实现:

from sklearn.metrics import recall_score
recall_score(y_test, y_pred)


特异度Specificity

在本例就是在所有真的没病的患者中模型能预测出有多少真正没病。

代码实现:

print("Specificity with recall pos label=0: ",recall_score(y_test, y_pred, pos_label=0))


特异度有点特殊,其实特异度就是预测为阴性时的召回率,所以可以用pos_label参数修改为阴性参数0就好。

F1 score

代码实现:

from sklearn.metrics import f1_score
print("F1 Score: ",f1_score(y_test, y_pred))


ROC曲线

代码如下:

from sklearn.metrics import plot_roc_curve
plot_roc_curve(mlp, x_test, y_test)
plt.show()


小结

今天给大家介绍了准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的意义和代码实现方法。感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么基础没有从零学Python的,加油。

(站外链接发不了,请关注后私信回复“数据链接”获取本头条号所有使用数据)

往期内容:

python机器学习:如何储存训练好的模型并重新调用

python机器学习:如何划分训练集和测试集

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表