{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Άσκηση 03 GBN LR kNN στο Pima Indians - solution.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"yD1gabVouubh"},"source":["# Άσκηση: Σύγκριση των Gausian Naive Bayes, Logistic Regression και kNN στo Pima Indians Diabetes dataset\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.csv\"](https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv) σε ένα numpy array data και ξεχωρίστε features και labels.\n","\n","Για 40% test set: \n","1. υπολογίστε την πρόβλεψη του Gaussian Naive Bayes με τη μέθοδο predict(). \n","2. υπολογίστε την πρόβλεψη της λογιστικής παλινδρόμισης με τη μέθοδο predict().\n","3. για έναν ταξινομητή kNN, με 3-fold cross validation και με μετρική 'f1_weighted' υπολογίστε το βέλτιστο k στο train set (maximum k=50). \n","4. εκτυπώστε με την \"classification_report\" τα precision, recall, f1, support για τον GNB, τη λογιστική παλινδρόμηση και τον kNN με βέλτιστο k που προέκυψε από το cross validation.\n","\n","Συζήτηση: στο συγκεκριμένο dataset: \n","- ποιος ταξινομητής είναι \"καλύτερος\";\n","- τι μπορούμε να κάνουμε για να βελτιωθεί η απόδοση του κάθε ταξινομητή;"]},{"cell_type":"code","metadata":{"id":"-BZw6mhrMU6U"},"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","labels_df = df.iloc[:, [8]] \n","features_df = df.iloc[:, 0:8]\n","\n","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":"3G4cM20eNUFS"},"source":["from sklearn.model_selection import train_test_split\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":"OD2FDlPHNb6O"},"source":["from sklearn.naive_bayes import GaussianNB\n","gnb = GaussianNB()\n","\n","gnb.fit(train, train_labels)\n","gnb_pred = gnb.predict(test)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"kzKTfJjiTIr4"},"source":["from sklearn.linear_model import LogisticRegression\n","lr = LogisticRegression(solver='saga', max_iter=500)\n","lr.fit(train, train_labels)\n","lr_pred = gnb.predict(test)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"oHejHC7LQCVa"},"source":["from sklearn.model_selection import cross_val_score\n","\n","# φτιάχνουμε μια λίστα από το 1 έως το 50\n","myList = list(range(1,50))\n","# Κρατάμε μόνο τα περιττά k\n","neighbors = list(filter(lambda x: x % 2 != 0, myList))\n","# empty list that will hold cv scores\n","cv_scores = []\n","# perform 5-fold cross validation\n","for k in neighbors:\n"," knn_opt = KNeighborsClassifier(n_neighbors=k)\n"," scores = cross_val_score(knn_opt, train, train_labels, cv=3, scoring='f1_weighted')\n"," cv_scores.append(scores.mean())"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"K2A-VinERQJd"},"source":["# Κάνουμε update την matplotlib, ίσως χρειαστεί restart του runtime\n","!pip install --upgrade matplotlib\n","\n","# Κάνουμε import την matplotplib\n","import matplotlib.pyplot as plt\n","\n","# το σφάλμα είναι το αντίστροφο της πιστότητας\n","mean_error = [1 - x for x in cv_scores]\n","\n","# plot misclassification error vs k\n","plt.plot(neighbors, mean_error)\n","plt.xlabel('Number of Neighbors K')\n","plt.ylabel('Misclassification Error')\n","plt.show()\n","\n","# determining best k\n","optimal_k = neighbors[mean_error.index(min(mean_error))]\n","print(\"The optimal number of neighbors (calculated in the training set) is %d\" % optimal_k)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"sn6_sX7NRmav"},"source":["knn_opt = KNeighborsClassifier(n_neighbors=5)\n","knn_opt.fit(train, train_labels)\n","knn_opt_pred = knn.predict(test)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"pXIDUwcsSUC4"},"source":["from sklearn.metrics import classification_report\n","print(classification_report(test_labels, gnb_pred))"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"p5Lmtu5uStfu"},"source":["print(classification_report(test_labels, knn_opt_pred))"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"vnZDqy2RTqk2"},"source":["print(classification_report(test_labels, lr_pred))"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"pGvW81ZnUjqe"},"source":["Συζήτηση:\n","- ο GNB και η LR έχουν ακριβώς την ίδια επίδοση. Ο kNN έχει χειρότερο accuracy από τους άλλους δύο αλλά καλύτερο precision και recall στην κλάση 0. Γενικά δεν υπάρχει απαραίτητα μια συνολική, απόλυτη απάντηση για το ποιος είναι ο καλύτερος ταξινονητής σε ένα dataset.\n","- 1. Προεπεξεργασία: θα μπορούσαμε να δοκιμάσουμε και άλλες τεχνικές προεπεξεργασίας. Βέβαια, πρόκειται για ένα πολύ μικρό dataset και δεν πρέπει να περιμένουμε δραματικές αλλαγές. \n","- 2. Υπερπαράμετροι: ο [GNB](https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html) δεν έχει υπερπαραμέτρους προς βελτιστοποίηση. O [kNN](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html) έχει κάποιες, περιορισμένες στον αριθμό, όπως η `weights` και η `metric` που θα μπορούσαν να δοκιμαστούν. Η [λογιστική παλινδρόμηση](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html) έχει πολλές υπαρπαραμέτρους που μπορούν να δοκιμαστούν. Το πώς το κάνουμε αυτό, δηλαδή ποιο είναι το σωστό πρωτόκολλο εκτίμησης της απόδοσης τιμών περισσότερων υπερπαραμέτρων θα το δούμε στο επόμενο εργαστήριο.\n"]}]}