当前位置: 首页 > news >正文

Python计算分类问题的评价指标(准确率、精确度、召回率和F1值,Kappa指标)

机器学习的分类问题常用评论指标有:准确率、精确度、召回率和F1值,还有kappa指标 。

每次调包去找他们的计算代码很麻烦,所以这里一次性定义一个函数,直接计算所有的评价指标。

每次输入预测值和真实值就可以得到上面的指标值,很方便。

下面是这些指标的计算公式:

kappa指标:

  


Python计算代码

下面是定义函数:(主要也是借助sklearn库)

#导入数据分析常用包
import numpy as np 
import pandas as pd from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import cohen_kappa_scoredef evaluation(y_test, y_predict):accuracy=classification_report(y_test, y_predict,output_dict=True)['accuracy']s=classification_report(y_test, y_predict,output_dict=True)['weighted avg']precision=s['precision']recall=s['recall']f1_score=s['f1-score']#kappa=cohen_kappa_score(y_test, y_predict)return accuracy,precision,recall,f1_score #, kappa

这个函数就两个参数,真实值和预测值,放入就可以计算上面的所有指标了,函数的返回值就是accuracy,precision,recall,f1_score #, kappa。

kappa我注释掉了,要用的话拿出来就行。


画图展示:

比如我们已经准备好了特征变量X和响应变量y

下面划分测试集和训练集:

#划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,stratify=y,test_size=0.2,random_state=0)

标准化一下: 

#数据标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)
print('训练数据形状:')
print(X_train_s.shape,y_train.shape)
print('验证集数据形状:')
print(X_test_s.shape,y_test.shape)

弄十个机器学习模型对比:

from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from xgboost.sklearn import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier

 实例化分类器:

#逻辑回归
model1 =  LogisticRegression(C=1e10,max_iter=10000)#线性判别分析
model2 = LinearDiscriminantAnalysis()#K近邻
model3 = KNeighborsClassifier(n_neighbors=10)#决策树
model4 = DecisionTreeClassifier(random_state=77)#随机森林
model5= RandomForestClassifier(n_estimators=1000,  max_features='sqrt',random_state=10)#梯度提升
model6 = GradientBoostingClassifier(random_state=123)#极端梯度提升
model7 =  XGBClassifier(use_label_encoder=False,eval_metric=['logloss','auc','error'],objective='multi:softmax',random_state=0)
#轻量梯度提升
model8 = LGBMClassifier(objective='multiclass',num_class=3,random_state=1)#支持向量机
model9 = SVC(kernel="rbf", random_state=77)#神经网络
model10 = MLPClassifier(hidden_layer_sizes=(16,8), random_state=77, max_iter=10000)model_list=[model1,model2,model3,model4,model5,model6,model7,model8,model9,model10]
model_name=['逻辑回归','线性判别','K近邻','决策树','随机森林','梯度提升','极端梯度提升','轻量梯度提升','支持向量机','神经网络']

 计算评价指标:用df_eval数据框装起来计算的评价指标数值

df_eval=pd.DataFrame(columns=['Accuracy','Precision','Recall','F1_score'])
for i in range(10):model_C=model_list[i]name=model_name[i]model_C.fit(X_train_s, y_train)pred=model_C.predict(X_test_s)#s=classification_report(y_test, pred)s=evaluation(y_test,pred)df_eval.loc[name,:]=list(s)

 查看

df_eval

 

 

 画对应的柱状图:

import matplotlib.pyplot as plt 
plt.rcParams['font.sans-serif'] = ['KaiTi']  #中文
plt.rcParams['axes.unicode_minus'] = False   #负号bar_width = 0.4
colors=['c', 'b', 'g', 'tomato', 'm', 'y', 'lime', 'k','orange','pink','grey','tan']
fig, ax = plt.subplots(2,2,figsize=(10,8),dpi=128)
for i,col in enumerate(df_eval.columns):n=int(str('22')+str(i+1))plt.subplot(n)df_col=df_eval[col]m =np.arange(len(df_col))plt.bar(x=m,height=df_col.to_numpy(),width=bar_width,color=colors)#plt.xlabel('Methods',fontsize=12)names=df_col.indexplt.xticks(range(len(df_col)),names,fontsize=10)plt.xticks(rotation=40)plt.ylabel(col,fontsize=14)plt.tight_layout()
#plt.savefig('柱状图.jpg',dpi=512)
plt.show()

 四个评价指标,对应的十种模型进行对比。

这个自定义计算分类评价指标函数还是很方便的,还可以用于交叉验证里面,全面评价模型的预测好坏程度。

http://www.lryc.cn/news/29112.html

相关文章:

  • 51单片机LCD1602的使用
  • [深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?
  • zio1升级到zio2踩坑和总结
  • 【算法题】1834. 单线程 CPU
  • Vue学习[2023]
  • 【Redis】Redis分片集群
  • 【Android笔记81】Android之RxJava的介绍及其使用
  • Pr 定格拍照动画
  • 放弃node-sass,启用sass
  • 力扣旋转字符串
  • Java 代码组织机制
  • 【剧前爆米花--爪哇岛寻宝】MySQL中索引和事务
  • C++ 线程库
  • python字典和集合——笔记
  • TEX:显示文本
  • SS-ELM-AE与S2-BLS相关论文阅读记录
  • ESP32设备驱动-MAX6675冷端补偿K热电偶数字转换器
  • Python基础知识汇总(字符串四)
  • C语言学习笔记——指针(初阶)
  • 阿赵的MaxScript学习笔记分享十二《获取和导出各种数据》
  • react-draggable实现拖拽详解
  • 01.进程和线程的区别
  • 逻辑优化-rewrite
  • 文件传输与聊天系统设计
  • 蓝桥杯第十四届校内赛(第三期) C/C++ B组
  • 有关平方或高次方的公式整理一元高次方程的求解
  • Java笔记3
  • Leetcode.2202 K 次操作后最大化顶端元素
  • JAVA知识点全面总结3:String类的学习
  • Eureka注册中心和Nacos注册中心详解以及Nacos与Eureka有什么区别?