PySpark logistinė regresija

Pyspark Logistine Regresija



Šiame „PySpark“ vadove aptarsime, kaip atlikti logistinę regresiją, kad būtų galima numatyti, ar žmogus patyrė insultą, ar ne. Apskritai insultas ištinka, kai žmogus yra priklausomas nuo rūkymo/gėrimo. Kitos priežastys, tokios kaip širdies ligos ir didelis gliukozės kiekis kraujyje (diabetas), taip pat sukelia insultą. Naudodami logistinės regresijos mašininio mokymosi modelį, mes prognozuosime ir parodysime savo modelio tikslumą pavyzdiniais duomenimis.

Šiame vadove pirmiausia pamatysime metodą, o tada, žingsnis po žingsnio analizuodami duomenis, prognozuosime kiekvieno žmogaus insultą.

Logistinė regresija

Logistinė regresija, dar vadinama „Logit modeliu“, naudojama klasifikavimo problemų nuspėjamojoje analizėje. Tai mašininio mokymosi modelis, kuris veikia tik klasifikuojant klases (kategorijas). Pavyzdžiui, mūsų scenarijuje yra dvi kategorijos (asmuo, patyręs insultą, ir asmuo, kuris nepatyręs insulto). Geriausias modelio pritaikymas yra širdies ligų prognozavimas, lyties numatymas, pasėlių gyvenimo prognozė ir kt.







Veiksmai:

1. Duomenų rinkimas: Duomenys būtini norint atlikti bet kokias prognozes / analizę. Tai gali būti CSV / XLSX forma, be kita ko. Tai galime įkelti į Spark aplinką (DataFrame) naudodami spark.read.csv() metodą.



2. Duomenų analizė : Atributų / stulpelių analizė žinoma kaip „duomenų analizė“. Stulpeliai, padedantys numatyti klasę, yra žinomi kaip „nepriklausomi atributai“. Stulpelis, kurio rezultatas yra numatymas, yra žinomas kaip „priklausomas arba tikslinis požymis“. Šiame scenarijuje galime naudoti stulpelių ypatybę, kad būtų rodomi visi stulpeliai. Skirtingų () metodas naudojamas unikalioms reikšmėms pamatyti.



3. Išankstinis duomenų apdorojimas: Nulinių / trūkstamų verčių filtravimas yra žinomas kaip „išankstinis apdorojimas“. Šiame etape pašaliname visas trūkstamas reikšmes. Mašina žino tik dvejetainę kalbą. Taigi, visos eilučių kategorijos turėtų būti konvertuojamos į skaitines kategorines reikšmes. „PySpark“ galime naudoti „StringIndexer“, kuri yra prieinama pyspark.ml.feature modulio klasė, norėdami konvertuoti eilučių kategorijas į skaitines. Jis automatiškai konvertuoja juos viduje. Mums nereikia teikti vertybių. Galite naudoti šią sintaksę:





indexer_data=StringIndexer(inputCol= 'Eilutės_kategorijos_stulpelio pavadinimas' ,outputCol= „Naujas_stulpelio_pavadinimas“ )

4. Vektoriaus surinkimas: Dabar jūs turite duomenis, kuriuos mašina gali suprasti. Šiame etape visi nepriklausomi atributai turi būti vektorizuoti į vieną stulpelį. Tai galima padaryti naudojant VectorAssembler klasę. Tam reikalingi du parametrai: Pirmasis parametras yra inputCols, kuris paima nepriklausomų atributų sąrašą. Antrasis parametras yra outputCol, kuris vektorizuoja visas inputCols į šį kintamąjį.

assembler=VectorAssembler(inputCols=[stulpeliai…],outputCol=vektoriniai_duomenys)

5. Transformacija: Dabar paruoškite duomenis pakeisdami atnaujintus stulpelius (3 veiksmas) naudodami transform () funkciją.



assembler.transform(inxed_data)

6. Duomenų paruošimas mokymui ir testavimui: Šiame etape mes suskirstome duomenis į „mokymą“ ir „testavimą“. Bus geriau, jei padalinsime 70% duomenų modeliui išmokyti ir 30% duomenų modeliui išbandyti. Tai galima pasiekti naudojant randomSplit() metodą. Tam reikia sąrašo, kuriame yra dvi slankiosios reikšmės: viena bandomajam padalijimui ir kita traukinio padalijimui.

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

7. Modelių pritaikymas ir įvertinimas : Atėjo laikas pritaikyti logistinės regresijos modelį. Logistinės regresijos modelis yra pyspark.ml.classification modulyje. Tai užima klasės etiketę / tikslinį stulpelį. Dėl to atsiranda rawPrediction, tikimybių ir numatymo stulpeliai. Mūsų rezultatai saugomi numatymo stulpelyje.

