Logistic Regression PySpark

Logistic Regression Pyspark



Σε αυτόν τον οδηγό PySpark, θα συζητήσουμε τον τρόπο εκτέλεσης της λογιστικής παλινδρόμησης για να προβλέψουμε εάν ένα άτομο επηρεάζεται από εγκεφαλικό επεισόδιο ή όχι. Γενικά, το εγκεφαλικό συμβαίνει όταν ένα άτομο είναι εθισμένο στο κάπνισμα/ποτό. Άλλοι λόγοι όπως οι καρδιακές παθήσεις και τα υψηλά επίπεδα γλυκόζης στο αίμα (διαβήτης) προκαλούν επίσης εγκεφαλικό επεισόδιο. Με τη βοήθεια του μοντέλου Logistic Regression Machine Learning, θα προβλέψουμε και θα δείξουμε την ακρίβεια του μοντέλου μας στα δείγματα δεδομένων.

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

Logistic Regression

Η λογιστική παλινδρόμηση, που ονομάζεται επίσης «Μοντέλο Logit», χρησιμοποιείται στην προγνωστική ανάλυση για προβλήματα ταξινόμησης. Αυτό είναι ένα μοντέλο Μηχανικής Μάθησης που λειτουργεί μόνο στην ταξινόμηση για την ταξινόμηση των κλάσεων (κατηγοριών). Για παράδειγμα, υπάρχουν δύο κατηγορίες στο σενάριό μας (ένα άτομο που έχει προσβληθεί από εγκεφαλικό και ένα άτομο που δεν επηρεάζεται από εγκεφαλικό). Οι καλύτερες εφαρμογές του μοντέλου είναι η πρόβλεψη καρδιακών παθήσεων, η πρόβλεψη φύλου, η πρόβλεψη της ζωής των καλλιεργειών κ.λπ.







Βήματα:

1. Συλλογή δεδομένων: Τα δεδομένα είναι απαραίτητα για την πραγματοποίηση τυχόν προβλέψεων/ανάλυσης. Μπορεί να έχει τη μορφή CSV/XLSX, μεταξύ άλλων. Μπορούμε να το φορτώσουμε στο περιβάλλον Spark (DataFrame) χρησιμοποιώντας τη μέθοδο spark.read.csv().



2. Ανάλυση Δεδομένων : Η ανάλυση των χαρακτηριστικών/στηλών είναι γνωστή ως «ανάλυση δεδομένων». Οι στήλες που βοηθούν στην πρόβλεψη της κλάσης είναι γνωστές ως «ανεξάρτητα χαρακτηριστικά». Η στήλη που οδηγεί σε πρόβλεψη είναι γνωστή ως 'εξαρτώμενο ή στόχο'. Σε αυτό το σενάριο, μπορούμε να χρησιμοποιήσουμε την ιδιότητα στήλης για να εμφανίσουμε όλες τις στήλες. Η μέθοδος distinct() χρησιμοποιείται για να δείτε τις μοναδικές τιμές.



3. Προεπεξεργασία δεδομένων: Το φιλτράρισμα των μηδενικών τιμών/τιμών που λείπουν είναι γνωστό ως 'προεπεξεργασία'. Αφαιρούμε όλες τις τιμές που λείπουν σε αυτό το στάδιο. Το μηχάνημα γνωρίζει μόνο τη δυαδική γλώσσα. Έτσι, όλες οι κατηγορίες συμβολοσειρών θα πρέπει να μετατραπούν σε αριθμητικές κατηγορικές τιμές. Στο PySpark, μπορούμε να χρησιμοποιήσουμε το 'StringIndexer' που είναι η διαθέσιμη κλάση στη λειτουργική μονάδα pyspark.ml.feature για να μετατρέψουμε τις κατηγορίες συμβολοσειρών σε αριθμητικές. Τα μετατρέπει αυτόματα εσωτερικά. Δεν χρειάζεται να παρέχουμε τις αξίες. Μπορείτε να χρησιμοποιήσετε την ακόλουθη σύνταξη:





indexer_data=StringIndexer(inputCol= 'String_Category_ColumnName' ,outputCol= 'New_Column_name' )

4. Συναρμολόγηση διανυσμάτων: Τώρα, έχετε τα δεδομένα που μπορεί να κατανοήσει το μηχάνημα. Σε αυτό το στάδιο, όλα τα ανεξάρτητα χαρακτηριστικά θα πρέπει να διανυσματοποιηθούν σε μία στήλη. Αυτό μπορεί να γίνει χρησιμοποιώντας την κλάση VectorAssembler. Χρειάζονται δύο παραμέτρους: Η πρώτη παράμετρος είναι το inputCols που παίρνει μια λίστα με ανεξάρτητα χαρακτηριστικά. Η δεύτερη παράμετρος είναι το outputCol που διανυσματοποιεί όλα τα inputCols σε αυτή τη μεταβλητή.

