使用sklearn对多分类的每个类别进行指标评价操作


Posted in Python onJune 11, 2020

今天晚上,笔者接到客户的一个需要,那就是:对多分类结果的每个类别进行指标评价,也就是需要输出每个类型的精确率(precision),召回率(recall)以及F1值(F1-score)。

对于这个需求,我们可以用sklearn来解决,方法并没有难,笔者在此仅做记录,供自己以后以及读者参考。

我们模拟的数据如下:

y_true = ['北京', '上海', '成都', '成都', '上海', '北京', '上海', '成都', '北京', '上海']
y_pred = ['北京', '上海', '成都', '上海', '成都', '成都', '上海', '成都', '北京', '上海']

其中y_true为真实数据,y_pred为多分类后的模拟数据。使用sklearn.metrics中的classification_report即可实现对多分类的每个类别进行指标评价。

示例的Python代码如下:

# -*- coding: utf-8 -*-
from sklearn.metrics import classification_report

y_true = ['北京', '上海', '成都', '成都', '上海', '北京', '上海', '成都', '北京', '上海']
y_pred = ['北京', '上海', '成都', '上海', '成都', '成都', '上海', '成都', '北京', '上海']

t = classification_report(y_true, y_pred, target_names=['北京', '上海', '成都'])

print(t)

输出结果如下:

precision  recall f1-score  support

     北京    0.75   0.75   0.75     4
     上海    1.00   0.67   0.80     3
     成都    0.50   0.67   0.57     3

  accuracy              0.70    10
  macro avg    0.75   0.69   0.71    10
weighted avg    0.75   0.70   0.71    10

需要注意的是,输出的结果数据类型为str,如果需要使用该输出结果,则可将该方法中的output_dict参数设置为True,此时输出的结果如下:

