Regression logística de PySpark

Regression Logistica De Pyspark



En aquesta guia de PySpark, parlarem de com realitzar la regressió logística per predir si una persona està afectada per un ictus o no. En general, l'ictus es produeix quan una persona és addicta al tabac/beure. Altres motius com les malalties del cor i els nivells elevats de glucosa a la sang (diabetis) també causen un ictus. Amb l'ajuda del model d'aprenentatge automàtic de regressió logística, predirem i mostrarem la precisió del nostre model a les dades de mostra.

En aquesta guia, primer veurem el plantejament i després predirem l'ictus de cada persona analitzant les dades pas a pas.

Regressió logística

La regressió logística, també anomenada 'Model Logit', s'utilitza en l'anàlisi predictiva de problemes de classificació. Aquest és un model d'aprenentatge automàtic que només funciona en la classificació per classificar les classes (categories). Per exemple, hi ha dues categories al nostre escenari (una persona afectada per un ictus i una persona que no està afectada per un ictus). Les millors aplicacions del model són la predicció de malalties cardíaques, predicció de gènere, predicció de vida de cultius, etc.







Passos:

1. Recollida de dades: Les dades són necessàries per realitzar qualsevol predicció/anàlisi. Pot ser en forma de CSV/XLSX, entre d'altres. Ho podem carregar a l'entorn Spark (DataFrame) mitjançant el mètode spark.read.csv().



2. Anàlisi de dades : L'anàlisi dels atributs/columnes es coneix com a 'anàlisi de dades'. Les columnes que ajuden a predir la classe es coneixen com a 'atributs independents'. La columna que dóna lloc a la predicció es coneix com a 'atribut dependent o objectiu'. En aquest escenari, podem utilitzar la propietat columns per mostrar totes les columnes. El mètode distinct() s'utilitza per veure els valors únics.



3. Preprocessament de dades: El filtratge dels valors nuls/falts es coneix com a 'preprocessament'. Eliminarem tots els valors que falten en aquesta etapa. La màquina només coneix el llenguatge binari. Per tant, totes les categories de cadenes s'han de convertir en valors categòrics numèrics. A PySpark, podem utilitzar el 'StringIndexer', que és la classe disponible al mòdul pyspark.ml.feature per convertir les categories de cadenes a numèriques. Els converteix automàticament internament. No hem de donar els valors. Podeu utilitzar la sintaxi següent:





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

4. Muntatge de vectors: Ara, teniu les dades que la màquina pot entendre. En aquesta etapa, tots els atributs independents s'han de vectoritzar en una sola columna. Això es pot fer mitjançant la classe VectorAssembler. Pren dos paràmetres: El primer paràmetre és inputCols que pren una llista d'atributs independents. El segon paràmetre és el outputCol que vectoritza tots els inputCols en aquesta variable.

assemblador=VectorAssembler(inputCols=[columnes...],outputCol=dades_vectoritzades)

5. Transformació: Ara, prepareu les vostres dades transformant les columnes actualitzades (pas 3) mitjançant la funció transform().



assembler.transform(dades_inxed)

6. Preparació de les dades per a la formació i les proves: En aquesta etapa, dividim les dades en 'entrenament' i 'proves'. Serà millor si dividim el 70% de dades per entrenar el model i el 30% de dades per provar el model. Això es pot aconseguir mitjançant el mètode randomSplit(). Es necessita una llista que conté dos valors flotants: un per a la divisió de prova i un altre per a la divisió del tren.

train_data,test_data=final_data.select([ 'característiques' ,columna_destí]).randomSplit([0.70.0.30])

7. Adaptació i avaluació del model : És hora d'encaixar el model de regressió logística. El model de regressió logística està disponible al mòdul pyspark.ml.classification. Pren l'etiqueta de classe/columna objectiu. Això resulta en columnes rawPrediction, probabilitat i predicció. Els nostres resultats s'emmagatzemen a la columna de predicció.

# Adaptació del model

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

# Avaluació del model

tren_results=model_de_regressió_logística.avaluar(dades_tren).prediccions

8. Precisió i resultats: Aquesta és l'etapa final on provem la precisió del model mitjançant qualsevol tècnica de prova.