assembler=VectorAssembler(inputCols=[στήλες…],outputCol=vectorized_data)

5. Μεταμόρφωση: Τώρα, προετοιμάστε τα δεδομένα σας μετασχηματίζοντας τις ενημερωμένες στήλες (Βήμα 3) χρησιμοποιώντας τη συνάρτηση transform().



assembler.transform(inxed_data)

6. Προετοιμασία των δεδομένων για εκπαίδευση και δοκιμή: Σε αυτό το στάδιο, χωρίζουμε τα δεδομένα σε «εκπαίδευση» και «δοκιμή». Θα ήταν καλύτερα αν χωρίσουμε τα δεδομένα 70% για να εκπαιδεύσουμε το μοντέλο και 30% δεδομένα για να δοκιμάσουμε το μοντέλο. Αυτό μπορεί να επιτευχθεί χρησιμοποιώντας τη μέθοδο randomSplit(). Χρειάζεται μια λίστα που περιέχει δύο τιμές float: μία για δοκιμαστική διαίρεση και μία άλλη για διαχωρισμό αμαξοστοιχίας.

train_data,test_data=final_data.select([ 'χαρακτηριστικά' ,target_column]).randomSplit([0.70.0.30])

7. Προσαρμογή & Αξιολόγηση Μοντέλου : Ήρθε η ώρα να ταιριάξουμε το μοντέλο Logistic Regression. Το μοντέλο Logistic Regression είναι διαθέσιμο στη λειτουργική μονάδα pyspark.ml.classification. Παίρνει τη στήλη ετικέτα/στόχος κλάσης. Αυτό οδηγεί σε στήλες rawPrediction, probability και prediction. Τα αποτελέσματά μας αποθηκεύονται στη στήλη πρόβλεψης.

# Εφαρμογή μοντέλου

logistic_regression_model=LogisticRegression(labelCol=target_column).fit(train_data)

# Αξιολόγηση μοντέλου

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Ακρίβεια και αποτελέσματα: Αυτό είναι το τελικό στάδιο όπου δοκιμάζουμε την ακρίβεια του μοντέλου χρησιμοποιώντας οποιεσδήποτε τεχνικές δοκιμών.

Ας δούμε το παρακάτω έργο όπου προβλέπουμε εάν ένα άτομο επηρεάζεται από εγκεφαλικό επεισόδιο ή όχι χρησιμοποιώντας το μοντέλο Logistic Regression.

Πρόβλεψη εγκεφαλικού

9. Εγκαταστήστε τη λειτουργική μονάδα PySpark στο περιβάλλον σας. Ακολουθεί η εντολή εγκατάστασης:

pip εγκατάσταση pyspark

10. Ας δημιουργήσουμε ένα PySpark DataFrame με 10 εγγραφές που σχετίζονται με λεπτομέρειες διαδρομής 10 ατόμων. Για επίδειξη, δημιουργούμε ένα DataFrame χωρίς CSV. Υπάρχουν 7 στήλες σε αυτό το DataFrame. 'Φύλο', 'Επίπεδο γλυκόζης', 'έγγαμος', 'ηλικία', 'καρδιοπάθεια', 'υπερ_τάση' είναι ανεξάρτητα χαρακτηριστικά και το 'Εγκεφαλικό επεισόδιο' είναι η ετικέτα της κατηγορίας ή το εξαρτώμενο χαρακτηριστικό. Αυτό σημαίνει ότι το εγκεφαλικό επεισόδιο ενός ατόμου εξαρτάται από αυτά τα ανεξάρτητα χαρακτηριστικά.

εισαγωγή pyspark

από το pyspark.sql εισαγωγή SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Συμβουλή Linux' .getOrCreate()

