Logistična regresija PySpark

Logisticna Regresija Pyspark



V tem priročniku PySpark bomo razpravljali o tem, kako izvesti logistično regresijo za napovedovanje, ali je osebo prizadela možganska kap ali ne. Na splošno se možganska kap pojavi, ko je oseba odvisna od kajenja/pijače. Drugi vzroki, kot so bolezni srca in visoke ravni glukoze v krvi (sladkorna bolezen), prav tako povzročajo možgansko kap. S pomočjo modela strojnega učenja logistične regresije bomo na vzorčnih podatkih napovedali in prikazali natančnost našega modela.

V tem priročniku si bomo najprej ogledali pristop in nato z analizo podatkov korak za korakom predvideli možgansko kap vsake osebe.

Logistična regresija

Logistična regresija, imenovana tudi 'logit model', se uporablja v napovedni analitiki za težave s klasifikacijo. To je model strojnega učenja, ki deluje samo na klasifikaciji za razvrščanje razredov (kategorij). V našem scenariju sta na primer dve kategoriji (oseba, ki jo je prizadela možganska kap, in oseba, ki je ni prizadela možganska kap). Najboljše aplikacije modela so napovedovanje bolezni srca, napovedovanje spola, napovedovanje življenjske dobe pridelka itd.







Koraki:

1. Zbiranje podatkov: Podatki so potrebni za izvedbo kakršnih koli napovedi/analiz. Med drugim je lahko v obliki CSV/XLSX. To lahko naložimo v okolje Spark (DataFrame) z uporabo metode spark.read.csv().



2. Analiza podatkov : Analiza atributov/stolpcev je znana kot 'analiza podatkov'. Stolpci, ki pomagajo napovedati razred, so znani kot 'neodvisni atributi'. Stolpec, ki ima za posledico napoved, je znan kot 'odvisni ali ciljni atribut'. V tem scenariju lahko uporabimo lastnost columns za prikaz vseh stolpcev. Metoda distinct() se uporablja za ogled edinstvenih vrednosti.



3. Predhodna obdelava podatkov: Filtriranje ničelnih/manjkajočih vrednosti je znano kot 'predobdelava'. V tej fazi odstranimo vse manjkajoče vrednosti. Stroj pozna samo binarni jezik. Torej je treba vse kategorije nizov pretvoriti v številske kategorične vrednosti. V PySparku lahko uporabimo »StringIndexer«, ki je razpoložljiv razred v modulu pyspark.ml.feature za pretvorbo kategorij nizov v številske. Samodejno jih notranje pretvori. Ni nam treba zagotoviti vrednosti. Uporabite lahko naslednjo sintakso:





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

4. Vektorsko sestavljanje: Zdaj imate podatke, ki jih stroj razume. V tej fazi je treba vse neodvisne atribute vektorizirati v en sam stolpec. To lahko storite z uporabo razreda VectorAssembler. Potrebuje dva parametra: prvi parameter je inputCols, ki zajema seznam neodvisnih atributov. Drugi parameter je outputCol, ki vektorizira vse inputCol-e v to spremenljivko.

asembler=VectorAssembler(inputCols=[columns…],outputCol=vectorized_data)

5. Preoblikovanje: Zdaj pripravite podatke s preoblikovanjem posodobljenih stolpcev (3. korak) s funkcijo transform().



assembler.transform(inxed_data)

6. Priprava podatkov za usposabljanje in testiranje: V tej fazi podatke razdelimo na »usposabljanje« in »testiranje«. Bolje bo, če razdelimo 70 % podatkov za usposabljanje modela in 30 % podatkov za testiranje modela. To je mogoče doseči z metodo randomSplit(). Potrebuje seznam z dvema plavajočima vrednostima: eno za preskusno delitev in drugo za delitev vlaka.

train_data,test_data=final_data.select([ 'Lastnosti' ,ciljni_stolpec]).randomSplit([0.70.0.30])

7. Prilagoditev in vrednotenje modela : Čas je, da prilagodimo model logistične regresije. Logistični regresijski model je na voljo v modulu pyspark.ml.classification. Zavzame oznako razreda/ciljni stolpec. Rezultat tega so stolpci rawPrediction, probability in napovedi. Naši rezultati so shranjeni v stolpcu napovedi.

# Prileganje modela

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

# Vrednotenje modela

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Natančnost in rezultati: To je zadnja faza, kjer testiramo točnost modela z uporabo poljubnih testnih tehnik.

Poglejmo naslednji projekt, kjer z uporabo modela logistične regresije napovemo, ali bo osebo prizadela možganska kap ali ne.

Napoved možganske kapi

9. Namestite modul PySpark v svoje okolje. Sledi ukaz za namestitev:

pip namestite pyspark

10. Ustvarimo PySpark DataFrame z 10 zapisi, ki so povezani s podrobnostmi udarca 10 oseb. Za predstavitev ustvarimo DataFrame brez CSV. V tem DataFrame je 7 stolpcev. »Gender«, »Glucose_level«, »married«, »age«, »heart_disease«, »hyper_tension« so neodvisni atributi, »Možganska kap« pa je oznaka razreda ali odvisen atribut. To pomeni, da je možganska kap osebe odvisna od teh neodvisnih lastnosti.

uvozi pyspark

iz pyspark.sql uvozi SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Namig za Linux' ).getOrCreate()

stoke_data =[

{ 'Spol' : 'ženska' , 'starost' : petdeset , 'srčna bolezen' : 'Da' ,

'hiper_tenzija' : 'Da' , 'poročen' : 'Da' , 'raven_glukoze' : 130 , 'možganska kap' : 1 },

{ 'Spol' : 'Moški' , 'starost' : dvajset , 'srčna bolezen' : 'ne' ,

'hiper_tenzija' : 'Da' , 'poročen' : 'ne' , 'raven_glukoze' : 97 , 'možganska kap' : 0 },

{ 'Spol' : 'Moški' , 'starost' : 12 , 'srčna bolezen' : 'ne' ,

'hiper_tenzija' : 'ne' , 'poročen' : 'ne' , 'raven_glukoze' : 98 , 'možganska kap' : 0 },

{ 'Spol' : 'ženska' , 'starost' : 90 , 'srčna bolezen' : 'ne' ,

'hiper_tenzija' : 'ne' , 'poročen' : 'Da' , 'raven_glukoze' : 170 , 'možganska kap' : 1 },

{ 'Spol' : 'Moški' , 'starost' : 43 , 'srčna bolezen' : 'Da' ,

'hiper_tenzija' : 'Da' , 'poročen' : 'Da' , 'raven_glukoze' : 150 , 'možganska kap' : 1 },

{ 'Spol' : 'ženska' , 'starost' : enaindvajset , 'srčna bolezen' : 'ne' ,

'hiper_tenzija' : 'ne' , 'poročen' : 'Da' , 'raven_glukoze' : 110 , 'možganska kap' : 0 },

{ 'Spol' : 'ženska' , 'starost' : petdeset , 'srčna bolezen' : 'Da' ,

'hiper_tenzija' : 'ne' , 'poročen' : 'Da' , 'raven_glukoze' : 100 , 'možganska kap' : 0 },

{ 'Spol' : 'Moški' , 'starost' : 3. 4 , 'srčna bolezen' : 'ne' ,

'hiper_tenzija' : 'Da' , 'poročen' : 'Da' , 'raven_glukoze' : 190 , 'možganska kap' : 1 },

{ 'Spol' : 'Moški' , 'starost' : 10 , 'srčna bolezen' : 'ne' ,

'hiper_tenzija' : 'ne' , 'poročen' : 'ne' , 'raven_glukoze' : 90 , 'možganska kap' : 0 },

{ 'Spol' : 'ženska' , 'starost' : 56 , 'srčna bolezen' : 'Da' ,

'hiper_tenzija' : 'Da' , 'poročen' : 'Da' , 'raven_glukoze' : 145 , 'možganska kap' : 1 }

]

# ustvarite podatkovni okvir iz zgornjih podatkov

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Dejanski stoke_df

stroke_df.show()

Izhod:

11. Prikažite neodvisne stolpce z uporabo metode select().

# Prikaz neodvisnih atributov

stroke_df.select(stroke_df[ 'Spol' ],stroke_df[ 'raven_glukoze' ],stroke_df[ 'poročen' ],stroke_df[ 'starost' ],stroke_df[ 'srčna bolezen' ],stroke_df[ 'hiper_tenzija' ]).show()

Izhod:

12. Prikažite edinstvene vrednosti, ki so prisotne v ciljnem atributu (Stroke).

Edinstvene vrednosti ciljnega atributa #

stroke_df.select(stroke_df[ 'možganska kap' ]).distinct().show()

Izhod:

13. Vrnite podatkovni tip vseh stolpcev s funkcijo printSchema().

# Vrni podatkovni tip vseh stolpcev.

stroke_df.printSchema()

Izhod:

Vidimo lahko, da so 4 stolpci vrste niza. Pretvorimo jih v kategorične številske vrednosti.

14. Pretvorimo kategorične vrednosti niza v številske kategorične vrednosti z uporabo StringIndexerja v stolpcih »Gender«, »heart_disease«, »hyper_tension« in »married« in jih zapišimo v stolpce Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension in Categotical_married. Shranite stolpce v indexed_data DataFrame z uporabo metode fit().

iz pyspark.ml.feature uvozi StringIndexer

# Pretvorite kategorične vrednosti niza v številske kategorične vrednosti v stolpcu »Spol«.

indexer_data=StringIndexer(inputCol= 'Spol' ,outputCol= 'Categotical_Gender' )

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

# Pretvori kategorične vrednosti niza v številske kategorične vrednosti v stolpcu 'heart_disease'.

indexer_data=StringIndexer(inputCol= 'srčna bolezen' ,outputCol= 'Kategorična_srčna_bolezen' )

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

# Pretvorite kategorične vrednosti niza v številske kategorične vrednosti v stolpcu 'hyper_tension'.

indexer_data=StringIndexer(inputCol= 'hiper_tenzija' ,outputCol= 'Kategotična_hiper_tenzija' )

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

# Pretvori kategorične vrednosti niza v številske kategorične vrednosti v stolpcu 'poročen'.

indexer_data=StringIndexer(inputCol= 'poročen' ,outputCol= 'Kategotski_poročeni' )

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

# Prikaži posodobljeno

indexed_data.show()

Izhod:

15. Pretvorite neodvisne stolpce v vektor z uporabo vektorskega sestavljalnika. Ime vektorja je 'features'.

iz pyspark.ml.feature uvozi VectorAssembler

asembler= VectorAssembler(inputCols=[ 'Categotical_Gender' , 'Kategorična_srčna_bolezen' , 'Kategotična_hiper_tenzija' , 'Kategotski_poročeni' , 'starost' ,

'raven_glukoze' ],outputCol= 'Lastnosti' )

16. Pretvorite prejšnje podatke v končni DataFrame s funkcijo transform() in jih prikažite s funkcijo show().

Izhod:

17. Pripravite podatke za usposabljanje in testiranje tako, da jih razdelite na 70-30. »Lastnosti« so shranjene v train_data in »Stroke« je shranjen v test_data.

# Pripravite podatke za usposabljanje in testiranje

train_data,test_data=final.select([ 'Lastnosti' , 'možganska kap' ]).randomSplit([ 0,70 , 0,30 ])

18. Prilagodite model logistične regresije in ga ovrednotite.

iz pyspark.ml.classification import LogisticRegression

# Prileganje modela

logistic_regression_model=Logistična regresija(labelCol= 'možganska kap' ).fit(podatki_vlaka)

# Vrednotenje modela

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Izhod:

19. Za preverjanje točnosti modela uporabite BinaryClassificationEvaluator. Vidimo lahko, da je naš model 100 % natančen.

iz pyspark.ml.evaluation uvozi BinaryClassificationEvaluator

# pokličite BinaryClassificationEvaluator

rezultati = BinaryClassificationEvaluator(rawPredictionCol= 'prediction' ,labelCol= 'možganska kap' )

ROC_AUC = rezultati.ocena(train_results)

natisni (ROC_AUC * 100 , '% natančnosti' )

Zaključek

Težavo s klasifikacijo dejanskih ploščic lahko predvidite z uporabo modela logistične regresije v PySpark. Odstranitev ničelnih/manjkajočih vrednosti je pomembna, saj zmanjšajo oceno in natančnost modela. Predhodna obdelava je nujen korak pred namestitvijo katerega koli modela strojnega učenja. Poskrbite, da boste ta korak izvedli pravilno in natančno.