Regressione logistica PySpark

Regressione Logistica Pyspark



In questa guida PySpark, discuteremo come eseguire la regressione logistica per prevedere se una persona è affetta da ictus o meno. In generale, l'ictus si verifica quando una persona è dipendente da fumo/bevande. Anche altri motivi come le malattie cardiache e gli alti livelli di glucosio nel sangue (diabete) causano l'ictus. Con l'aiuto del modello Logistic Regression Machine Learning, prevederemo e mostreremo l'accuratezza del nostro modello sui dati campione.

In questa guida vedremo prima l'approccio e poi prevedere l'ictus di ogni persona analizzando i dati passo dopo passo.

Regressione logistica

La regressione logistica, chiamata anche 'modello logit', viene utilizzata nell'analisi predittiva per problemi di classificazione. Questo è un modello di Machine Learning che funziona solo sulla classificazione per classificare le classi (categorie). Ad esempio, ci sono due categorie nel nostro scenario (una persona colpita da ictus e una persona che non è colpita da ictus). Le migliori applicazioni del modello sono la previsione delle malattie cardiache, la previsione del genere, la previsione della vita delle colture, ecc.







Passi:

1. Raccolta dati: I dati sono necessari per eseguire eventuali previsioni/analisi. Può essere sotto forma di CSV/XLSX, tra gli altri. Possiamo caricarlo nell'ambiente Spark (DataFrame) usando il metodo spark.read.csv().



2. Analisi dei dati : L'analisi degli attributi/colonne è nota come 'analisi dei dati'. Le colonne che aiutano a prevedere la classe sono note come 'attributi indipendenti'. La colonna che risulta nella previsione è nota come 'attributo dipendente o target'. In questo scenario, possiamo utilizzare la proprietà columns per visualizzare tutte le colonne. Il metodo distinto() viene utilizzato per visualizzare i valori univoci.



3. Preelaborazione dei dati: Il filtraggio dei valori nulli/mancanti è noto come 'preelaborazione'. Rimuoviamo tutti i valori mancanti in questa fase. La macchina conosce solo il linguaggio binario. Pertanto, tutte le categorie di stringhe devono essere convertite in valori categorici numerici. In PySpark, possiamo usare 'StringIndexer' che è la classe disponibile nel modulo pyspark.ml.feature per convertire le categorie di stringhe in numeriche. Li converte automaticamente internamente. Non abbiamo bisogno di fornire i valori. Puoi usare la seguente sintassi:





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

4. Assemblaggio vettoriale: Ora hai i dati che la macchina può capire. In questa fase, tutti gli attributi indipendenti dovrebbero essere vettorizzati in un'unica colonna. Questo può essere fatto usando la classe VectorAssembler. Accetta due parametri: il primo parametro è inputCols che accetta un elenco di attributi indipendenti. Il secondo parametro è outputCol che vettorializza tutti gli inputCol in questa variabile.

assembler=VectorAssembler(inputCols=[colonne…],outputCol=dati_vettoriali)

5. Trasformazione: Ora, prepara i tuoi dati trasformando le colonne aggiornate (passaggio 3) utilizzando la funzione transform().



assembler.transform(inxed_data)

6. Preparazione dei dati per la formazione e il test: In questa fase, dividiamo i dati in 'formazione' e 'test'. Sarà meglio se dividiamo i dati del 70% per addestrare il modello e i dati del 30% per testare il modello. Ciò può essere ottenuto utilizzando il metodo randomSplit(). Prende un elenco che contiene due valori float: uno per il test split e un altro per il train split.

train_data,test_data=final_data.select([ 'caratteristiche' ,target_column]).randomSplit([0.70.0.30])

7. Adattamento e valutazione del modello : è il momento di adattare il modello di regressione logistica. Il modello di regressione logistica è disponibile nel modulo pyspark.ml.classification. Prende l'etichetta della classe/colonna di destinazione. Ciò si traduce in colonne rawPrediction, probabilità e previsione. I nostri risultati sono memorizzati nella colonna di previsione.

# Adattamento del modello

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