# Modelio pritaikymas

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

# Modelio įvertinimas

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Tikslumas ir rezultatai: Tai paskutinis etapas, kai mes patikriname modelio tikslumą naudodami bet kokius testavimo metodus.

Pažiūrėkime į šį projektą, kuriame mes prognozuojame, ar žmogus yra paveiktas insulto, ar ne, naudojant logistinės regresijos modelį.

Insulto numatymas

9. Įdiekite PySpark modulį savo aplinkoje. Toliau pateikiama komanda, kurią reikia įdiegti:

pip įdiegti pyspark

10. Sukurkime PySpark DataFrame su 10 įrašų, susijusių su 10 asmenų insulto informacija. Demonstravimui sukuriame DataFrame be CSV. Šiame „DataFrame“ yra 7 stulpeliai. „Lytis“, „Gliukozės lygis“, „vedęs“, „amžius“, „širdies liga“, „hipertenzija“ yra nepriklausomi atributai, o „insultas“ yra klasės etiketė arba priklausomas atributas. Tai reiškia, kad žmogaus insultas priklauso nuo šių nepriklausomų savybių.

importuoti pyspark

iš pyspark.sql importuoti SparkSession

linuxhint_spark_app = SparkSession.builder.appName( „Linux patarimas“ ).getOrCreate()

stoke_data =[

{ 'Lytis' : 'Moteris' , 'amžius' : penkiasdešimt , 'širdies liga' : 'taip' ,

„hipertenzija“ : 'taip' , 'Vedęs' : 'taip' , „Gliukozės_ lygis“ : 130 , 'insultas' : 1 },

{ 'Lytis' : 'Patinas' , 'amžius' : dvidešimt , 'širdies liga' : 'ne' ,

„hipertenzija“ : 'taip' , 'Vedęs' : 'ne' , „Gliukozės_ lygis“ : 97 , 'insultas' : 0 },

{ 'Lytis' : 'Patinas' , 'amžius' : 12 , 'širdies liga' : 'ne' ,

„hipertenzija“ : 'ne' , 'Vedęs' : 'ne' , „Gliukozės_ lygis“ : 98 , 'insultas' : 0 },

{ 'Lytis' : 'Moteris' , 'amžius' : 90 , 'širdies liga' : 'ne' ,

„hipertenzija“ : 'ne' , 'Vedęs' : 'taip' , „Gliukozės_ lygis“ : 170 , 'insultas' : 1 },

{ 'Lytis' : 'Patinas' , 'amžius' : 43 , 'širdies liga' : 'taip' ,

„hipertenzija“ : 'taip' , 'Vedęs' : 'taip' , „Gliukozės_ lygis“ : 150 , 'insultas' : 1 },

{ 'Lytis' : 'Moteris' , 'amžius' : dvidešimt vienas , 'širdies liga' : 'ne' ,

„hipertenzija“ : 'ne' , 'Vedęs' : 'taip' , „Gliukozės_ lygis“ : 110 , 'insultas' : 0 },

{ 'Lytis' : 'Moteris' , 'amžius' : penkiasdešimt , 'širdies liga' : 'taip' ,

„hipertenzija“ : 'ne' , 'Vedęs' : 'taip' , „Gliukozės_ lygis“ : 100 , 'insultas' : 0 },

{ 'Lytis' : 'Patinas' , 'amžius' : 3. 4 , 'širdies liga' : 'ne' ,

„hipertenzija“ : 'taip' , 'Vedęs' : 'taip' , „Gliukozės_ lygis“ : 190 , 'insultas' : 1 },

{ 'Lytis' : 'Patinas' , 'amžius' : 10 , 'širdies liga' : 'ne' ,

„hipertenzija“ : 'ne' , 'Vedęs' : 'ne' , „Gliukozės_ lygis“ : 90 , 'insultas' : 0 },

{ 'Lytis' : 'Moteris' , 'amžius' : 56 , 'širdies liga' : 'taip' ,

„hipertenzija“ : 'taip' , 'Vedęs' : 'taip' , „Gliukozės_ lygis“ : 145 , 'insultas' : 1 }

]

# sukurkite duomenų rėmelį iš aukščiau pateiktų duomenų

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Faktinis stoke_df

stroke_df.show()

Išvestis:

11. Rodykite nepriklausomus stulpelius naudodami select() metodą.

# Rodyti nepriklausomus atributus

stroke_df.select(stroke_df[ 'Lytis' ],stroke_df[ 'Gliukozės_ lygis' ],stroke_df[ 'Vedęs' ],stroke_df[ 'amžius' ],stroke_df[ 'širdies liga' ],stroke_df[ 'hipertenzija' ]).Rodyti()

Išvestis:

12. Rodyti unikalias reikšmes, esančias tiksliniame atribute (Stroke).

# tikslinės atributo unikalios vertės

stroke_df.select(stroke_df[ 'Insultas' ]).skirtinga().show()

Išvestis:

13. Grąžinkite visų stulpelių duomenų tipą naudodami funkciją printSchema().

# Grąžinti visų stulpelių duomenų tipą.

stroke_df.printSchema()

Išvestis:

Matome, kad 4 stulpeliai yra eilutės tipo. Paverskime jas į kategorines skaitines reikšmes.

14. Konvertuokime eilučių kategorines reikšmes į skaitines kategorines reikšmes naudodami StringIndexer stulpeliuose „Lytis“, „širdies liga“, „hiper_įtampa“ ir „vedęs“ ir įrašykite jas į Kategotinę_lytį, Kategorinę_širdies_ligą, Kategotinę_hipertetinio_stulpelius. Išsaugokite stulpelius į indexed_data DataFrame naudodami fit() metodą.

iš pyspark.ml.feature importuoti StringIndexer

# Konvertuokite eilučių kategorines reikšmes į skaitines kategorines reikšmes stulpelyje „Lytis“.

indexer_data=StringIndexer(inputCol= 'Lytis' ,outputCol= „Categotical_Gender“ )

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

# Konvertuokite eilučių kategorines reikšmes į skaitines kategorines reikšmes stulpelyje 'heart_disease'.

indexer_data=StringIndexer(inputCol= 'širdies liga' ,outputCol= „Kategotinė_širdies_liga“ )

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

# Konvertuokite eilučių kategorines reikšmes į skaitines kategorines reikšmes stulpelyje „hiper_įtempimas“.

indexer_data=StringIndexer(inputCol= 'hipertenzija' ,outputCol= „Kategotinė_hipertenzija“ )

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

# Konvertuokite eilučių kategorines reikšmes į skaitines kategorines reikšmes stulpelyje „vedęs“.

indexer_data=StringIndexer(inputCol= 'Vedęs' ,outputCol= „Categotical_married“ )

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

# Rodyti atnaujintą

indexed_data.show()

Išvestis:

15. Konvertuokite nepriklausomus stulpelius į vektorių naudodami vektorių surinkėją. Vektoriaus pavadinimas yra „ypatybės“.

iš pyspark.ml.feature importuoti VectorAssembler

assembler= VectorAssembler(inputCols=[ „Categotical_Gender“ , „Kategotinė_širdies_liga“ , „Kategotinė_hipertenzija“ , „Categotical_married“ , 'amžius' ,

„Gliukozės_ lygis“ ],outputCol= 'funkcijos' )

16. Paverskite ankstesnius duomenis į galutinį DataFrame naudodami transform() funkciją ir parodykite juos naudodami funkciją show().

Išvestis:

17. Paruoškite duomenis mokymui ir testavimui, padalydami juos į 70-30. „Funkcijos“ saugomos Train_data, o „Stroke“ – test_data.

# Paruoškite duomenis mokymui ir testavimui

train_data,test_data=final.select([ 'funkcijos' , 'insultas' ]).randomSplit([ 0,70 , 0.30 ])

18. Pritaikykite Logistinės regresijos modelį ir įvertinkite jį.

iš pyspark.ml.classification importuoti LogisticRegression

# Modelio pritaikymas

logistic_regression_model=LogisticRegression(labelCol= 'insultas' ).fit(train_data)

# Modelio įvertinimas

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Išvestis:

19. Norėdami patikrinti modelio tikslumą, naudokite BinaryClassificationEvaluator. Matome, kad mūsų modelis yra 100% tikslus.

iš pyspark.ml.evaluation importuoti BinaryClassificationEvaluator

# skambinkite BinaryClassificationEvaluator

rezultatai = BinaryClassificationEvaluator(rawPredictionCol= 'prognozė' ,labelCol= 'insultas' )

ROC_AUC = rezultatai.įvertinti(train_results)

spausdinti(ROC_AUC* 100 , „% tikslumas“ )

Išvada

Galite numatyti realios plytelės klasifikavimo problemą naudodami PySpark logistinės regresijos modelį. Nulinių / trūkstamų verčių pašalinimas yra svarbus, nes sumažina modelio įvertinimą ir tikslumą. Išankstinis apdorojimas yra būtinas žingsnis prieš pritaikant bet kokį mašininio mokymosi modelį. Įsitikinkite, kad šį veiksmą atlikote tinkamai ir tiksliai.