From 824c640e94c19669f25f0b3e1ecf55743079556b Mon Sep 17 00:00:00 2001 From: Qinqing Liu Date: Mon, 6 Apr 2020 20:45:12 -0400 Subject: [PATCH] add Classification Report and confusion matrix --- __pycache__/utils.cpython-37.pyc | Bin 0 -> 2148 bytes main.py | 2 + result/conf_no_norm_NB_ori.png | Bin 0 -> 22594 bytes result/conf_norm_NB_ori.png | Bin 0 -> 21990 bytes utils.py | 63 +++++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+) create mode 100644 __pycache__/utils.cpython-37.pyc create mode 100644 result/conf_no_norm_NB_ori.png create mode 100644 result/conf_norm_NB_ori.png create mode 100644 utils.py diff --git a/__pycache__/utils.cpython-37.pyc b/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce006f9e9a316d4fd76b984ca864565a057e90e1 GIT binary patch literal 2148 zcma)7-EJF26yBNj{&>A^+%{>GmWu_UB9{`Ew1^9SR5gXWMu-+6EWlmwjO}&yuQOxf zn9Wt-3Ps`(;!9qF2dH?0z2z#efVkkCStly3gcy5wX3m_M^PM^0Is35P_6%sh|MAQB zFI>a;6DQ}b0fPtd$UeN7!AN4Hq)$mbHv0{b(ZovazMVRKXC-(0E;CtUOqs=OPN&VO zH)=44xj&J9i#2g&M3~1~F!vdGVs!m8IN#Xo(rP10LMh`>9EB>*vw`46E>zWt@@zDd zC`m&l;(6a5@+=-_l^umy#Kq@}&hEKNP^&~X9ty1uPZOS9c;qu;7z#W&Cd5#rG)i(z zk8F@ol+?J79AzkqYo)`i6BAcTQ;bUc)MWOOl=f8nb3(wI=Fe1FQ+q_WjGKl&$wU3j zg)>_?QbuX(-kG|k&HU10?GqE^&S|r3EK$Qb^_B+o)@e)mB_LUnBUd@ocIlRsU1Do1 z{YyAs!uEL$n^Po9bye^&2)nG26KT^1X=|Ke5frRLR&MH7KU z?~=+_p%`;D$ikG%${HnksLp^exYh{gvD{nSJckBAUd6t6=T#2g2@Ya4$!97!2dX`) zoQ#KpO9hN?!=-Rh&!ra~&RfLT}j_rX!R6u@?n=9*J5-VO= z!z7IMyR?6Gl8bneXDUqK7ROl%YLyk`NiG&1UR02TL!K^PN^{GhT_tP)KCF8)4d+!8FbkFEiL9JLb&z2|WT|8Ww}dXMsGhBqsFJ9l^PKEaC{_jaFr_Q8km-|KxL z@+pth`F!vwRN><|1C{fYnTiv+T^v>$m<@vqGOa2cRxgRB4c8?eap8A`Hptt=qb~e9 zT6T$ah);duliOsIQ1TY_KrZgXF68zYVjm&5v0?APqsyRxfik9q5k^n21kqDdm!O6& zdnOjblLpGC7PC%mC_9AN%sGML^O~*;WzfUoptW1CX*;?w7+C1{&X81)PE80=6k|pI z-&xb8;$7IRW4L%@y9Ys!+bu7vuMKQ)BjA~ zu34Xc=fcF+t0pea@4Dg|s8t=PL%=o2;Jm;RC&ea;?NL0Q30{Z6k>L*<1mYGhH85Ga z4bep_x8c<{LlJ2rYM#}vd#LK;#zB-0V6*IjM6ScjFntrb;F5J(^J1Ndk3bFya2c`$ zxs=31;1!N4yY6dTRyIqE!y5XU+)tneW!ou-?`b4;ve#+mL!#WZwV) literal 0 HcmV?d00001 diff --git a/main.py b/main.py index d6b5a05..1dcb57d 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ from sklearn.naive_bayes import CategoricalNB from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score +from utils import * K = 5 random_seed = 0 @@ -32,6 +33,7 @@ def read_data(): y_pred = clf.predict(X_test) acc = accuracy_score(y_test, y_pred) print('accuracy is: {}'.format(acc)) +save_cm_figs(y_test, y_pred, 'NB_ori') # confusion matrix # X_2 = X[Y==2] #benign # X_4 = X[Y==4] #cancer diff --git a/result/conf_no_norm_NB_ori.png b/result/conf_no_norm_NB_ori.png new file mode 100644 index 0000000000000000000000000000000000000000..1be0c80af443f4887ca574c7c2dacf3f88eafc00 GIT binary patch literal 22594 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

$^@y-Ep{$1 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 literal 0 HcmV?d00001 diff --git a/result/conf_norm_NB_ori.png b/result/conf_norm_NB_ori.png new file mode 100644 index 0000000000000000000000000000000000000000..8f54c1cbf861d9b73a8271a968038f684fe0f9ae GIT binary patch literal 21990 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 V1zV3`8_r}!$xACq6-XHR|3AbQI%WU> literal 0 HcmV?d00001 diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..99df8bc --- /dev/null +++ b/utils.py @@ -0,0 +1,63 @@ +import matplotlib.pyplot as plt +import numpy as np +from sklearn.metrics import classification_report, confusion_matrix +import itertools + +def plot_confusion_matrix(y_true, y_pred, classes = ['benign', 'cancer'], + normalize=False, + title='Confusion matrix', + cmap=plt.cm.Blues): + """ + This function prints and plots the confusion matrix. + Normalization can be applied by setting `normalize=True`. + """ + print('Confusion Matrix') + cm = confusion_matrix(y_true, y_pred) + print('Classification Report') + target_names = ['benigh', 'cancer'] + print(classification_report(y_true, y_pred, target_names=target_names)) + + if normalize: + cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] + print("Normalized confusion matrix") + else: + print('Confusion matrix, without normalization') + + print(cm) + + plt.imshow(cm, interpolation='nearest', cmap=cmap) + plt.title(title) + plt.colorbar() + tick_marks = np.arange(len(classes)) + plt.xticks(tick_marks, classes, rotation=45) + plt.yticks(tick_marks, classes) + + fmt = '.2f' if normalize else 'd' + thresh = cm.max() / 2. + for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): + plt.text(j, i, format(cm[i, j], fmt), + horizontalalignment="center", + color="white" if cm[i, j] > thresh else "black") + + plt.ylabel('True label') + plt.xlabel('Predicted label') + plt.tight_layout() + + +def save_cm_figs(y_true, y_pred, arc, target_names = ['begign', 'cancer']): + # Compute confusion matrix + + np.set_printoptions(precision=2) + + # Plot non-normalized confusion matrix + plt.figure() + plot_confusion_matrix(y_true, y_pred, classes=target_names, + title='Confusion matrix, without normalization') + plt.savefig('./result/conf_no_norm_{}.png'.format(arc), bbox_inches='tight') + # Plot normalized confusion matrix + plt.figure() + plot_confusion_matrix(y_true, y_pred, classes=target_names, normalize=True, + title='Normalized confusion matrix') + plt.savefig('./result/conf_norm_{}.png'.format(arc), bbox_inches='tight') + plt.show() +