stoke_data =[

{ 'Γένος' : 'Θηλυκός' , 'ηλικία' : πενήντα , 'καρδιακή ασθένεια' : 'Ναί' ,

'υπέρταση' : 'Ναί' , 'παντρεμένος' : 'Ναί' , 'Επίπεδο_γλυκόζης' : 130 , 'Εγκεφαλικό' : 1 },

{ 'Γένος' : 'Αρσενικός' , 'ηλικία' : είκοσι , 'καρδιακή ασθένεια' : 'Οχι' ,

'υπέρταση' : 'Ναί' , 'παντρεμένος' : 'Οχι' , 'Επίπεδο_γλυκόζης' : 97 , 'Εγκεφαλικό' : 0 },

{ 'Γένος' : 'Αρσενικός' , 'ηλικία' : 12 , 'καρδιακή ασθένεια' : 'Οχι' ,

'υπέρταση' : 'Οχι' , 'παντρεμένος' : 'Οχι' , 'Επίπεδο_γλυκόζης' : 98 , 'Εγκεφαλικό' : 0 },

{ 'Γένος' : 'Θηλυκός' , 'ηλικία' : 90 , 'καρδιακή ασθένεια' : 'Οχι' ,

'υπέρταση' : 'Οχι' , 'παντρεμένος' : 'Ναί' , 'Επίπεδο_γλυκόζης' : 170 , 'Εγκεφαλικό' : 1 },

{ 'Γένος' : 'Αρσενικός' , 'ηλικία' : 43 , 'καρδιακή ασθένεια' : 'Ναί' ,

'υπέρταση' : 'Ναί' , 'παντρεμένος' : 'Ναί' , 'Επίπεδο_γλυκόζης' : 150 , 'Εγκεφαλικό' : 1 },

{ 'Γένος' : 'Θηλυκός' , 'ηλικία' : είκοσι ένα , 'καρδιακή ασθένεια' : 'Οχι' ,

'υπέρταση' : 'Οχι' , 'παντρεμένος' : 'Ναί' , 'Επίπεδο_γλυκόζης' : 110 , 'Εγκεφαλικό' : 0 },

{ 'Γένος' : 'Θηλυκός' , 'ηλικία' : πενήντα , 'καρδιακή ασθένεια' : 'Ναί' ,

'υπέρταση' : 'Οχι' , 'παντρεμένος' : 'Ναί' , 'Επίπεδο_γλυκόζης' : 100 , 'Εγκεφαλικό' : 0 },

{ 'Γένος' : 'Αρσενικός' , 'ηλικία' : 3. 4 , 'καρδιακή ασθένεια' : 'Οχι' ,

'υπέρταση' : 'Ναί' , 'παντρεμένος' : 'Ναί' , 'Επίπεδο_γλυκόζης' : 190 , 'Εγκεφαλικό' : 1 },

{ 'Γένος' : 'Αρσενικός' , 'ηλικία' : 10 , 'καρδιακή ασθένεια' : 'Οχι' ,

'υπέρταση' : 'Οχι' , 'παντρεμένος' : 'Οχι' , 'Επίπεδο_γλυκόζης' : 90 , 'Εγκεφαλικό' : 0 },

{ 'Γένος' : 'Θηλυκός' , 'ηλικία' : 56 , 'καρδιακή ασθένεια' : 'Ναί' ,

'υπέρταση' : 'Ναί' , 'παντρεμένος' : 'Ναί' , 'Επίπεδο_γλυκόζης' : 145 , 'Εγκεφαλικό' : 1 }

]

# δημιουργήστε το πλαίσιο δεδομένων από τα παραπάνω δεδομένα

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Πραγματικό stoke_df

stroke_df.show()

Παραγωγή:

11. Εμφανίστε τις ανεξάρτητες στήλες χρησιμοποιώντας τη μέθοδο select().

# Εμφάνιση ανεξάρτητων χαρακτηριστικών

stroke_df.select(stroke_df[ 'Γένος' ],stroke_df[ 'Επίπεδο_γλυκόζης' ],stroke_df[ 'παντρεμένος' ],stroke_df[ 'ηλικία' ],stroke_df[ 'καρδιακή ασθένεια' ],stroke_df[ 'υπέρταση' ]).προβολή()

Παραγωγή:

12. Εμφανίστε τις μοναδικές τιμές που υπάρχουν στο χαρακτηριστικό προορισμού (Stroke).

# μοναδικές τιμές χαρακτηριστικού στόχου

stroke_df.select(stroke_df[ 'Εγκεφαλικό' ]).distinct().show()

Παραγωγή:

13. Επιστρέψτε τον τύπο δεδομένων όλων των στηλών χρησιμοποιώντας τη συνάρτηση printSchema().

# Επιστροφή τύπου δεδομένων όλων των στηλών.

stroke_df.printSchema()

Παραγωγή:

Μπορούμε να δούμε ότι 4 στήλες είναι τύπου συμβολοσειράς. Ας τις μετατρέψουμε σε κατηγορικές αριθμητικές τιμές.

14. Ας μετατρέψουμε τις τιμές των κατηγοριών συμβολοσειρών σε αριθμητικές τιμές κατηγορίας χρησιμοποιώντας το StringIndexer στις στήλες 'Gender', 'heart_disease', 'hyper_tension' και 'married' και ας τις γράψουμε στις στήλες Categotical_Gender, Categotical_heart_disease, Categotical_maratened, και Categotical_hyperategoten. Αποθηκεύστε τις στήλες στο indexed_data DataFrame χρησιμοποιώντας τη μέθοδο fit().

