PySpark Logistic Regression

Pyspark Logistic Regression



Tässä PySpark-oppaassa käsittelemme logistisen regression suorittamista sen ennustamiseksi, vaikuttaako henkilö aivohalvaukseen vai ei. Yleensä aivohalvaus tapahtuu, kun henkilö on riippuvainen tupakoinnista/juomasta. Muut syyt, kuten sydänsairaus ja korkea veren glukoosipitoisuus (diabetes), aiheuttavat myös aivohalvauksen. Logistic Regression Machine Learning -mallin avulla ennustamme ja näytämme mallimme tarkkuuden näytetiedoissa.

Tässä oppaassa näemme ensin lähestymistavan ja sitten ennustamme jokaisen henkilön aivohalvauksen analysoimalla tiedot vaihe vaiheelta.

Logistinen regressio

Logistista regressiota, jota kutsutaan myös 'Logit-malliksi', käytetään ennustavassa analytiikassa luokitteluongelmissa. Tämä on koneoppimismalli, joka toimii vain luokittelussa luokkien (luokkien) luokittelussa. Esimerkiksi skenaariossamme on kaksi luokkaa (henkilö, jolla on aivohalvaus, ja henkilö, jolla ei ole aivohalvausta). Mallin parhaat sovellukset ovat sydänsairauksien ennustaminen, sukupuolen ennustaminen, sadon eliniän ennustaminen jne.







Askeleet:

1. Tiedonkeruu: Tiedot ovat välttämättömiä ennusteiden/analyysien suorittamiseen. Se voi olla muun muassa CSV/XLSX-muodossa. Voimme ladata tämän Spark-ympäristöön (DataFrame) spark.read.csv() -menetelmällä.



2. Tietojen analyysi : Attribuuttien/sarakkeiden analysointi tunnetaan nimellä 'data-analyysi'. Sarakkeet, jotka auttavat ennustamaan luokkaa, tunnetaan 'itsenäisinä määritteinä'. Ennustukseen johtava sarake tunnetaan nimellä 'riippuvainen tai kohdeattribuutti'. Tässä skenaariossa voimme käyttää sarakkeet-ominaisuutta kaikkien sarakkeiden näyttämiseen. Erillinen()-menetelmää käytetään yksilöllisten arvojen näkemiseen.



3. Tietojen esikäsittely: Nolla-/puuttuvien arvojen suodattamista kutsutaan esikäsittelyksi. Poistamme kaikki puuttuvat arvot tässä vaiheessa. Kone osaa vain binäärikielen. Joten kaikki merkkijonoluokat tulisi muuntaa numeerisiksi kategorisiksi arvoiksi. PySparkissa voimme käyttää 'StringIndexeria', joka on käytettävissä oleva luokka pyspark.ml.feature -moduulissa merkkijonoluokkien muuntamiseen numeerisiksi. Se muuntaa ne automaattisesti sisäisesti. Meidän ei tarvitse tarjota arvoja. Voit käyttää seuraavaa syntaksia:





indexer_data=StringIndexer(inputCol= 'merkkijono_luokka_sarakkeen nimi' ,outputCol= 'New_Column_name' )

4. Vektorin kokoaminen: Nyt sinulla on tiedot, jotka kone voi ymmärtää. Tässä vaiheessa kaikki riippumattomat attribuutit tulee vektoroida yhdeksi sarakkeeksi. Tämä voidaan tehdä käyttämällä VectorAssembler-luokkaa. Se vaatii kaksi parametria: Ensimmäinen parametri on inputCols, joka ottaa luettelon itsenäisistä attribuuteista. Toinen parametri on outputCol, joka vektorisoi kaikki inputCols tähän muuttujaan.

assembler=VectorAssembler(inputCols=[sarakkeet…],outputCol=vectorized_data)

5. Muunnos: Valmistele nyt tietosi muuntamalla päivitetyt sarakkeet (vaihe 3) transform()-funktiolla.



assembler.transform(inxed_data)

6. Tietojen valmistelu koulutusta ja testausta varten: Tässä vaiheessa jaamme tiedot 'koulutukseen' ja 'testaukseen'. On parempi, jos jaamme 70 % tiedoista mallin kouluttamiseksi ja 30 % mallin testaamiseksi. Tämä voidaan saavuttaa käyttämällä randomSplit()-menetelmää. Se vaatii luettelon, jossa on kaksi kelluvaa arvoa: yksi testijakoa varten ja toinen junan jakamista varten.

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

