Δημιουργία ενός ταξινομητή spam: PySpark + MLLib vs SageMaker + XGBoost

Σε αυτό το άρθρο, θα σας παρουσιάσω πρώτα πώς να δημιουργήσετε έναν ταξινομητή spam χρησιμοποιώντας το Apache Spark, το Python API του (γνωστός και ως PySpark) και μια ποικιλία αλγορίθμων Machine Learning που εφαρμόζονται στο Spark MLLib.

Στη συνέχεια, θα χρησιμοποιήσουμε τη νέα υπηρεσία Amazon Sagemaker για την εκπαίδευση, αποθήκευση και ανάπτυξη ενός μοντέλου XGBoost εκπαιδευμένου στο ίδιο σύνολο δεδομένων.

Όλος ο κώδικας τρέχει σε ένα σημειωματάριο Jupyter, διαθέσιμο στο Github :)

PySpark + MLLib

Η μεγάλη εικόνα

Το πρωτότυπο σύνολο δεδομένων αποτελείται από μηνύματα 1 γραμμής που είναι αποθηκευμένα σε δύο αρχεία:

  • το αρχείο "ζαμπόν": 4827 έγκυρα μηνύματα,
  • το αρχείο "spam": 747 μηνύματα.

Για να ταξινομήσουμε αυτά τα μηνύματα, πρέπει να δημιουργήσουμε ένα ενδιάμεσο σύνολο δεδομένων με δύο κατηγορίες. Για το σκοπό αυτό, πρόκειται να χρησιμοποιήσουμε μια απλή αλλά αποτελεσματική τεχνική που ονομάζεται Feature Hashing:

  • Για κάθε μήνυμα στο σύνολο δεδομένων, πρώτα έχουμε τα λόγια του σε ένα σταθερό αριθμό κουβάδων (πχ. 1000).
  • Στη συνέχεια, δημιουργούμε ένα διάνυσμα που δείχνει μη μηδενικά περιστατικά για κάθε λέξη: αυτά είναι τα χαρακτηριστικά που θα χρησιμοποιηθούν για να αποφασιστεί εάν ένα μήνυμα είναι spam ή όχι.
  • Για ένα έγκυρο μήνυμα, η αντίστοιχη ετικέτα θα είναι μηδέν, δηλ. Το μήνυμα δεν είναι ανεπιθύμητο. Κατά συνέπεια, για ένα μήνυμα spam, η ετικέτα θα είναι μία.

Αφού τελειώσουμε, το ενδιάμεσο σύνολο δεδομένων μας θα είναι:

  • 4827 διάνυσμα λέξη με ετικέτα μηδέν,
  • 747 διάνυσμα λέξη που φέρουν ετικέτα με ένα.

Θα το χωρίσουμε 80/20 για εκπαίδευση και επικύρωση και θα τρέξουμε μέσα από έναν αριθμό αλγορίθμων ταξινόμησης.

Για την πρόβλεψη, η διαδικασία θα είναι παρόμοια: κατακερματισμός του μηνύματος, αποστολή του φορέα λέξεων στο μοντέλο και λήψη του προβλεπόμενου αποτελέσματος.

Δεν είναι τόσο δύσκολο, hey; Ας πιασουμε δουλεια!

Δημιουργία ενδιάμεσου συνόλου δεδομένων

Το πρώτο μας βήμα είναι να φορτώσουμε και τα δύο αρχεία και να χωρίσουμε τα μηνύματα σε λέξεις.

Στη συνέχεια, χρεώνουμε κάθε μήνυμα σε 1.000 κουβά λέξεις. Όπως μπορείτε να δείτε, κάθε μήνυμα μετατρέπεται σε ένα αραιό διάνυσμα που κρατά τους αριθμούς κάδων και τα περιστατικά.

Το επόμενο βήμα είναι να επισημάνουμε τα χαρακτηριστικά μας: 1 για το spam, 0 για το μη spam. Το αποτέλεσμα είναι ένα συλλεγέν από επισημασμένα δείγματα που είναι έτοιμα για χρήση.

Τέλος, χωρίσαμε το σύνολο δεδομένων 80/20 για την εκπαίδευση και την δοκιμή και την προσωρινή αποθήκευση και των δύο RDD, καθώς θα τα χρησιμοποιούμε επανειλημμένα.

Τώρα πρόκειται να εκπαιδεύσουμε ορισμένα μοντέλα με αυτό το σύνολο δεδομένων. Για να μετρήσουμε την ακρίβειά τους, εδώ είναι η λειτουργία βαθμολόγησης που πρόκειται να χρησιμοποιήσουμε: απλώς προβλέψτε όλα τα δείγματα στο σετ δοκιμών, συγκρίνετε την προβλεπόμενη ετικέτα με την πραγματική ετικέτα και υπολογίστε την ακρίβεια.

Ταξινόμηση του συνόλου δεδομένων με το Spark MLLib

