{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"ModelSelection.ipynb","provenance":[],"collapsed_sections":[],"authorship_tag":"ABX9TyN76aeREWocUPAvzhJHnuzn"},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"fB95ukleR-DS"},"source":["# Επιλογή Μοντέλου (Model Selection)\n","Μια τυπική ροή εργασίας μοντελοποίησης περιλαμβάνει το χωρισμό του συνόλου των δεδομένων στα σύνολα εκπαίδευσης, επικύρωσης και δοκιμών. \n","Στη συνέχεια, θα προσαρμόζαμε τα μοντέλα μας στα δεδομένα εκπαίδευσης και έπειτα θα χρησιμοποιούσαμε το σύνολο επικύρωσης για να εκτελέσουμε την επιλογή μοντέλου. \n","\n","Με τα δεδομένα δοκιμής θα μπορούσαμε να αξιολογήσουμε το καλύτερο επιλεγμένο μοντέλο ως προς τη απόδοση γενίκευσής του. \n","\n","Αυτή η διαδικασία χρησιμοποιείται ώστε να βεβαιωθούμε ότι έχουμε επιλέξει το σωστό μοντέλο και ότι θα λειτουργήσει με νέα άγνωστα δεδομένα\n","\n","Εδώ θα μελετήσουμε μεθόδους για την επιλογή και την αξιολόγηση μοντέλων όπου δεν απαιτείται επικύρωση ούτε δοκιμαστικά σύνολα!"]},{"cell_type":"markdown","metadata":{"id":"YPq71vz6Uf3a"},"source":["## Σχετικά με σφάλματα μοντέλου \n","Το **σφάλμα εκπαίδευσης** είναι το σφάλμα που λαμβάνουμε όταν εκτελούμε το εκπαιδευμένο μοντέλο στα ίδια δεδομένα με τα οποία εκπαιδεύτηκε. \n","\n","Το **σφάλμα δοκιμής (ή γενίκευσης)** είναι το σφάλμα που λαμβάνουμε όταν εκτελούμε το μοντέλο μας σε εντελώς νέα και άγνωστα δεδομένα.\n","\n","Φανταστείτε ότι μετά την εκπαίδευση του μοντέλου, παρατηρούμε νέες τιμές της μεταβλητής απόκρισης για τις ίδιες τιμές των χαρακτηριστικών που είχαμε στα δεδομένα εκπαίδευσης.\n","\n","Για παράδειγμα, ας πούμε ότι θέλουμε να προβλέψουμε την τιμή ενός σπιτιού με βάση τον αριθμό των δωματίων. Στα δεδομένα εκπαίδευσης, είχατε ένα σπίτι αξίας 300.000€ με 5 δωμάτια, και τώρα παρατηρείτε ένα σπίτι πωλείται για 350.000€, επίσης με 5 δωμάτια. \n"," Το σφάλμα που κάνει το μοντέλο σε αυτά τα νέα δεδομένα ονομάζεται σφάλμα δείγματος ελέγχου (in sample error- σφάλμα στο δείγμα) (δεδομένου ότι οι τιμές των χαρακτηριστικών είναι ίδιες με αυτές του δείγματος εκπαίδευσης).\n"," \n","Αν εξετάσουμε την ποσότητα σφάλμα δείγματος ελέγχου - σφάλμα εκπαίδευσης θα είναι θετική. Αυτό σημαίνει ότι το σφάλμα εκπαίδευσης είναι μικρότερο επειδή βασίζεται στα ίδια δεδομένα για τα οποία το μοντέλο βελτιστοποιήθηκε. \n","\n","Αυτό αποδίδεται από τη σχέση:\n","\n","$$ err_{in sample}-err_{train}=\\frac{2}{N}\\sum_{i=1}^{N}Cov(\\widehat{y_i},y_i)$$\n","\n","όπου 𝑁 είναι ο αριθμός των παρατηρήσεων και ο τελευταίος όρος είναι η διακύμανση μεταξύ της απόκρισης του συνόλου εκπαίδευσης και των προβλέψεών του. \n","\n","Όσο μεγαλύτερη είναι αυτή η συνδιακύμανση, τόσο ισχυρότερη είναι η προσαρμογή του μοντέλου στα δεδομένα εκπαίδευσης (στο σημείο της υπερβολικής τοποθέτησης), οπότε το σφάλμα εκπαίδευσης μειώνεται, αυξάνοντας την αριστερή πλευρά της εξίσωσης.\n","\n","\n","Ας υποθέσουμε (και αυτή είναι μια σημαντική υπόθεση) ότι αντιμετωπίζουμε γραμμικά μοντέλα όπως γραμμικά ή λογιστικά μοντέλα παλινδρόμησης, μη γραμμικά spline ή μοντέλα αυτόματης παλινδρόμησης.\n","\n","Όταν έχουμε τέτοια μοντέλα, τότε ο παραπάνω όρος συνδιακύμανσης απλοποιείται σε $d * σ_ϵ^2$, όπου $𝑑$ είναι ένα μέτρο της πολυπλοκότητας του μοντέλου (π.χ. αριθμός χαρακτηριστικών στη γραμμική παλινδρόμηση) και $σ_ϵ^2$ είναι η διακύμανση σφάλματος. \n","\n","Οπότε μετά από αντικατάσταση και απλοποίηση έχουμε:\n","\n","$$ err_{in sample}=err_{train}+2*\\frac{d}{N}σ_e^2$$\n","\n","\n","Συνεπώς, αν μπορούμε να εκτιμήσουμε το σωστό όρο, τότε θα μπορούμε να τον προσθέσουμε στο σφάλμα εκπαίδευσης για να λάβουμε μια εκτίμηση του σφάλματος ελέγχου.\n","\n","Άρα το σφάλμα ελέγχου είναι το μόνο που χρειαζόμαστε για την επιλογή μοντέλου.\n","\n","Σίγουρα, δεν μας δίνει πληροφορίες σχετικά με την απόδοση γενίκευσης των μοντέλων (αυτός είναι ο ρόλος της αξιολόγησης μοντέλου) αλλά δεν ενδιαφερόμαστε πραγματικά για τη συγκεκριμένη τιμή του σφάλματος ελέγχου - είναι μάλλον ασυνήθιστο να βλέπουμε τις ίδιες τιμές χαρακτηριστικών με αυτές των δεδομένων εκπαίδευσης. \n","\n","Όμως, το σχετικό μέγεθος των σφαλμάτων ελέγχου σε διαφορετικά μοντέλα μας επιτρέπει να επιλέξουμε το καλύτερο μοντέλο."]},{"cell_type":"markdown","metadata":{"id":"u7QUNXio4e2B"},"source":["## Επιλογή μοντέλου με κριτήρια πληροφόρησης\n","\n","Ο παραπάνω τύπος είναι επίσης γνωστός ως Mallows’s 𝐶𝑝:\n","\n","$$ C_p=err_{train}+2*\\frac{d}{N}σ_e^2 \\space\\space (1)$$\n","\n","Για να επιλέξουμε το καλύτερο μοντέλο απλά επιλέγουμε το μοντέλο με το χαμηλότερο 𝐶𝑝. \n","Τα γραμμικά μοντέλα χρησιμοποιούν συνήθωςτη μέγιστη πιθανότητα, και σύμφωνα με το μοντέλο Gauss, υποστηρίζει (έως μια σταθερά) ότι:\n","\n"," $$ -2*loglikelihood=N*err_{train}/σ_e^2$$\n"," $$ err_{train}=-\\frac{2}{N}*loglikelihood*σ_e^2 \\space\\space (2)$$\n","\n","Με αντικατάσταση της (2) στην (1) έχουμε το Κριτήριο Πληροφοριών Akaike ή AIC:\n","\n"," $$ AIC=-\\frac{2}{N}*loglikelihood +2*\\frac{d}{N}$$\n","\n","Το AIC είναι βασικά μια πιθανότητα κυρώσεων(penalized likelihood).\n","\n","Το AIC αυξάνεται καθώς η πολυπλοκότητα του μοντέλου $𝑑$ αυξάνεται και μειώνεται καθώς η προσαρμογή του μοντέλου στα δεδομένα (loglikelihood) αυξάνεται Υπάρχει δηλαδή ένα trading-off μεταξύ του. Διαλέγουμε το μοντέλο με το χαμηλότερο AIC. \n","\n","Παρόλο που το AIC υπολογίζεται χρησιμοποιώντας μόνο τα δεδομένα εκπαίδευσης, η ελαχιστοποίηση είναι ισοδύναμη με την ελαχιστοποίηση του μέσου τετραγώνου σφάλματος, γεγονός που το καθιστά ιδανικό για την επιλογή μοντέλου. "]},{"cell_type":"markdown","metadata":{"id":"OeKBDTk4BAOq"},"source":["# Παράδειγμα επιλογής μοντέλου\n","\n","Ας δούμε τώρα ένα παράδειγμα επιλογής μοντέλου σε Python με τη χρήση του AIC. \n","Θα χρησιμοποιήσουμε τα Boston housing data από τα σύνολα δεδομένων του scikit-learn. Θα δοκιμάσουμε να εκπαιδεύσουμε δύο μοντέλα γραμμικής παλινδρόμησης με σκοπό την επεξήγηση των τιμών των κατοικιών. \n","\n","Θα χρησιμοποιήσουμε το πακέτο statsmodels που περιέχει συνάρτηση υπολογισμού του AIC.\n","\n","Και τα δύο μοντέλα θα χρησιμοποιούν τον αριθμό των δωματίων και την ηλικία του σπιτιού ως χαρακτηριστικά.\n","\n"," Το μοντέλο 1 θα χρησιμοποιήσει το ποσοστό εγκληματικότητας γειτονιάς επιπλέον, ενώ το μοντέλο 2 θα χρησιμοποιεί την απόσταση από μεγάλα κέντρα απασχόλησης. \n"," \n"," Ποιο από τα δύο μοντέλα είναι καλύτερα;"]},{"cell_type":"code","metadata":{"id":"z3c7wsCSRs1m","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1604924905531,"user_tz":-120,"elapsed":1343,"user":{"displayName":"Parask Tz","photoUrl":"","userId":"08609487936413149826"}},"outputId":"c2ebba64-f172-47e3-c2d2-622ca99ea5fd"},"source":["\n","from sklearn.datasets import load_boston\n","import statsmodels.api as sm\n","\n","X, y = load_boston(return_X_y=True)\n","# Features: number of rooms, age, crime\n","X1 = X[:, [5, 6, 0]]\n","# Features: number of rooms, age, distance to employment centers\n","X2 = X[:, [5, 6, 7]]\n","\n","X1 = sm.add_constant(X1)\n","model1 = sm.Akaike’s Information Criterion (AIC), Schwarz’s BIC(y, X1).fit()\n","X2 = sm.add_constant(X2)\n","model2 = sm.OLS(y, X2).fit()\n","\n","print(\"Model1 AIC: {}\".format(model1.aic))\n","print(\"Model2 AIC: {}\".format(model2.aic))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n"," import pandas.util.testing as tm\n"],"name":"stderr"},{"output_type":"stream","text":["Model1 AIC: 3268.8701039911457\n","Model2 AIC: 3300.3758836602733\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"W0hWH2ti8Nnz"},"source":["Όσον αφορά το AIC, το Μοντέλο 1 (αυτό που χρησιμοποιεί το ποσοστό εγκληματικότητας) είναι καλύτερο, καθώς έχει χαμηλότερη τιμή AIC. \n"]},{"cell_type":"markdown","metadata":{"id":"kP8FFG16E5xJ"},"source":["Το AIC δεν είναι το μόνο κριτήριο πληροφόρησης. Ένα άλλο είναι το BIC, ή Bayesian Information Criterion, γνωστό επίσης και ως κριτήριο Schwarz. Ομοίως με το AIC, το BIC είναι επίσης πιθανό να τιμωρείται, αλλά με διαφορετικό όρο ποινής: \n","\n","$$BIC=-2*loglikelihood+log(N)*d$$\n","\n","Αυτή η ποινή τείνει να τιμωρεί αυστηρότερα τα πολύπλοκα μοντέλα σε σχέση με το AIC. Ας δούμε πώς βαθμολογούνται τα δύο μοντέλα τιμών κατοικιών στο BIC."]},{"cell_type":"code","metadata":{"id":"mxNUUzpsbuNM","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1604924905533,"user_tz":-120,"elapsed":1337,"user":{"displayName":"Parask Tz","photoUrl":"","userId":"08609487936413149826"}},"outputId":"2b188a08-fe61-4da7-f32f-067cf6bd30af"},"source":["print(\"Model1 BIC: {}\".format(model1.bic))\n","print(\"Model2 BIC: {}\".format(model2.bic))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Model1 BIC: 3285.7762506682957\n","Model2 BIC: 3317.2820303374233\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"kTiyWc3Z8RDK"},"source":["Και πάλι, το μοντέλο 1 προτιμάται, καθώς βαθμολογήθηκε χαμηλότερα με τη χρήση του BIC. \n","\n","Στα παραδείγματα μας, και τα δύο κριτήρια είναι ομόφωνα, αλλά αυτό δεν ισχύει πάντα. \n","\n","Το BIC είναι ασυμπτωτικά συνεπές(asymptotically consistent), πράγμα που σημαίνει ότι έχει μεγάλη πιθανότητα να επιλέξει το πραγματικό μοντέλο (αυτό σύμφωνα με το οποίο δημιουργήθηκαν τα δεδομένα) όταν παρουσιάζεται ένα σύνολο ανταγωνιστικών μοντέλων σε αντίθεση με το AIC που δεν έχει την ιδιότητα συνέπειας.\n","Το BIC προτιμά πιο λιτά μοντέλα. Για μικρά δείγματα δεδομένων, μπορεί να καταλήξει στην επιλογή πολύ απλών μοντέλων. \n","Από την άλλη πλευρά, για μεγάλα δείγματα, το AIC τείνει να επιλέγει πολύ περίπλοκα."]},{"cell_type":"markdown","metadata":{"id":"NJHO1kLe8UF3"},"source":["## Αξιολόγηση μοντέλου με διασταυρούμενη επικύρωση\n","## Model assessment with cross-validation\n","\n","Για να δούμε την απόδοση του μοντέλου θα προχωρήσουμε στην αξιολόγησή του Ένας τρόπος για να γίνει αυτό είναι μέσω της γνωστής διαδικασίας διασταυρούμενης επικύρωσης. \n","Στο επιλεγμένο μοντέλο μας θα εφαρμόσουμε k=10 για τη διασταυρούμενη επικύρωση."]},{"cell_type":"code","metadata":{"id":"IoM6MvYYb0jK","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1604924905533,"user_tz":-120,"elapsed":1332,"user":{"displayName":"Parask Tz","photoUrl":"","userId":"08609487936413149826"}},"outputId":"563f7535-8751-4761-88ea-2b51b34098e7"},"source":["from sklearn.linear_model import LinearRegression \n","from sklearn.model_selection import cross_validate\n","from sklearn.metrics import mean_squared_error, make_scorer\n","\n","lm_model = LinearRegression()\n","mse_scorer = make_scorer(mean_squared_error)\n","cv_results = cross_validate(lm_model, X1, y, cv=10, scoring=mse_scorer)\n","\n","print(\"Cross-validated testing MSE: {}\".format(cv_results[\"test_score\"].mean()))"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Cross-validated testing MSE: 43.925463559757674\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"5JkZcVa58wvs"},"source":["Για μικρά σύνολα δεδομένα, τα κριτήρια πληροφόρησης τείνουν να είναι πιο αξιόπιστα σε σχέση με τη διασταυρούμενη επικύρωση η οποία θα ήταν μεροληπτική λόγω πολύ λίγων δεδομένων, τουλάχιστον θα γνωρίζετε ότι το μοντέλο που έχετε επιλέξει είναι το σωστό - ακόμη και αν η εκτίμηση επικυρωμένων δοκιμών σφάλματος δεν ήταν τέλεια."]}]}