搜索
Hi~登录注册
查看: 984|回复: 0

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

[复制链接]

0

主题

0

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2020-6-22 13:41:05 | 显示全部楼层 |阅读模式
本日晚上,笔者接到客户的一个需要,那就是:对多分类结果的每个类别进行指标评价,也就是需要输出每个类型的精确率(precision),召回率(recall)以及F1值(F1-score)。
对于这个需求,我们可以用sklearn来解决,方法并没有难,笔者在此仅做记录,供本身以后以及读者参考。
我们模拟的数据如下:
y_true = ['北京', '上海', '成都', '成都', '上海', '北京', '上海', '成都', '北京', '上海']
y_pred = ['北京', '上海', '成都', '上海', '成都', '成都', '上海', '成都', '北京', '上海']
其中y_true为真实数据,y_pred为多分类后的模拟数据。使用sklearn.metrics中的classification_report即可实现对多分类的每个类别进行指标评价。
示例的Python代码如下:
  1. # -*- coding: utf-8 -*-from sklearn.metrics import classification_reporty_true = ['北京', '上海', '成都', '成都', '上海', '北京', '上海', '成都', '北京', '上海']y_pred = ['北京', '上海', '成都', '上海', '成都', '成都', '上海', '成都', '北京', '上海']t = classification_report(y_true, y_pred, target_names=['北京', '上海', '成都'])print(t)
复制代码
输出结果如下:
  1. 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    10weighted avg    0.75   0.70   0.71    10
复制代码
需要注意的是,输出的结果数据类型为str,如果需要使用该输出结果,则可将该方法中的output_dict参数设置为True,此时输出的结果如下:
  1. {‘北京': {‘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方法可以输出该多分类问题的混淆矩阵,代码如下:
  1. from sklearn.metrics import confusion_matrixy_true = ['北京', '上海', '成都', '成都', '上海', '北京', '上海', '成都', '北京', '上海']y_pred = ['北京', '上海', '成都', '上海', '成都', '成都', '上海', '成都', '北京', '上海']print(confusion_matrix(y_true, y_pred, labels = ['北京', '上海', '成都']))
复制代码
输出结果如下:
  1. [[2 0 1] [0 3 1] [0 1 2]]
复制代码
为了将该混淆矩阵绘制成图片,可使用如下的Python代码:
  1. # -*- coding: utf-8 -*-# author: Jclian91# place: Daxing Beijing# time: 2019-11-14 21:52from sklearn.metrics import confusion_matriximport matplotlib.pyplot as pltimport 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()
复制代码
生成的混淆矩阵图片如下:

补充知识:python Sklearn实现xgboost的二分类和多分类
二分类:
train2.txt的格式如下:
  1. import numpy as npimport pandas as pdimport sklearnfrom sklearn.cross_validation import train_test_split,cross_val_scorefrom xgboost.sklearn import XGBClassifierfrom sklearn.metrics import precision_score,roc_auc_scoremin_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种。数据格式如下:
  1. # -*- coding:utf-8 -*-from sklearn import datasetsfrom sklearn.multiclass import OneVsRestClassifierfrom sklearn.svm import LinearSVCfrom sklearn.cross_validation import train_test_split,cross_val_scorefrom sklearn.svm import SVCfrom sklearn.linear_model import LogisticRegressionfrom xgboost.sklearn import XGBClassifierimport sklearnimport numpy as npfrom sklearn.preprocessing import OneHotEncoderfrom sklearn.metrics import precision_score,roc_auc_scoremin_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···100Y = 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对多分类的每个类别进行指标评价操纵就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 点我注册

快速回复 返回顶部 返回列表