Θα χρησιμοποιήσουμε τους παρακάτω αλγόριθμους ταξινόμησης:

  • Λογική παλινδρόμηση με το βελτιστοποιητή SGD,
  • Λογιστική παλινδρόμηση με το βελτιστοποιητή LBFGS,
  • Υποστήριξη Μηχανές Vector,
  • Δέντρα αποφάσεων,
  • Διαβαθμισμένα δέντρα με κλίση,
  • Τυχαία δάση,
  • Naive Bayes.

Λογιστική παλινδρόμηση

Ας ξεκινήσουμε με την Logistic Regression, τη μητέρα όλων των ταξινομητών.

Υποστηρικτικές μηχανές υποστήριξης

Τι γίνεται με τους SVM, έναν άλλο δημοφιλή αλγόριθμο;

Δέντρα

Τώρα ας δοκιμάσουμε τρεις παραλλαγές της ταξινόμησης που βασίζεται σε δέντρα. Το API είναι ελαφρώς διαφορετικό από το προηγούμενο algos.

Naive Bayes

Τελευταίο αλλά όχι λιγότερο σημαντικό, ας δοκιμάσουμε τον ταξινομητή Naives Bayes.

Είναι εξαιρετικά ανώτερη από όλα τα άλλα algos. Ας προσπαθήσουμε να προβλέψουμε δύο δείγματα πραγματικής ζωής.

Προβλέφθηκαν σωστά. Αυτό μοιάζει με ένα πολύ καλό μοντέλο. Τώρα γιατί να μην προσπαθήσετε να βελτιώσετε αυτές τις βαθμολογίες; Έχω χρησιμοποιήσει προεπιλεγμένες παραμέτρους για τους περισσότερους από τους αλγόριθμους, σίγουρα υπάρχει περιθώριο βελτίωσης :) Θα βρείτε συνδέσμους σε όλα τα API του σημειωματάριου, οπότε αισθανθείτε ελεύθερος να τσιμπήσετε μακριά!

Αυτό είναι υπέροχο, αλλά ...

Μέχρι στιγμής έχουμε δουλέψει μόνο τοπικά. Αυτό δημιουργεί μερικές ερωτήσεις:

  1. πώς θα εκπαιδεύσαμε σε ένα πολύ μεγαλύτερο σύνολο δεδομένων;
  2. πώς θα χρησιμοποιούσαμε το μοντέλο μας στην παραγωγή;
  3. πώς θα μπορούσαμε να μάθουμε αν το μοντέλο μας θα κλιμακώθηκε;

Αυτές οι ερωτήσεις - η δυνατότητα επεκτάσεως και η ανάπτυξη - είναι συχνά ο ορίζοντας των έργων Machine Learning. Η μετάβαση από το "λειτουργεί στο μηχάνημά μου" σε "λειτουργεί στην παραγωγή σε κλίμακα 24/7" απαιτεί συνήθως πολλή δουλειά.

Υπαρχει ΕΛΠΙΔΑ. Συνέχισε να διαβάζεις :)

SageMaker + XGBoost

Η επίλυση αυτών των πόνων είναι στον πυρήνα του Amazon SageMaker. Ας επανεξετάσουμε την περίπτωση χρήσης μας.

Ενσωματωμένοι αλγόριθμοι

Όπως είδαμε προηγουμένως, υπάρχουν πολλοί αλγόριθμοι ταξινόμησης. Η επιλογή του "σωστού" και η "καλύτερη" εφαρμογή του (η καλή τύχη προσπαθεί να ορίσει "σωστό" και "καλύτερο") δεν είναι εύκολο έργο. Ευτυχώς, το SageMaker σας παρέχει πολλούς ενσωματωμένους αλγόριθμους. Έχουν εφαρμοστεί από την Amazon, έτσι υποθέτω ότι μπορείτε να περιμένετε να εκτελέσουν και να βαθμονομήσουν σωστά :)

Μπορείτε επίσης να φέρετε τον δικό σας κώδικα, το δικό σας προ-εκπαιδευμένο μοντέλο κλπ. Θα συζητηθεί σε μελλοντικά άρθρα! Περισσότερα παραδείγματα του SageMaker για το Github: παλινδρόμηση, ταξινόμηση πολλαπλών κατηγοριών, ταξινόμηση εικόνων κλπ.

Εδώ πρόκειται να χρησιμοποιήσουμε το XGBoost, μια δημοφιλής εφαρμογή των Gradient Boosted Trees για την κατασκευή ενός δυαδικού ταξινομητή.

Με λίγα λόγια, το SageMaker SDK θα μας επιτρέψει:

  • δημιουργήστε διαχειριζόμενη υποδομή για να εκπαιδεύσετε το XGBoost στο σύνολο δεδομένων μας,
  • αποθηκεύστε το μοντέλο στο SageMaker,
  • να διαμορφώσετε ένα τελικό σημείο REST για να εξυπηρετήσετε το μοντέλο μας,
  • να δημιουργηθεί διαχειριζόμενη υποδομή για την ανάπτυξη του μοντέλου στο τελικό σημείο REST,
  • επικαλούνται το μοντέλο σε μερικά δείγματα.

Ας το κάνουμε!

Ρύθμιση αποθήκευσης και δεδομένων