{‘北京': {‘precision': 0.75, ‘recall': 0.75, ‘f1-score': 0.75, ‘support': 4},
‘上海': {‘precision': 1.0, ‘recall': 0.6666666666666666, ‘f1-score': 0.8, ‘support': 3},
‘成都': {‘precision': 0.5, ‘recall': 0.6666666666666666, ‘f1-score': 0.5714285714285715, ‘support': 3},
‘accuracy': 0.7,
‘macro avg': {‘precision': 0.75, ‘recall': 0.6944444444444443, ‘f1-score': 0.7071428571428572, ‘support': 10},
‘weighted avg': {‘precision': 0.75, ‘recall': 0.7, ‘f1-score': 0.7114285714285715, ‘support': 10}}

使用confusion_matrix方法可以输出该多分类问题的混淆矩阵,代码如下:

from sklearn.metrics import confusion_matrix
y_true = ['北京', '上海', '成都', '成都', '上海', '北京', '上海', '成都', '北京', '上海']
y_pred = ['北京', '上海', '成都', '上海', '成都', '成都', '上海', '成都', '北京', '上海']
print(confusion_matrix(y_true, y_pred, labels = ['北京', '上海', '成都']))

输出结果如下:

[[2 0 1]
 [0 3 1]
 [0 1 2]]

为了将该混淆矩阵绘制成图片,可使用如下的Python代码:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Daxing Beijing
# time: 2019-11-14 21:52

from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
import matplotlib as mpl

# 支持中文字体显示, 使用于Mac系统
zhfont=mpl.font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")

y_true = ['北京', '上海', '成都', '成都', '上海', '北京', '上海', '成都', '北京', '上海']
y_pred = ['北京', '上海', '成都', '上海', '成都', '成都', '上海', '成都', '北京', '上海']

classes = ['北京', '上海', '成都']
confusion = confusion_matrix(y_true, y_pred)

# 绘制热度图
plt.imshow(confusion, cmap=plt.cm.Greens)
indices = range(len(confusion))
plt.xticks(indices, classes, fontproperties=zhfont)
plt.yticks(indices, classes, fontproperties=zhfont)
plt.colorbar()
plt.xlabel('y_pred')
plt.ylabel('y_true')

# 显示数据
for first_index in range(len(confusion)):
  for second_index in range(len(confusion[first_index])):
    plt.text(first_index, second_index, confusion[first_index][second_index])

# 显示图片
plt.show()

生成的混淆矩阵图片如下:

使用sklearn对多分类的每个类别进行指标评价操作

补充知识:python Sklearn实现xgboost的二分类和多分类

二分类:

train2.txt的格式如下:

使用sklearn对多分类的每个类别进行指标评价操作

import numpy as np
import pandas as pd
import sklearn
from sklearn.cross_validation import train_test_split,cross_val_score
from xgboost.sklearn import XGBClassifier
from sklearn.metrics import precision_score,roc_auc_score

min_max_scaler = sklearn.preprocessing.MinMaxScaler(feature_range=(-1,1))
resultX = []
resultY = []
with open("./train_data/train2.txt",'r') as rf:
  train_lines = rf.readlines()
  for train_line in train_lines:
    train_line_temp = train_line.split(",")
    train_line_temp = map(float, train_line_temp)
    line_x = train_line_temp[1:-1]
    line_y = train_line_temp[-1]
    resultX.append(line_x)
    resultY.append(line_y)

X = np.array(resultX)
Y = np.array(resultY)
X = min_max_scaler.fit_transform(X)
X_train,X_test, Y_train, Y_test = train_test_split(X,Y,test_size=0.3)

xgbc = XGBClassifier()
xgbc.fit(X_train,Y_train)
pre_test = xgbc.predict(X_test)

auc_score = roc_auc_score(Y_test,pre_test)
pre_score = precision_score(Y_test,pre_test)

print("xgb_auc_score:",auc_score)
print("xgb_pre_score:",pre_score)

多分类:有19种分类其中正常0,异常1~18种。数据格式如下:

使用sklearn对多分类的每个类别进行指标评价操作

# -*- coding:utf-8 -*-
from sklearn import datasets
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
from sklearn.cross_validation import train_test_split,cross_val_score
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from xgboost.sklearn import XGBClassifier
import sklearn
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import precision_score,roc_auc_score
min_max_scaler = sklearn.preprocessing.MinMaxScaler(feature_range=(-1,1))

resultX = []
resultY = []
with open("../train_data/train_multi_class.txt",'r') as rf:
  train_lines = rf.readlines()
  for train_line in train_lines:
    train_line_temp = train_line.split(",")
    train_line_temp = map(float, train_line_temp) # 转化为浮点数
    line_x = train_line_temp[1:-1]
    line_y = train_line_temp[-1]
    resultX.append(line_x)
    resultY.append(line_y)

X = np.array(resultX)
Y = np.array(resultY)

#fit_transform(partData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该partData进行转换transform,从而实现数据的标准化、归一化等等。。
X = min_max_scaler.fit_transform(X)
#通过OneHotEncoder函数将Y值离散化成19维,例如3离散成000000···100

Y = OneHotEncoder(sparse = False).fit_transform(Y.reshape(-1,1))
X_train,X_test, Y_train, Y_test = train_test_split(X,Y,test_size=0.2)

model = OneVsRestClassifier(XGBClassifier(),n_jobs=2)
clf = model.fit(X_train, Y_train)

pre_Y = clf.predict(X_test)
test_auc2 = roc_auc_score(Y_test,pre_Y)#验证集上的auc值
print ("xgb_muliclass_auc:",test_auc2)

以上这篇使用sklearn对多分类的每个类别进行指标评价操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用PyV8执行javascript代码示例分享
Dec 04 Python
Python的print用法示例
Feb 11 Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
django输出html内容的实例
May 27 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
Python检测端口IP字符串是否合法
Jun 05 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
python属于解释语言吗
Jun 11 #Python
numpy的Fancy Indexing和array比较详解
Jun 11 #Python
python如何更新包
Jun 11 #Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 #Python
Keras中的多分类损失函数用法categorical_crossentropy
Jun 11 #Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 #Python
python中什么是面向对象
Jun 11 #Python
You might like
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
PHP 函数学习简单小结
2010/07/08 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
php封装实现钉钉机器人报警接口的示例代码
2020/08/08 PHP
js玩一玩WSH吧
2007/02/23 Javascript
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
python daemon守护进程实现
2016/08/27 Python
python如何在循环引用中管理内存
2018/03/20 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
财政局长自荐信范文
2013/12/22 职场文书
晨会主持词
2014/03/17 职场文书
欢迎领导标语
2014/06/27 职场文书
超市工作总结范文2014
2014/12/19 职场文书
小学生毕业评语
2014/12/26 职场文书
通知函的格式
2015/04/27 职场文书
聘用合同范本
2015/09/21 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
mysql全面解析json/数组
2022/07/07 MySQL