7. Mallin sovitus ja arviointi : On aika sovittaa Logistic Regression -malli. Logistic Regression -malli on saatavilla pyspark.ml.classification-moduulissa. Se vie luokan otsikon/kohdesarakkeen. Tämä johtaa rawPrediction-, todennäköisyys- ja ennustussarakkeisiin. Tuloksemme tallennetaan ennustesarakkeeseen.

# Mallin sovitus

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

# Mallin arviointi

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Tarkkuus ja tulokset: Tämä on viimeinen vaihe, jossa testaamme mallin tarkkuutta millä tahansa testaustekniikalla.

Katsotaanpa seuraavaa projektia, jossa ennustetaan, onko henkilöllä aivohalvaus vai ei, käyttämällä Logistic Regression -mallia.

Aivohalvauksen ennuste

9. Asenna PySpark-moduuli ympäristöösi. Seuraava on asennuskomento:

pip asennus pyspark

10. Luodaan PySpark DataFrame, jossa on 10 tietuetta, jotka liittyvät 10 henkilön aivohalvaustietoihin. Esittelyä varten luomme DataFramen ilman CSV:tä. Tässä DataFramessa on 7 saraketta. 'Sukupuoli', 'Glukoositaso', 'naimisissa', 'ikä', 'sydänsairaus', 'hypertensio' ovat itsenäisiä määritteitä ja 'halvaus' on luokan nimi tai riippuvainen attribuutti. Tämä tarkoittaa, että henkilön aivohalvaus riippuu näistä itsenäisistä ominaisuuksista.

tuonti pyspark

pyspark.sql-tiedostosta tuo SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Linux Hint' ).getOrCreate()

stoke_data =[

{ 'Sukupuoli' : 'Nainen' , 'ikä' : viisikymmentä , 'sydänsairaus' : 'Joo' ,

'hyper_tension' : 'Joo' , 'naimisissa' : 'Joo' , 'glukoositaso' : 130 , 'Aivohalvaus' : 1 },

{ 'Sukupuoli' : 'Uros' , 'ikä' : kaksikymmentä , 'sydänsairaus' : 'Ei' ,

'hyper_tension' : 'Joo' , 'naimisissa' : 'Ei' , 'glukoositaso' : 97 , 'Aivohalvaus' : 0 },

{ 'Sukupuoli' : 'Uros' , 'ikä' : 12 , 'sydänsairaus' : 'Ei' ,

'hyper_tension' : 'Ei' , 'naimisissa' : 'Ei' , 'glukoositaso' : 98 , 'Aivohalvaus' : 0 },

{ 'Sukupuoli' : 'Nainen' , 'ikä' : 90 , 'sydänsairaus' : 'Ei' ,

'hyper_tension' : 'Ei' , 'naimisissa' : 'Joo' , 'glukoositaso' : 170 , 'Aivohalvaus' : 1 },

{ 'Sukupuoli' : 'Uros' , 'ikä' : 43 , 'sydänsairaus' : 'Joo' ,

'hyper_tension' : 'Joo' , 'naimisissa' : 'Joo' , 'glukoositaso' : 150 , 'Aivohalvaus' : 1 },

{ 'Sukupuoli' : 'Nainen' , 'ikä' : kaksikymmentäyksi , 'sydänsairaus' : 'Ei' ,

'hyper_tension' : 'Ei' , 'naimisissa' : 'Joo' , 'glukoositaso' : 110 , 'Aivohalvaus' : 0 },

{ 'Sukupuoli' : 'Nainen' , 'ikä' : viisikymmentä , 'sydänsairaus' : 'Joo' ,

'hyper_tension' : 'Ei' , 'naimisissa' : 'Joo' , 'glukoositaso' : 100 , 'Aivohalvaus' : 0 },

{ 'Sukupuoli' : 'Uros' , 'ikä' : 3. 4 , 'sydänsairaus' : 'Ei' ,

'hyper_tension' : 'Joo' , 'naimisissa' : 'Joo' , 'glukoositaso' : 190 , 'Aivohalvaus' : 1 },

{ 'Sukupuoli' : 'Uros' , 'ikä' : 10 , 'sydänsairaus' : 'Ei' ,

'hyper_tension' : 'Ei' , 'naimisissa' : 'Ei' , 'glukoositaso' : 90 , 'Aivohalvaus' : 0 },

{ 'Sukupuoli' : 'Nainen' , 'ikä' : 56 , 'sydänsairaus' : 'Joo' ,

'hyper_tension' : 'Joo' , 'naimisissa' : 'Joo' , 'glukoositaso' : 145 , 'Aivohalvaus' : 1 }

]

# luo datakehys yllä olevista tiedoista

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Todellinen stoke_df

stroke_df.show()

Lähtö:

11. Näytä itsenäiset sarakkeet käyttämällä select()-menetelmää.

