时间:2021-05-22
今天晚上,笔者接到客户的一个需要,那就是:对多分类结果的每个类别进行指标评价,也就是需要输出每个类型的精确率(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_reporty_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 10weighted 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_matrixy_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: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的格式如下:
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种。数据格式如下:
# -*- 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对多分类的每个类别进行指标评价操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1月9日,电子商务报获悉,全球特快专递近日发表声明称,为了帮助平台商家进行更详细的分类操作,同时重点关注和开发部分类别,平台对行李行业旅游相关类别和秋冬类等类别
速卖通平台发布2017年审查标准全球速卖通平台发布2017年商品和类别审查标准。2017年,速卖通经营过程的评价分为商品服务指标评价和类别服务指标评价两部分。其
YouTube是美国最大的媒体平台,平台有很多分类,从VLOG、科学技术评价到户外运动都有。如何判断ouTube频道是否具有商业价值?适合自己的店铺进行市场营销
  如何利用分类信息网站SEO进行网站推广  时下很多分类信息网站的权重是很高的,例如赶集网、58同城还有很多分类信息网
确立规范、合理的评价标准,构建科学、实用的分类评价指标体系,对评价目的相同的同一类型网站规定统一的评价标准。目前的评价标准基本稳定,较为成熟,但逻辑层次不清,设