à partir de sklearn import model_selection
test_size = 0,33
seed = 7
X_train, X_test, y_train, y_test = model_selection.train_test_split(feature_vectors, y, test_size=test_size, random_state=seed)
de sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix
model = LogisticRegression()
model.fit(X_train, y_train)
result = model.score(X_test, y_test)
print("Précision: %.3f%%" % (result*100,0))
y_pred = model.predict(X_test)
print("Score F1: ", f1_score(y_test, y_pred, average="macro"))
print("Score de Précision: ", precision_score(y_test, y_pred, average="macro"))
print("Score de Rappel: ", recall_score(y_test, y_pred, average="macro"))
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
de sklearn.metrics import confusion_matrix
def cm_analysis(y_true, y_pred, labels, ymap=None, figsize=(10,10)):
"""
Générer une matrice de confusion avec de jolies annotations.
args:
y_true: vrai label des données, avec une forme (nsamples,)
y_pred: prédiction des données, avec une forme (nsamples,)
filename: nom de fichier du fichier image à enregistrer
labels: tableau de chaînes, nommez l'ordre des étiquettes de classe dans la matrice de confusion.
utilisez `clf.classes_` si vous utilisez des modèles scikit-learn.
avec une forme (nclasse,).
ymap: dict: any -> string, longueur == nclasse.
si non None, mappez les étiquettes et ys à des chaînes plus compréhensibles.
Attention: y_true, y_pred et les étiquettes originales doivent être alignés.
figsize: la taille de l'image de la figure tracée.
"""
if ymap is not None:
# changer les codes ou libellés de catégorie en de nouveaux libellés
y_pred = [ymap[yi] pour yi in y_pred]
y_true = [ymap[yi] pour yi in y_true]
labels = [ymap[yi] pour yi in labels]
# calculer une matrice de confusion avec les nouvelles étiquettes
cm = confusion_matrix(y_true, y_pred, labels=labels)
# calculer les sommes des lignes (pour calculer % & annotations de tracé)
cm_sum = np.sum(cm, axis=1, keepdims=True)
# calculer des proportions
cm_perc = cm / cm_sum.astype(float) * 100
# tableau vide pour contenir les annotations pour chaque cellule dans le heatmap
annot = np.empty_like(cm).astype(str)
# obtenir les dimensions
nrows, ncols = cm.shape
# parcourir les cellules et créer des annotations pour chaque cellule
for i in range(nrows):
for j in range(ncols):
# obtenir le compte pour la cellule
c = cm[i, j]
# obtenir le pourcentage pour la cellule
p = cm_perc[i, j]
si i == j:
s = cm_sum[i]
# convertir la proportion, le décompte et la somme des lignes en une chaîne avec un format joli
annot[i, j] = '%.1f%%\n%d/%d' % (p, c, s)
elif c == 0:
annot[i, j] = ''
else:
annot[i, j] = '%.1f%%\n%d' % (p, c)
# convertir le tableau en un dataframe. Pour tracer par proportion au lieu de nombre, utilisez cm_perc dans le DataFrame au lieu de cm
cm = pd.DataFrame(cm, index=labels, columns=labels)
cm.index.name = 'Réel'
cm.columns.name = 'Prévu'
# créer une figure vide avec une taille spécifiée
fig, ax = plt.subplots(figsize=figsize)
# tracer les données en utilisant le dataframe Pandas. Pour changer la carte de couleur, ajoutez cmap=..., par exemple cmap = 'rocket_r'
sns.heatmap(cm, annot=annot, fmt='', ax=ax)
#plt.savefig(filename)
plt.show()
cm_analysis(y_test,y_pred,model.classes_,ymap=None,figsize=(10,10))
utilisant https://gist.github.com/hitvoice/36cf44689065ca9b927431546381a3f7
Notez que si vous utilisez rocket_r
, il inversera les couleurs et d'une certaine manière cela semble plus naturel et meilleur comme ci-dessous: