{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Άσκηση 01 Pima Indians - Solution.ipynb","provenance":[],"toc_visible":true},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"collapsed":true,"id":"Yxvq-hnA8Iz-"},"source":["# Άσκηση: Συγκρίνετε dummy classifiers και Gaussian Naive Bayes στο Pima Indians Diabetes Data Set \n","![1889 Photograph shows half-length portrait of two Pima Indians, facing front, wearing bead necklaces.](https://i.pinimg.com/236x/60/05/76/600576905d4ad5bb1a9c3e3387b397ca--pima-indians-native-american-indians.jpg \"1889 Photograph shows half-length portrait of two Pima Indians, facing front, wearing bead necklaces.\")\n","\n","Το \"Pima Indians Diabetes data set (ή Pima)\" περιλαμβάνει 768 δείγματα από γυναίκες άνω των 21 με καταγωγή από τους ινδιάνους Pima (Pima people). Με βάση 8 βιολογικά χαρακτηριστικά προσπαθούμε να αποφασίσουμε αν ένα άτομο είναι διαβητικό ή όχι.\n","Κατεβάστε το αρχείο csv από [εδώ](https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv). Κάντε δεξί κλικ και \"Save As\".\n","Η τελευταία (έννατη) τιμή είναι η κατηγορία, 0 μη διαβητική, 1 διαβητική.\n","\n","1. Ανεβάστε το pima-indians-diabetes.data\" στο notebook σας και διαβάστε το σε ένα numpy array. Χρησιμοποιήστε τον κώδικα από το Classification 1 για το cloud που χρησιμοποιείτε.\n","2. Ποιά είναι η κατανομή (συχνότητα) των δύο κλάσεων; Τί ποσοστό επί τοις εκατό του dataset είναι η κάθε κλάση; Με δεδομένο ότι το ποσοστό των κλάσεων στο Wisconcin ήταν 37.3% - 62.7% πιο dataset είναι πιο ισορροπημένο (κοντά στην ίση κατανομή των δύο κλάσεων); Σημείωση, για να δουλέψει η bincount πρέπει να κάνουμε τα labels int με .astype(int)\n","3. Χωρίστε τα δείγματα κατά 60% training set και 40% test set.\n","4. Ορίστε ένα λεξικό \"pima_accuracy\". Εκπαιδεύστε πέντε dummy classifiers με τις εξής στρατηγικές: “uniform”, “constant 0”, “constant 1”, “most_frequent”, “stratified”. Εκπαιδεύστε τους στο training set και αποθηκεύστε για τον καθένα στο \"pima_accuracy\" το όνομά του στο κλειδί και την πιστότητά του στο test set του 40%.\n","5. Εκτυπώστε το \"pima_accuracy\" με αύξουσα σειρά πιστότητας.\n","6. Εκπαιδεύστε έναν Gaussian Naive Bayes στο ίδιο split του dataset και προσθέστε το όνομα και την πιστότητά του στο \"pima_accuracy\". Εκτυπώστε το \"pima_accuracy\" ξανά με αύξουσα σειρά πιστότητας.\n","7. Πώς σχολιάζετε τις επιδόσεις των ταξινομητών; Δοκιμάστε μερικά runs του Pima και του Wisconsin και παρατηρήστε τη συγκριτική απόδοση του uniform και του stratified. Που μπορεί να οφείλεται;\n","8. Τί παρατηρείτε για την επίδοση του Gaussian Naive Bayes στο Pima σε σχέση με την επίδοση του στο Wisconsin Breast Cancer; Τί μπορεί να σημαίνει αυτό για τον Gaussian NB και για κάθε dataset;"]},{"cell_type":"code","metadata":{"id":"eXQ7a7Nt_5Zz"},"source":["import pandas as pd\n","df = pd.read_csv(\"https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv\", header=None)\n","df"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"OxH2PXS5lvf6"},"source":["labels_df = df.iloc[:, [8]] # τα labels είναι στην όγδοη κολώνα\n","features_df = df.iloc[:, 0:8]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"cN41p8K_mS87"},"source":["import numpy as np\n","features = features_df.values\n","labels = labels_df.values.reshape(768,)\n","print(labels.shape)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Yj69ZPiJmUrM"},"source":["labels.astype(int)\n","print (\"frequencies:\", np.bincount(labels))\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"J1GGPEHBnYUE"},"source":["print(\"f1 {}, f2 {}\".format(np.bincount(labels)[0]/labels.shape, \"bf\"))"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"e7DcaAzFppBt"},"source":["from sklearn.model_selection import train_test_split\n","\n","# Split our data\n","train, test, train_labels, test_labels = train_test_split(features, labels, test_size=0.4)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"XVQEKtpJqnNy"},"source":["from sklearn.dummy import DummyClassifier\n","dc_uniform = DummyClassifier(strategy=\"uniform\")\n","dc_constant_0 = DummyClassifier(strategy=\"constant\", constant=0)\n","dc_constant_1 = DummyClassifier(strategy=\"constant\", constant=1)\n","dc_most_frequent = DummyClassifier(strategy=\"most_frequent\")\n","dc_stratified = DummyClassifier(strategy=\"stratified\")\n","\n","pima_accuracy = {}\n","dc_uniform.fit(train, train_labels)\n","pima_accuracy['uniform (random)'] = dc_uniform.score(test, test_labels)\n","model = dc_constant_0.fit(train, train_labels)\n","pima_accuracy['constant 0'] = dc_constant_0.score(test, test_labels)\n","model = dc_constant_1.fit(train, train_labels)\n","pima_accuracy['constant 1'] = dc_constant_1.score(test, test_labels)\n","model = dc_most_frequent.fit(train, train_labels)\n","pima_accuracy['most frequent label'] = dc_most_frequent.score(test, test_labels)\n","model = dc_stratified.fit(train, train_labels)\n","pima_accuracy['stratified'] = dc_stratified.score(test, test_labels)\n","\n","print(\"Classification Accuracy on the pima Dataset (40% test set)\\n\")\n","sorted_accuracy = [(k, pima_accuracy[k]) for k in sorted(pima_accuracy, key=pima_accuracy.get, reverse=True)]\n","for k, v in sorted_accuracy:\n"," print(k,v)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"frZKbHIirmGp"},"source":["from sklearn.naive_bayes import GaussianNB\n","gnb = GaussianNB()\n","# κάνουμε εκπαίδευση (fit) δηλαδή ουσιαστικά υπολογίζουμε μέση τιμή και διακύμανση για όλα τα χαρακτηριστικά και κλάσεις στο training set\n","model = gnb.fit(train, train_labels)\n","# η GaussianNB έχει builtin μέθοδο υπολογισμό accuracy. Αποθηκεύουμε την τιμή της στον πίνακά μας με τα αποτελέσματα από τα άλλα classifiers\n","pima_accuracy['gaussian naive bayes'] = gnb.score(test, test_labels)\n","# και ξανατυπώνουμε τα sorted αποτελέσματα\n","print(\"Classification Accuracy on the pima Dataset (40% test set)\\n\")\n","sorted_accuracy = [(k, pima_accuracy[k]) for k in sorted(pima_accuracy, key=pima_accuracy.get, reverse=True)]\n","for k, v in sorted_accuracy:\n"," print(k,v)"],"execution_count":null,"outputs":[]}]}