# Valutazione del modello

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Precisione e risultati: Questa è la fase finale in cui testiamo l'accuratezza del modello utilizzando qualsiasi tecnica di test.

Diamo un'occhiata al seguente progetto in cui prevediamo se una persona è affetta da ictus o meno utilizzando il modello di regressione logistica.

Previsione dell'ictus

9. Installa il modulo PySpark nel tuo ambiente. Di seguito è riportato il comando da installare:

pip installa pyspark

10. Creiamo un DataFrame PySpark con 10 record correlati ai dettagli dell'ictus di 10 persone. Per dimostrazione, creiamo un DataFrame senza CSV. Ci sono 7 colonne in questo DataFrame. 'Gender', 'Glucose_level', 'married', 'age', 'heart_disease', 'hyper_tension' sono attributi indipendenti e 'Stroke' è l'etichetta della classe o l'attributo dipendente. Ciò significa che il tratto di una persona dipende da questi attributi indipendenti.

importa pyspark

da pyspark.sql importa SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Suggerimento per Linux' ).getOrCreate()

stoke_data =[

{ 'Genere' : 'Femmina' , 'età' : cinquanta , 'cardiopatia' : 'SÌ' ,

'ipertensione' : 'SÌ' , 'sposato' : 'SÌ' , 'Livello_di_glucosio' : 130 , 'Colpo' : 1 },

{ 'Genere' : 'Maschio' , 'età' : venti , 'cardiopatia' : 'NO' ,

'ipertensione' : 'SÌ' , 'sposato' : 'NO' , 'Livello_di_glucosio' : 97 , 'Colpo' : 0 },

{ 'Genere' : 'Maschio' , 'età' : 12 , 'cardiopatia' : 'NO' ,

'ipertensione' : 'NO' , 'sposato' : 'NO' , 'Livello_di_glucosio' : 98 , 'Colpo' : 0 },

{ 'Genere' : 'Femmina' , 'età' : 90 , 'cardiopatia' : 'NO' ,

'ipertensione' : 'NO' , 'sposato' : 'SÌ' , 'Livello_di_glucosio' : 170 , 'Colpo' : 1 },

{ 'Genere' : 'Maschio' , 'età' : 43 , 'cardiopatia' : 'SÌ' ,

'ipertensione' : 'SÌ' , 'sposato' : 'SÌ' , 'Livello_di_glucosio' : 150 , 'Colpo' : 1 },

{ 'Genere' : 'Femmina' , 'età' : ventuno , 'cardiopatia' : 'NO' ,

'ipertensione' : 'NO' , 'sposato' : 'SÌ' , 'Livello_di_glucosio' : 110 , 'Colpo' : 0 },

{ 'Genere' : 'Femmina' , 'età' : cinquanta , 'cardiopatia' : 'SÌ' ,

'ipertensione' : 'NO' , 'sposato' : 'SÌ' , 'Livello_di_glucosio' : 100 , 'Colpo' : 0 },

{ 'Genere' : 'Maschio' , 'età' : 3. 4 , 'cardiopatia' : 'NO' ,

'ipertensione' : 'SÌ' , 'sposato' : 'SÌ' , 'Livello_di_glucosio' : 190 , 'Colpo' : 1 },

{ 'Genere' : 'Maschio' , 'età' : 10 , 'cardiopatia' : 'NO' ,

'ipertensione' : 'NO' , 'sposato' : 'NO' , 'Livello_di_glucosio' : 90 , 'Colpo' : 0 },

{ 'Genere' : 'Femmina' , 'età' : 56 , 'cardiopatia' : 'SÌ' ,

'ipertensione' : 'SÌ' , 'sposato' : 'SÌ' , 'Livello_di_glucosio' : 145 , 'Colpo' : 1 }

]

# crea il dataframe dai dati di cui sopra

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Stoke_df effettivo

colpo_df.show()

Produzione:

11. Visualizzare le colonne indipendenti utilizzando il metodo select().

# Mostra attributi indipendenti

tratto_df.select(tratto_df[ 'Genere' ],stroke_df[ 'Livello_glucosio' ],stroke_df[ 'sposato' ],stroke_df[ 'età' ],stroke_df[ 'cardiopatia' ],stroke_df[ 'ipertensione' ]).spettacolo()