Πρώτα πράγματα πρώτα: το S3 θα χρησιμοποιηθεί για την αποθήκευση του συνόλου δεδομένων και όλων των αντικειμένων (τι είναι μια έκπληξη). Ας δηλώσουμε λοιπόν μερικά πράγματα. Υπόδειξη: ο κάδος S3 πρέπει να βρίσκεται στην ίδια περιοχή με τον SageMaker.

Αυτή η υλοποίηση του XGBoost απαιτεί δεδομένα είτε σε CSV είτε σε μορφή libsvm. Ας δοκιμάσουμε το τελευταίο, αντιγράψτε τα αρχεία που προκύπτουν στο S3 και αρπάξτε το ρόλο του SageMaker IAM.

Δείχνει καλά. Τώρα ας δημιουργήσουμε την εργασία κατάρτισης.

Δημιουργία της εργασίας κατάρτισης

Το Amazon SageMaker χρησιμοποιεί τα δοχεία του Docker για να τρέξει εργασίες κατάρτισης. Πρέπει να διαλέξουμε το όνομα του δοχείου που αντιστοιχεί στην περιοχή στην οποία τρέχουμε.

Αρκετά εύκολο. Ώρα να ρυθμίσετε την εκπαίδευση. Θα πάμε:

  • Δημιουργήστε ένα δυαδικό ταξινομητή,
  • Φέρτε τα σύνολα δεδομένων εκπαίδευσης και επικύρωσης σε μορφή libsvm από S3,
  • Εκπαιδεύστε για 100 επαναλήψεις μία μονή παράσταση m4.4xlarge.

Αυτό είναι πολύ μπουκάλι, αλλά μην πανικοβληθείτε:

  • Οι παράμετροι που είναι κοινές σε όλους τους αλγόριθμους ορίζονται στην τεκμηρίωση του API CreateTrainingJob.
  • Ειδικές παράμετροι αλγορίθμου ορίζονται στη σελίδα αλγορίθμου, π.χ. XGBoost.

Εκπαίδευση και αποθήκευση του μοντέλου

Εντάξει, ας πάρουμε αυτό το πάρτι. Ώρα να αρχίσουμε την εκπαίδευση.

6 λεπτά αργότερα, το μοντέλο μας είναι έτοιμο. Φυσικά, αυτό είναι λίγο μακρύ για ένα τόσο μικρό σύνολο δεδομένων :) Ωστόσο, αν είχαμε εκατομμύρια γραμμές, θα μπορούσαμε να ξεκινήσαμε μια εργασία κατάρτισης σε πολλές περιπτώσεις με τον ίδιο ακριβώς κώδικα. Αρκετά δροσερό, ε;

Εντάξει, ας σώσει αυτό το μοντέλο στο SageMaker. Αρκετά απλό με το API CreateModel.

Δημιουργία του τελικού σημείου

Εδώ έρχεται το πολύ καλό μέρος. Θα αναπτύξουμε αυτό το μοντέλο και θα το επικαλεστούμε. Ναι, ακριβώς έτσι.

Πρώτον, πρέπει να δημιουργήσουμε μια διαμόρφωση τελικού σημείου με το API CreateEndpointConfig: θα χρησιμοποιήσουμε ένα μοναδικό m4.xlarge για εξαγωγή συμπερασμάτων, με το 100% της κυκλοφορίας να πηγαίνει στο μοντέλο μας (θα εξετάσουμε τον έλεγχο A / B σε μια μελλοντική ανάρτηση) .

Ανάπτυξη του μοντέλου

Τώρα μπορούμε να αναπτύξουμε το εκπαιδευμένο μας μοντέλο σε αυτό το τελικό σημείο με το API CreateEndpoint.

Επανάκληση του τελικού σημείου

Τώρα είμαστε έτοιμοι να επικαλεστούμε το τελικό σημείο. Ας πάρουμε μερικά δείγματα (σε μορφή libsvm) από το σύνολο δεδομένων και τα προβλέψουμε.

Και τα δύο δείγματα έχουν προβλεφθεί σωστά. Woohoo.

συμπέρασμα

Όπως μπορείτε να δείτε, το SageMaker σας βοηθά να εκτελέσετε τα έργα Machine Learning από το τέλος μέχρι το τέλος: πειραματισμός με φορητούς υπολογιστές, εκπαίδευση μοντέλων, φιλοξενία μοντέλων, ανάπτυξη μοντέλων.

Εάν είστε περίεργοι για άλλους τρόπους που μπορείτε να χρησιμοποιήσετε το SageMaker (και αν δεν μπορείτε να περιμένετε τις αναπόφευκτες μελλοντικές αναρτήσεις!), Εδώ είναι μια επισκόπηση που κατέγραψα πρόσφατα.

Αυτό είναι για σήμερα. Ευχαριστώ πολύ για την ανάγνωση.

Αυτή η θέση τέρας γράφτηκε ακούγοντας ξανά και ξανά (αυτή ήταν μια μακρά θέση) σε αυτό το θρυλικό ξένιο show από το 1981.