使用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内置函数bin() oct()等实现进制转换
Dec 30 Python
python判断端口是否打开的实现代码
Feb 10 Python
python简单程序读取串口信息的方法
Mar 13 Python
python正则表达式match和search用法实例
Mar 26 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
python实现视频分帧效果
May 31 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
python getpass模块用法及实例详解
Oct 07 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
详解KMP算法以及python如何实现
Sep 18 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 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
php模拟js函数unescape的函数代码
2012/10/20 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
php mysql 封装类实例代码
2016/09/18 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
js实现点赞效果
2020/03/16 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
使用Python编写Prometheus监控的方法
2018/10/15 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
python与idea的集成的实现
2020/11/20 Python
python 写一个文件分发小程序
2020/12/05 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
校长先进事迹材料
2014/02/01 职场文书
工作保证书范文
2014/04/29 职场文书
丧事主持词
2015/07/02 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书