Στην άσκηση αυτή ζητείται να αναλύσετε τα δεδομένα στο αρχείο dropout_prediction, που αφορούν την πρόβλεψη επιτυχούς ή όχι ολοκλήρωσης των σπουδών από μια μελέτη για μαθητές μέσης εκπαίδευσης στην Πορτογαλία.
Η λεπτομερής περιγραφή των μεταβλητών βρίσκεται στην ιστοσελίδα
https://archive.ics.uci.edu/dataset/697/predict+students+dropout+and+academic+success
ενώ η περιγραφή της μελέτης στο άρθρο paper1.pdf που επισυνάπτεται.
Ζητείται να εφαρμόσετε διάφορα μοντέλα πρόβλεψης για τη μεταβλητή target η οποία περιγράφει το αποτέλεσμα των σπουδών του μαθητή (success=αποφοίτηση στην κανονική διάρκεια, relative_success=αποφοίτηση με έως 3 χρόνια καθυστέρηση και failure=εγκατάλειψη ή μη αποφοίτηση μέσα στα 3 χρόνια).
Μπορείτε να δοκιμάσετε : 1. Logistic regression και lasso, θέτοντας παίρνοντας δύο κατηγορίες : success και relative success ή failure. 2. Linear and Quadratic Discriminant analysis 3. Random Forests 4. Neural Networks
Σε κάθε κατηγορία μπορείτε να πειραματιστείτε με τιμές των υπερπαραμέτρων, δομή του δικτύου κλπ. Για χωρισμό σε training/test set, πάρτε ένα τυχαίο δείγμα μεγέθους 20% του συνόλου για testing. Αν κάνετε cross validation εφαρμόστε την στο training set.
Τα αποτελέσματα της μελέτης σας αναφέρονται στη σύγκριση των διαφόρων μεθόδων που εφαρμόσατε ως προς το σφάλμα πρόβλεψης. Αναφέρετε τα συμπεράσματά σας σε μια σύντομη αναφορά, και περιλάβετε τους κώδικες που αναπτύξατε σε παράρτημα (ή δεύτερο κεφάλαιο αν χρησιμοποιήσετε R-markdown).
Σημείωση : Δεν είναι απαραίτητο τα συμπεράσματά σας να ταυτίζονται απόλυτα με αυτά στο άρθρο, επειδή, όπως θα δείτε, οι συγγραφείς αναφέρουν ότι έχουν χρησιμοποιήσει και μεθόδους data augmentation για να πετύχουν καλύτερη ισορροπία μεταξύ των κατηγοριών. Δεν ζητείται να κάνετε και εσείς κάτι τέτοιο. Όμως στην εργασία που θα παραδώσετε πρέπει να δίνονται αναφορές σε όποιες εργασίες, ιστοσελίδες, κλπ, χρησιμοποιήσατε.
Σκοπός της άσκησης είναι να δημιουργηθεί ένα μοντέλο που διακρίνει αν ένα κείμενο ειδήσεων είναι fake news ή όχι. Για το σκοπό αυτό θα χρησιμοποιηθούν τα datasets που βρίσκονται στο αρχείο fakenews.Rdata. Αυτό περιέχει 4 dataframes, 2 με πραγματικές ειδήσεις (dtrue_train, dtrue_test) και άλλα 2 με fakenews (dfake_train, dfake_test).
Ένα πρόβλημα είναι ότι δεν υπάρχει λεξικό για να γίνει ανίχνευση των λέξεων. Ένας τρόπος για να αντιμετωπιστεί αυτό είναι το λεξικό να δημιουργηθεί από το ίδιο το training set (δηλαδή από τα dtrue_train, dfake_train). Αυτή η προσέγγιση χρησιμοποιείται συχνά στην πράξη. Ένας τρόπος να γίνει αυτό περιγράφεται παρακάτω. Όμως ένα θέμα που δημιουργείται είναι ότι αν το λεξικό συγκεντρώσει όλες τις λέξεις από το traiining set, τότε στο test set μπορεί να υπάρχουν λέξεις που δεν περιλαμβάνονται στο λεξικό. Είναι προτιμότερο να υπάρχουν άγνωστες λέξεις και στο training set, έτσι ώστε κατά την εκπαίδευση του μοντέλου να παίρνει υπόψη κατά πόσον ένα true/fake κείμενο περιέχει λέξεις που δεν υπάρχουν στο λεξικό.
Για τον λόγο αυτό το λεξικό που θα δημιουργήσετε θα περιέχει μόνο τις λέξεις που περιλαμβάνονται στις μισές πρώτες γραμμές των δύο training sets.
Για τη δημιουργία του λεξικού μπορείτε να ακολουθήσετε (χωρίς να είναι υποχρεωτικό) την παρακάτω διαδικασία.
Παίρνετε τη δεύτερη στήλη του κάθε αρχείου που περιέχει το κείμενο του δελτίου. Για κάθε κείμενο που είναι σε μορφή μεγάλου string χαρακτήρων πρέπει:
Να αφαιρέσετε τα σημεία στίξης. Αυτό γίνεται με τη συνάρτηση gsub: gsub(“[[:punct:]]”, ““, a), που αντικαθιστά τους χαρακτήρες σημείων στίξης με null, δηλαδή τους διαγράφει.
Να αφαιρέσετε τους αριθμούς. Αντίστοιχα gsub(“[0-9]”, ““, a)
Να χωρίσετε το νέο string σε λέξεις. Αυτό γίνεται με τη συνάρτηση strsplit στο library(stringr): strsplit(a, “\s+”), που χωρίζει το string σε κομμάτια με χαρακτήρα διαχωρισμού το κενό (). Το αποτέλεσμα της συνάρτησης είναι μια λίστα με τα τμήματα του αρχικού string. Για να μετατραπεί σε διάνυσμα λέξεων χρειάζεται η συνάρτηση unlist.
Να μετατρέψετε τις λέξεις σε lowercase με τη συνάρτηση tolower.
Μπορείτε να δημιουργήσετε μια συνάρτηση cleantext(a) που κάνει όλα τα παραπάνω σε ένα string a και επιστρέφει το διάνυσμα των λέξεων.
Αφού έχετε τη συνάρτηση αυτή, για να δημιουργήσετε το λεξικό μπορείτε να χρησιμοποιήσετε ένα κώδικα που παίρνει κάθε κείμενο από τα δύο training sets, δημιουργεί το αντίστοιχο διάνυσμα λέξεων, βρίσκει ποιες από αυτές τις λέξεις δεν υπάρχουν ήδη στο λεξικό και τις προσθέτει. Για να γίνει αυτό μπορείτε να χρησιμοποιήσετε τη συνάρτηση setdiff. Αν dict είναι το διάνυσμα λέξεων του τρέχοντος λεξικού και words το διάνυσμα λέξεων του νέου κειμένου, η εντολή
newwords=setdiff(words, dict)
βρίσκει τις λέξεις του words που δεν περιλαμβάνονται στο dict. Αυτές μπορούν να προστεθούν με
dict=c(dict, newwords)
Το λεξικό που θα δημιουργηθεί με αυτόν τον τρόπο θα περιέχει περίπου 130.000 λέξεις. Τώρα για την εκπαίδευση του μοντέλου σας, θα πρέπει:
dictionary=c("a", "b", "c", "d", "e")
words=c("f", "a", "c", "x", "a")
positions=match(words, dictionary)
positions[is.na(positions)] = 0
print(positions)
## [1] 0 1 3 0 1
Οι λέξεις f, x που δεν υπάρχουν παίρνουν τιμή 0, ενώ η a τιμή 1 επειδή είναι η πρώτη λέξη του λεξικού.
Χρησιμοποιώντας τις παραπάνω ιδέες (όχι υποχρεωτικά), μπορείτε να δημιουργήσετε το λεξικό, και ένα πίνακα με τις ανεξάρτητες μεταβλητές \(X_1, \ldots, X_L\) για την εκπαίδευση του μοντέλου σας και αντίστοιχα κάνοντας το ίδιο σto test set για την εκτίμηση του σφάλματος πρόβλεψης.
Τα αποτελέσματα της μελέτης σας αναφέρονται στην περιγραφή της μεθόδου που εφαρμόσατε (ή στη σύγκριση των διαφόρων μεθόδων αν εφαρμόσατε περισσότερες από μια) ως προς το σφάλμα πρόβλεψης. Αναφέρετε τα συμπεράσματά σας σε μια σύντομη αναφορά, και περιλάβετε τους κώδικες που αναπτύξατε σε παράρτημα (ή δεύτερο κεφάλαιο αν χρησιμοποιήσετε R-markdown). Και εδώ απαιτούνται αναφορές σε ότι χρησιμοποιήσατε (π.χ. άρθρα, βιβλία, ιστοσελίδες, κλπ.)