Vegem el següent projecte on predim si una persona està afectada per un ictus o no utilitzant el model de regressió logística.

Predicció d'ictus

9. Instal·leu el mòdul PySpark al vostre entorn. La següent és l'ordre per instal·lar:

pip instal·lar pyspark

10. Creem un PySpark DataFrame amb 10 registres relacionats amb els detalls de l'ictus de 10 persones. Per a la demostració, creem un DataFrame sense CSV. Hi ha 7 columnes en aquest DataFrame. 'Gènere', 'Glucose_level', 'married', 'edat', 'heart_disease', 'hiper_tension' són atributs independents i 'ictus' és l'etiqueta de classe o atribut dependent. Això vol dir que l'ictus d'una persona depèn d'aquests atributs independents.

importar pyspark

des de pyspark.sql importació SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Suggeriment de Linux' ).getOrCreate()

stoke_data =[

{ 'Gènere' : 'Dona' , 'edat' : 50 , 'malaltia cardíaca' : 'Sí' ,

'hiper_tensió' : 'Sí' , 'casat' : 'Sí' , 'Nivell_de_glucosa' : 130 , 'Ictus' : 1 },

{ 'Gènere' : 'Masculí' , 'edat' : 20 , 'malaltia cardíaca' : 'No' ,

'hiper_tensió' : 'Sí' , 'casat' : 'No' , 'Nivell_de_glucosa' : 97 , 'Ictus' : 0 },

{ 'Gènere' : 'Masculí' , 'edat' : 12 , 'malaltia cardíaca' : 'No' ,

'hiper_tensió' : 'No' , 'casat' : 'No' , 'Nivell_de_glucosa' : 98 , 'Ictus' : 0 },

{ 'Gènere' : 'Dona' , 'edat' : 90 , 'malaltia cardíaca' : 'No' ,

'hiper_tensió' : 'No' , 'casat' : 'Sí' , 'Nivell_de_glucosa' : 170 , 'Ictus' : 1 },

{ 'Gènere' : 'Masculí' , 'edat' : 43 , 'malaltia cardíaca' : 'Sí' ,

'hiper_tensió' : 'Sí' , 'casat' : 'Sí' , 'Nivell_de_glucosa' : 150 , 'Ictus' : 1 },

{ 'Gènere' : 'Dona' , 'edat' : 21 , 'malaltia cardíaca' : 'No' ,

'hiper_tensió' : 'No' , 'casat' : 'Sí' , 'Nivell_de_glucosa' : 110 , 'Ictus' : 0 },

{ 'Gènere' : 'Dona' , 'edat' : 50 , 'malaltia cardíaca' : 'Sí' ,

'hiper_tensió' : 'No' , 'casat' : 'Sí' , 'Nivell_de_glucosa' : 100 , 'Ictus' : 0 },

{ 'Gènere' : 'Masculí' , 'edat' : 34 , 'malaltia cardíaca' : 'No' ,

'hiper_tensió' : 'Sí' , 'casat' : 'Sí' , 'Nivell_de_glucosa' : 190 , 'Ictus' : 1 },

{ 'Gènere' : 'Masculí' , 'edat' : 10 , 'malaltia cardíaca' : 'No' ,

'hiper_tensió' : 'No' , 'casat' : 'No' , 'Nivell_de_glucosa' : 90 , 'Ictus' : 0 },

{ 'Gènere' : 'Dona' , 'edat' : 56 , 'malaltia cardíaca' : 'Sí' ,

'hiper_tensió' : 'Sí' , 'casat' : 'Sí' , 'Nivell_de_glucosa' : 145 , 'Ictus' : 1 }

]

# creeu el marc de dades a partir de les dades anteriors

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Stoke_df real

stroke_df.show()

Sortida:

11. Mostra les columnes independents mitjançant el mètode select().

# Mostra atributs independents

stroke_df.select(stroke_df[ 'Gènere' ],stroke_df[ 'Nivell_glucosa' ],stroke_df[ 'casat' ],stroke_df[ 'edat' ],stroke_df[ 'malaltia cardíaca' ],stroke_df[ 'hiper_tensió' ]).espectacle()