από το pyspark.ml.feature εισαγωγή StringIndexer

# Μετατρέψτε τις τιμές κατηγορίας συμβολοσειρών σε αριθμητικές τιμές κατηγορίας στη στήλη 'Φύλο'.

indexer_data=StringIndexer(inputCol= 'Γένος' ,outputCol= 'Categotical_Gender' )

indexed_data=indexer_data.fit(stroke_df).transform(stroke_df)

# Μετατρέψτε τις τιμές κατηγορίας συμβολοσειρών σε αριθμητικές τιμές κατηγορίας στη στήλη 'καρδιακή_ασθένεια'.

indexer_data=StringIndexer(inputCol= 'καρδιακή ασθένεια' ,outputCol= 'Κατηγορική_καρδιοπάθεια' )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Μετατρέψτε τις τιμές κατηγορίας συμβολοσειράς σε αριθμητικές τιμές κατηγορίας στη στήλη 'υπερ_τάση'.

indexer_data=StringIndexer(inputCol= 'υπέρταση' ,outputCol= 'Categotical_hyper_tension' )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Μετατρέψτε τις τιμές κατηγορίας συμβολοσειρών σε αριθμητικές τιμές κατηγορίας στη στήλη 'παντρεμένος'.

indexer_data=StringIndexer(inputCol= 'παντρεμένος' ,outputCol= 'Categotical_married' )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Εμφάνιση των ενημερωμένων

indexed_data.show()

Παραγωγή:

15. Μετατρέψτε τις ανεξάρτητες στήλες σε διάνυσμα χρησιμοποιώντας τη διάταξη συναρμολόγησης διανυσμάτων. Το όνομα του φορέα είναι 'χαρακτηριστικά'.

από το pyspark.ml.feature εισαγωγή VectorAssembler

assembler= VectorAssembler(inputCols=[ 'Categotical_Gender' , 'Κατηγορική_καρδιοπάθεια' , 'Categotical_hyper_tension' , 'Categotical_married' , 'ηλικία' ,

'Επίπεδο_γλυκόζης' ],outputCol= 'χαρακτηριστικά' )

16. Μετατρέψτε τα προηγούμενα δεδομένα σε τελικό DataFrame χρησιμοποιώντας τη συνάρτηση transform() και εμφανίστε τα χρησιμοποιώντας τη συνάρτηση show().

Παραγωγή:

17. Προετοιμάστε τα δεδομένα για εκπαίδευση και δοκιμή χωρίζοντάς τα σε 70-30. Τα 'χαρακτηριστικά' αποθηκεύονται στο train_data και το 'Stroke' αποθηκεύεται στα test_data.

# Προετοιμάστε δεδομένα για εκπαίδευση και δοκιμές

train_data,test_data=final.select([ 'χαρακτηριστικά' , 'Εγκεφαλικό' ]).randomSplit([ 0,70 , 0,30 ])

18. Προσαρμόστε το μοντέλο Logistic Regression και αξιολογήστε το.

από το pyspark.ml.classification εισαγωγή LogisticRegression

# Εφαρμογή μοντέλου

logistic_regression_model=LogisticRegression(labelCol= 'Εγκεφαλικό' ).fit(train_data)

# Αξιολόγηση μοντέλου

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Παραγωγή:

19. Χρησιμοποιήστε το BinaryClassificationEvaluator για να ελέγξετε την ακρίβεια του μοντέλου. Μπορούμε να δούμε ότι το μοντέλο μας είναι 100% ακριβές.

από το pyspark.ml.evaluation εισαγωγή BinaryClassificationEvaluator

# καλέστε το BinaryClassificationEvaluator

αποτελέσματα = BinaryClassificationEvaluator(rawPredictionCol= 'προφητεία' ,labelCol= 'Εγκεφαλικό' )

ROC_AUC = results.evaluate(train_results)

εκτύπωση(ROC_AUC * 100 , '% Ακρίβεια' )

συμπέρασμα

Μπορείτε να προβλέψετε το πρόβλημα ταξινόμησης πραγματικών πλακιδίων χρησιμοποιώντας το μοντέλο Logistic Regression στο PySpark. Η κατάργηση των μηδενικών τιμών/τιμών που λείπουν είναι σημαντική καθώς μειώνουν την αξιολόγηση και την ακρίβεια του μοντέλου. Η προεπεξεργασία είναι ένα απαραίτητο βήμα πριν την τοποθέτηση οποιουδήποτε μοντέλου μηχανικής εκμάθησης. Βεβαιωθείτε ότι κάνετε αυτό το βήμα σωστά και με ακρίβεια.