# Näytä riippumattomat attribuutit

stroke_df.select(stroke_df[ 'sukupuoli' ],stroke_df[ 'glukoositaso' ],stroke_df[ 'naimisissa' ],stroke_df[ 'ikä' ],stroke_df[ 'sydänsairaus' ],stroke_df[ 'hypertension' ]).näytä()

Lähtö:

12. Näytä kohdeattribuutissa (Stroke) olevat yksilölliset arvot.

# kohdeattribuutin yksilölliset arvot

stroke_df.select(stroke_df[ 'Aivohalvaus' ]).erillinen().show()

Lähtö:

13. Palauta kaikkien sarakkeiden tietotyypit printSchema()-funktiolla.

# Palauta kaikkien sarakkeiden tietotyyppi.

stroke_df.printSchema()

Lähtö:

Näemme, että 4 saraketta ovat merkkijonotyyppisiä. Muunnetaan ne kategorisiksi numeerisiksi arvoiksi.

14. Muunnetaan merkkijonon kategorialliset arvot numeerisiksi kategorisiksi arvoiksi käyttämällä StringIndexeria sarakkeissa 'Sukupuoli', 'sydänsairaus', 'hyper_tension' ja 'naimisissa' ja kirjoitetaan ne sarakkeisiin Kategoottinen_sukupuoli, Kategoottinen_sydänsairaus, Kategotinen_hyperotsmartension_ ja Kategotinen_hyperotsmartical. Tallenna sarakkeet indexed_data DataFrameen käyttämällä fit()-menetelmää.

pyspark.ml.feature tuonti StringIndexeristä

# Muunna merkkijonon kategorialliset arvot numeerisiksi kategorisiksi arvoiksi 'Sukupuoli'-sarakkeessa.

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

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

# Muunna merkkijonon kategorialliset arvot numeerisiksi kategorisiksi arvoiksi 'heart_disease' -sarakkeessa.

indexer_data=StringIndexer(inputCol= 'sydänsairaus' ,outputCol= Kategotinen_sydänsairaus )

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

# Muunna merkkijonon kategorialliset arvot numeerisiksi kategorisiksi arvoiksi 'hyper_tension'-sarakkeessa.

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

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

# Muunna merkkijonon kategorialliset arvot numeerisiksi kategorisiksi arvoiksi 'naimisissa'-sarakkeessa.

indexer_data=StringIndexer(inputCol= 'naimisissa' ,outputCol= 'Categotical_married' )

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

# Näytä päivitetty

indexed_data.show()

Lähtö:

15. Muunna itsenäiset sarakkeet vektoriksi vektorin kokoajan avulla. Vektorin nimi on 'ominaisuudet'.

pyspark.ml.feature tuonti VectorAssembler

assembler= VectorAssembler(inputCols=[ 'Categotical_Gender' , Kategotinen_sydänsairaus , 'Categotical_hyper_tension' , 'Categotical_married' , 'ikä' ,

'glukoositaso' ],outputCol= 'ominaisuudet' )

16. Muunna edelliset tiedot lopulliseksi DataFrame-kehykseksi transform()-funktiolla ja näytä se show()-funktiolla.

Lähtö:

17. Valmistele tiedot koulutusta ja testausta varten jakamalla ne 70-30:een. 'Ominaisuudet' on tallennettu train_data-kenttään ja 'Stroke' on tallennettu test_data-kohtaan.

# Valmistele tiedot koulutusta ja testausta varten

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

18. Sovita Logistic Regression -malli ja arvioi se.

pyspark.ml.classification import LogisticRegression

# Mallin sovitus

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

# Mallin arviointi

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Lähtö:

19. Tarkista mallin tarkkuus BinaryClassificationEvaluatorilla. Voimme nähdä, että mallimme on 100% tarkka.

pyspark.ml.evaluation tuonti BinaryClassificationEvaluatorista

# soita BinaryClassificationEvaluatorille

tulokset = BinaryClassificationEvaluator(rawPredictionCol= 'ennustus' ,labelCol= 'Aivohalvaus' )

ROC_AUC = tulokset.evaluate(train_results)

tulosta (ROC_AUC * 100 , '% tarkkuus' )

Johtopäätös

PySparkin Logistic Regression -mallin avulla pystyt ennustamaan todellisen laatan luokitteluongelman. Nolla-/puuttuvien arvojen poistaminen on tärkeää, koska ne heikentävät mallin arviointia ja tarkkuutta. Esikäsittely on välttämätön vaihe ennen koneoppimismallin sovittamista. Varmista, että teet tämän vaiheen oikein ja tarkasti.