4 votes

Sklearn - le traçage du rapport de classification donne un résultat différent de la moyenne de base ?

Je voulais tirer parti de cette réponse Comment tracer le rapport de classification de scikit learn ? transformer un rapport de classification sklearn en une carte thermique.

Tout fonctionne avec leur exemple de rapport, mais mon rapport de classification est légèrement différent, ce qui perturbe les fonctions.

Leur rapport (remarquez la moyenne / le total) :

sampleClassificationReport =             
                   precision    recall  f1-score   support

          Acacia        0.62      1.00      0.76        66
          Blossom       0.93      0.93      0.93        40
          Camellia      0.59      0.97      0.73        67
          Daisy         0.47      0.92      0.62       272
          Echium        1.00      0.16      0.28       413

        avg / total     0.77      0.57      0.49       858

Mon rapport avec metrics.classification_report(valid_y, y_pred) :

              precision    recall  f1-score   support

           0       1.00      0.18      0.31        11
           1       0.00      0.00      0.00        14
           2       0.00      0.00      0.00        19
           3       0.50      0.77      0.61        66
           4       0.39      0.64      0.49        47
           5       0.00      0.00      0.00        23

    accuracy                           0.46       180
   macro avg       0.32      0.27      0.23       180
weighted avg       0.35      0.46      0.37       180

La question, tirée de la réponse sélectionnée dans le lien de la carte thermique, est ici :

for line in lines[2 : (len(lines) - 2)]:
    t = line.strip().split()
    if len(t) < 2: continue
    classes.append(t[0])
    v = [float(x) for x in t[1: len(t) - 1]]
    support.append(int(t[-1]))
    class_names.append(t[0])
    print(v)
    plotMat.append(v)

Parce que je reçois l'erreur :

ValueError : Impossible de convertir la chaîne en flottant : 'avg'.

Le problème réside donc dans la façon dont mon rapport de classification est généré. Que puis-je changer ici pour correspondre à l'échantillon ?

EDIT : ce que j'ai essayé :

df = pd.DataFrame(metrics.classification_report(valid_y, y_pred)).T

df['support'] = df.support.apply(int)

df.style.background_gradient(cmap='viridis',
                             subset=pd.IndexSlice['0':'9', :'f1-score'])

Erreur :

Erreur de valeur : Le constructeur de DataFrame n'a pas été appelé correctement !

6voto

AILearning Points 535

Avec l'arrivée de output_dict param en classification_report il n'y a pas de problème pour analyser le rapport. Vous pouvez directement utiliser la sortie du rapport de classification pour être lu en tant que pd.DataFrame . Ensuite, vous pourriez utiliser le pd.Style pour rendre la carte thermique.

Exemple :

from sklearn.metrics import classification_report
import numpy as np
import pandas as pd

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, GridSearchCV

X, y = make_classification(n_samples=1000, n_features=30,
                           n_informative=12,
                           n_clusters_per_class=1, n_classes=10,
                           class_sep=2.0, random_state=42)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, stratify=y)

clf = LogisticRegression(max_iter=1000, random_state=42).fit(X_train, y_train)

df = pd.DataFrame(classification_report(clf.predict(X_test), 
                                        y_test, digits=2,
                                        output_dict=True)).T

df['support'] = df.support.apply(int)

df.style.background_gradient(cmap='viridis',
                             subset=pd.IndexSlice['0':'9', :'f1-score'])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X