使用sklearn對多分類的每個類別進行指標評價操作

 更新時間:2020-06-14 01:15:43   作者:佚名   我要評論(0)

今天晚上,筆者接到客戶的一個需要,那就是:對多分類結果的每個類別進行指標評價,也就是需要輸出每個類型的精確率(precision),召回率(recall)以及F1值(F1-s

今天晚上,筆者接到客戶的一個需要,那就是:對多分類結果的每個類別進行指標評價,也就是需要輸出每個類型的精確率(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()

生成的混淆矩陣圖片如下:

補充知識:python Sklearn實現xgboost的二分類和多分類

二分類:

train2.txt的格式如下:

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種。數據格式如下:

# -*- 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對多分類的每個類別進行指標評價操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • sklearn-SVC實現與類參數詳解
  • python sklearn包——混淆矩陣、分類報告等自動生成方式
  • Python sklearn庫實現PCA教程(以鳶尾花分類為例)
  • python運用sklearn實現KNN分類算法
  • Python 線性回歸分析以及評價指標詳解

相關文章

  • 使用sklearn對多分類的每個類別進行指標評價操作

    使用sklearn對多分類的每個類別進行指標評價操作

    今天晚上,筆者接到客戶的一個需要,那就是:對多分類結果的每個類別進行指標評價,也就是需要輸出每個類型的精確率(precision),召回率(recall)以及F1值(F1-s
    2020-06-14
  • python能開發游戲嗎

    python能開發游戲嗎

    python可以寫游戲,但不適合。下面我們來分析一下具體原因。 用錘子能造汽車嗎? 誰也沒法說不能吧?歷史上也確實曾經有些汽車,是用錘子造出來的。但一般來說,還是
    2020-06-14
  • python編寫softmax函數、交叉熵函數實例

    python編寫softmax函數、交叉熵函數實例

    python代碼如下: import numpy as np # Write a function that takes as input a list of numbers, and returns # the list of values given by the softmax
    2020-06-14
  • python開發前景如何

    python開發前景如何

    隨著近幾年Python的飛速發展,應用范圍逐步趨于廣泛,后端開發、前端開發、爬蟲、金融量化分析、人工智能、自動化運維、自動化運維、大數據,Python都有涉及。Pytho
    2020-06-14
  • 新手學python應該下哪個版本

    新手學python應該下哪個版本

    想學習Python的人都會有一個困惑,那就是Python目前有兩個版本Python2和Python3,Python2與Python3有何區別,兩個版本該學習哪個呢? python3 和 python2是不兼容的
    2020-06-14
  • python的help函數如何使用

    python的help函數如何使用

    help函數是python的一個內置函數,在python基礎知識中介紹過什么是內置函數,它是python自帶的函數,任何時候都可以被使。help函數能作什么、怎么使用help函數查看p
    2020-06-14
  • keras實現多種分類網絡的方式

    keras實現多種分類網絡的方式

    Keras應該是最簡單的一種深度學習框架了,入門非常的簡單. 簡單記錄一下keras實現多種分類網絡:如AlexNet、Vgg、ResNet 采用kaggle貓狗大戰的數據作為數據集. 由于
    2020-06-14
  • 基于python實現模擬數據結構模型

    基于python實現模擬數據結構模型

    模擬棧 Stack() 創建一個空的新棧。 它不需要參數,并返回一個空棧。 push(item)將一個新項添加到棧的頂部。它需要 item 做參數并不返回任何內容。 pop()
    2020-06-14
  • python新手學習使用庫

    python新手學習使用庫

    本文主要介紹下如何使用第三方庫。 1. 理解第三方庫 Python相當于一個手機,第三方庫相當于手機里各種各樣的APP。 當我們想搭建網站時,可以選擇功能全面的Django、
    2020-06-14
  • Python數據可視化圖實現過程詳解

    Python數據可視化圖實現過程詳解

    python畫分布圖代碼示例: # encoding=utf-8 import matplotlib.pyplot as plt from pylab import * # 支持中文 mpl.rcParams['font.sans-serif'] = ['SimHei']
    2020-06-14

最新評論

买宝宝用品赚钱吗 牛金所配资炒股怎么样 浙江6+1体彩18140开奖结果 宁夏十一选五前三直 上海11选5彩经网 福建快三推荐号码今天 11远5北京开奖走势图 002540股票分析 安徽体彩十一选五手机版 吉林十一选五中奖技巧 中国体彩11选五开奖黑龙江省 买股票那个证券开户好 排列五走势图带坐标连 s江苏十一选五任三技巧 幸运农场走势图实时 彩票开奖结果 手机股票行情软件