如何解决混淆矩阵结果与分类报告显示的结果不同
我正在训练 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","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][:,:].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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。