0

Je suis la formation d'un modèle de classification de régression logistique et d'essayer de comparer les résultats en utilisant la matrice de confusion, et le calcul de la précision, le rappel, la précision du code est donnée ci-dessousprecision_recall_fscore_support retourne les mêmes valeurs pour la précision, la précision et le rappel

# logistic regression classification model 
clf_lr = sklearn.linear_model.LogisticRegression(penalty='l2', class_weight='balanced') 
logistic_fit=clf_lr.fit(TrainX, np.where(TrainY >= delay_threshold,1,0)) 
pred = clf_lr.predict(TestX) 

# print results 
cm_lr = confusion_matrix(np.where(TestY >= delay_threshold,1,0), pred) 
print("Confusion matrix") 
print(pd.DataFrame(cm_lr)) 
report_lr = precision_recall_fscore_support(list(np.where(TestY >= delay_threshold,1,0)), list(pred), average='micro') 
print ("\nprecision = %0.2f, recall = %0.2f, F1 = %0.2f, accuracy = %0.2f\n" % \ 
      (report_lr[0], report_lr[1], report_lr[2], accuracy_score(list(np.where(TestY >= delay_threshold,1,0)), list(pred)))) 
print(pd.DataFrame(cm_lr.astype(np.float64)/cm_lr.sum(axis=1))) 

show_confusion_matrix(cm_lr) 
#linear_score = cross_validation.cross_val_score(linear_clf, ArrX, ArrY,cv=10) 
#print linear_score 

les résultats attendus sont

Confusion matrix 
     0  1 
0 4303 2906 
1 1060 1731 

precision = 0.37, recall = 0.62, F1 = 0.47, accuracy = 0.60 

      0   1 
0 0.596893 1.041204 
1 0.147038 0.620208 

cependant mes sorties sont

Confusion matrix 
     0  1 
0 4234 2891 
1 1097 1778 

precision = 0.60, recall = 0.60, F1 = 0.60, accuracy = 0.60 

      0   1 
0 0.594246 1.005565 
1 0.153965 0.618435 

Comment puis-je obtenir des résultats corrects?

Répondre

1

Dans un cas 'binaire' comme le vôtre (2 classes), vous devez utiliser average = 'binary' au lieu de average = 'micro'.

Par exemple:

TestY = [0, 1, 1, 0, 1, 1, 1, 0, 0, 0] 
pred = [0, 1, 1, 0, 0, 1, 0, 1, 0, 0] 
# print results 
cm_lr = metrics.confusion_matrix(TestY, pred) 
print("Confusion matrix") 
print(pd.DataFrame(cm_lr)) 
report_lr = metrics.precision_recall_fscore_support(TestY, pred, average='binary') 
print ("\nprecision = %0.2f, recall = %0.2f, F1 = %0.2f, accuracy = %0.2f\n" % \ 
      (report_lr[0], report_lr[1], report_lr[2], metrics.accuracy_score(TestY, pred))) 

et la sortie:

Confusion matrix 
    0 1 
0 4 1 
1 2 3 

precision = 0.75, recall = 0.60, F1 = 0.67, accuracy = 0.70 

binaire a une définition par défaut dont la classe est positive (la classe avec le 1 étiquette). Vous pouvez lire les différences entre toutes les options de moyenne dans ce link.

+0

Parfait! ...................... – Ani