Produzione:

12. Visualizzare i valori univoci presenti nell'attributo target (Stroke).

# valori univoci dell'attributo di destinazione

tratto_df.select(tratto_df[ 'Colpo' ]).distinct().show()

Produzione:

13. Restituire il tipo di dati di tutte le colonne utilizzando la funzione printSchema().

# Restituisce il tipo di dati di tutte le colonne.

stroke_df.printSchema()

Produzione:

Possiamo vedere che 4 colonne sono di tipo stringa. Convertiamoli in valori numerici categorici.

14. Convertiamo i valori categorici stringa in valori categorici numerici utilizzando StringIndexer nelle colonne 'Gender', 'heart_disease', 'hyper_tension' e 'married' e scriviamoli nelle colonne Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension e Categotical_married. Memorizza le colonne nel DataFrame indexed_data utilizzando il metodo fit().

da pyspark.ml.feature import StringIndexer

# Converti valori categorici stringa in valori categorici numerici nella colonna 'Sesso'.

indexer_data=StringIndexer(inputCol= 'Genere' ,outputCol= 'Sesso_Categotico' )

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

# Converti valori categorici stringa in valori categorici numerici nella colonna 'heart_disease'.

indexer_data=StringIndexer(inputCol= 'cardiopatia' ,outputCol= 'Malattia_cardiaca_categotica' )

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

# Converti valori categorici stringa in valori categorici numerici nella colonna 'hyper_tension'.

indexer_data=StringIndexer(inputCol= 'ipertensione' ,outputCol= 'Categotical_hyper_tension' )

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

# Converti valori categorici stringa in valori categorici numerici nella colonna 'sposato'.

indexer_data=StringIndexer(inputCol= 'sposato' ,outputCol= 'Categotico_sposato' )

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

# Visualizza l'aggiornamento

dati_indicizzati.show()

Produzione:

15. Convertire le colonne indipendenti in un vettore utilizzando il vector assembler. Il nome del vettore è 'caratteristiche'.

da pyspark.ml.feature importare VectorAssembler

assembler=VectorAssembler(inputCols=[ 'Sesso_Categotico' , 'Malattia_cardiaca_categotica' , 'Categotical_hyper_tension' , 'Categotico_sposato' , 'età' ,

'Livello_di_glucosio' ],outputCol= 'caratteristiche' )

16. Trasforma i dati precedenti in un DataFrame finale utilizzando la funzione transform() e visualizzalo utilizzando la funzione show().

Produzione:

17. Preparare i dati per l'addestramento e il test suddividendoli in 70-30. Le 'caratteristiche' sono memorizzate in train_data e 'Stroke' sono memorizzate in test_data.

# Preparare i dati per l'addestramento e il test

train_data,test_data=final.select([ 'caratteristiche' , 'Colpo' ]).randomSplit([ 0,70 , 0,30 ])

18. Adattare il modello di regressione logistica e valutarlo.

da pyspark.ml.classification import LogisticRegression

# Adattamento del modello

logistic_regression_model=LogisticRegression(labelCol= 'Colpo' .fit(treno_dati)

# Valutazione del modello

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Produzione:

19. Utilizzare BinaryClassificationEvaluator per controllare l'accuratezza del modello. Possiamo vedere che il nostro modello è accurato al 100%.

da pyspark.ml.evaluation importare BinaryClassificationEvaluator

# chiama BinaryClassificationEvaluator

risultati = BinaryClassificationEvaluator(rawPredictionCol= 'predizione' ,etichettaCol= 'Colpo' )

ROC_AUC = risultati.evaluate(train_results)

stampa(ROC_AUC * 100 , '% Precisione' )

Conclusione

Sei in grado di prevedere il problema di classificazione delle tessere reali utilizzando il modello di regressione logistica in PySpark. La rimozione dei valori nulli/mancanti è importante in quanto riduce la valutazione e l'accuratezza del modello. La preelaborazione è un passaggio necessario prima di adattare qualsiasi modello di machine learning. Assicurati di eseguire questo passaggio in modo corretto e accurato.