Sortida:

12. Mostra els valors únics que hi ha a l'atribut de destinació (Traç).

# valors únics de l'atribut objectiu

stroke_df.select(stroke_df[ 'Ictus' ]).distinct().mostrar()

Sortida:

13. Retorneu el tipus de dades de totes les columnes mitjançant la funció printSchema().

# Retorna el tipus de dades de totes les columnes.

stroke_df.printSchema()

Sortida:

Podem veure que 4 columnes són de tipus string. Convertim-los en valors numèrics categòrics.

14. Convertim els valors categòrics de la cadena en valors categòrics numèrics mitjançant el StringIndexer a les columnes 'Genere', 'malaltia_cor', 'hiper_tensió' i 'casat' i escrivim-los a les columnes Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension i Categotical_married columns. Emmagatzemeu les columnes al DataFrame indexed_data mitjançant el mètode fit().

des de pyspark.ml.feature import StringIndexer

# Converteix els valors categòrics de cadena en valors categòrics numèrics a la columna 'Gènere'.

indexer_data=StringIndexer(inputCol= 'Gènere' ,outputCol= 'Gènere_categòtic' )

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

# Converteix els valors categòrics de cadena en valors categòrics numèrics a la columna 'malaltia_cor'.

indexer_data=StringIndexer(inputCol= 'malaltia cardíaca' ,outputCol= 'Malaltia_del_cor_categòtica' )

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

# Converteix els valors categòrics de cadena en valors categòrics numèrics a la columna 'hyper_tension'.

indexer_data=StringIndexer(inputCol= 'hiper_tensió' ,outputCol= 'Hiper_tensió_categòtica' )

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

# Converteix els valors categòrics de cadena en valors categòrics numèrics a la columna 'casat'.

indexer_data=StringIndexer(inputCol= 'casat' ,outputCol= 'Casat_categòtic' )

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

# Mostra l'actualitzat

indexed_data.show()

Sortida:

15. Converteix les columnes independents en un vector utilitzant l'assemblador vectorial. El nom del vector és 'característiques'.

des de pyspark.ml.feature import VectorAssembler

assemblador= VectorAssembler(inputCols=[ 'Gènere_categòtic' , 'Malaltia_del_cor_categòtica' , 'Hiper_tensió_categòtica' , 'Casat_categòtic' , 'edat' ,

'Nivell_de_glucosa' ],outputCol= 'característiques' )

16. Transformeu les dades anteriors en un DataFrame final utilitzant la funció transform() i visualitzeu-les mitjançant la funció show().

Sortida:

17. Prepara les dades per a l'entrenament i les proves dividint-les en 70-30. Les 'característiques' s'emmagatzemen a train_data i 'Stroke' s'emmagatzema a test_data.

# Preparar dades per a la formació i les proves

train_data,test_data=final.select([ 'característiques' , 'Ictus' ]).randomSplit([ 0.70 , 0.30 ])

18. Ajusteu el model de regressió logística i avalueu-lo.

de pyspark.ml.classification import LogisticRegression

# Adaptació del model

logistic_regression_model=Regressió logística(labelCol= 'Ictus' ).fit(dades_tren)

# Avaluació del model

tren_results=model_de_regressió_logística.avaluar(dades_tren).prediccions

train_results.show()

Sortida:

19. Utilitzeu BinaryClassificationEvaluator per comprovar la precisió del model. Podem veure que el nostre model és 100% precís.

des de pyspark.ml.evaluation import BinaryClassificationEvaluator

# truqueu al BinaryClassificationEvaluator

resultats = BinaryClassificationEvaluator(rawPredictionCol= 'predicció' ,labelCol= 'Ictus' )

ROC_AUC = results.evaluate(train_results)

imprimir(ROC_AUC * 100 , '% de precisió' )

Conclusió

Podeu predir el problema de classificació de rajoles reals mitjançant el model de regressió logística a PySpark. És important eliminar els valors nuls/falts, ja que disminueixen l'avaluació i la precisió del model. El preprocessament és un pas necessari abans d'ajustar qualsevol model d'aprenentatge automàtic. Assegureu-vos que feu aquest pas correctament i amb precisió.