混淆矩阵结果与分类报告显示的结果不同

2024-09-28 05:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在培训8种不同的模型(二进制和多标签分类),我发现混淆矩阵显示和分类报告之间存在一些差异

F是2020句 M是1059个句子

NB模型错误地分类了大多数属于F的句子,但分类报告中的精度为>;0.70也许我读得不好

Model name: Model_G_NB
Binary classification-----
precision_score : 0.3588210166595472
precision_score_micro : 0.44137707047742775
precision_score_macro : 0.5310365245899362
f1_b : 0.49411764705882355
f1_mi : 0.44137707047742775
f1_ma : 0.4352386639935162
recall : 0.7932011331444759
recall_mi : 0.44137707047742775
recall_macro : 0.5250659131068914
confusion Matrix

confusion matrice [[ 519 1501]
 [ 219  840]]
              precision    recall  f1-score   support

           F       0.70      0.26      0.38      2020
           M       0.36      0.79      0.49      1059

    accuracy                           0.44      3079
   macro avg       0.53      0.53      0.44      3079
weighted avg       0.58      0.44      0.42      3079

正如您所看到的,M类的精度实际上与混淆矩阵中的TP不对应,或者我读错了报告

使用代码行复制示例以获取此分类报告:

import torch
import numpy as np
from transformers import FlaubertModel, FlaubertTokenizer
texte = [ "Emaillé de références littéraires appropriées quoiqu'assez stéréotypées ('Erlkönig' de Goethe, 'The Raven' de Poe...), cette adaptation/mise en abyme du petit chaperon rouge ne cherche pas à faire peur, mais plutôt à instaurer une ambiance grâce à une photographie assez élaborée et un minimalisme bienvenu dans les effets spéciaux.
", "En tant qu'adulte, je n'aime pas le style des dessins, contrairement à mon fiston, mais en revanche, je tiens à souligner que l'intrigue et les rebondissements sont dignes des meilleurs romans à suspense que j'ai lus.
","Un court passage, mais une scène culte.
", "Son chef d'oeuvre reste Landcruising mais M.S.A.F.A.R.A est à peu prés aussi génial.
","j'ai 3 chats, dont une de 12 ans, mais grâce à ce livre j'en apprend encore sur eux !"]

ylabels = ["F","F","F","F","M"]

嵌入


def get_flaubert_layer(texte):
  Model = ['flaubert-small-cased']
    flaubert, log = FlaubertModel.from_pretrained(modelname[0], output_loading_info=True)
    flaubert_tokenizer = FlaubertTokenizer.from_pretrained(modelname[0], do_lowercase=False)
    tokenized = texte.apply((lambda x: flaubert_tokenizer.encode(x, add_special_tokens=True)))
    max_len = 0
    for i in tokenized.values:
        if len(i) > max_len:
            max_len = len(i)
    padded = np.array([i + [0] * (max_len - len(i)) for i in tokenized.values])
    token_ids = torch.tensor(padded)
    with torch.no_grad():
        last_layer = flaubert(token_ids)[0][:,0,:].numpy()
        
    return last_layer, Model
    model1 = LinearSVC()
    model2 = GaussianNB()  # MultinomialNB() X cannot be a non-negative
    model3 = LogisticRegression()
    model4 = RandomForestClassifier()
    model5 = KNeighborsClassifier()
    model6 = MLPClassifier(hidden_layer_sizes=(150,100,50), max_iter=1000, activation = 'relu',solver='adam',random_state=1)
    model8 = XGBClassifier(eval_metric = "logloss")
    model7 = LinearDiscriminantAnalysis()

    models = {'Model_SVC': model1, 'Model_G_NB': model2, 'Model_LR': model3, 'Model_RF': model4, 
    'Model_KN': model5, 'Model_MLP': model6, 'Model_LDA': model7,
    'Model_XGB': model8}
    
    features, modelname = get_flaubert_layer(texte)
    
    metrics = [ 'model', 'precision', 'precision_micro', 'precision_macro', 'rappel' ,
     'rappel_micro', 'rappel_macro', 'F_mesure', 'F_mesure_micro', 'F_mesure_macro']
    
    dic_metrics = collections.defaultdict(dict)
    dic_matrices = collections.defaultdict(dict)
    
    cv_splitter = KFold(n_splits=10, shuffle=False, random_state=42)
    
    print("-----------------------------------")
        
    for model_name, model in models.items():
        print("Model name: {}".format(model_name))
        y_pred = cross_val_predict(model, features, ylabels, cv=cv_splitter)
        print("Binary classification-----")
        
        cm = confusion_matrix(ylabels, y_pred)
        recall = np.diag(cm) / np.sum(cm, axis=1)
        precision = np.diag(cm) / np.sum(cm, axis=0)
        
        print("confusion Matrix\n")
        print("confusion matrice" , cm)
        
        print(classification_report(ylabels, y_pred))
        
        

Tags: layermodellennp分类cmmaxprecision

热门问题