PySpark Logistische Regressie

Pyspark Logistische Regressie



In deze PySpark-gids bespreken we hoe de logistische regressie kan worden uitgevoerd om te voorspellen of een persoon door een beroerte wordt getroffen of niet. Over het algemeen treedt een beroerte op wanneer een persoon verslaafd is aan roken/drinken. Andere redenen zoals hartaandoeningen en hoge glucosewaarden in het bloed (diabetes) veroorzaken ook een beroerte. Met behulp van het Logistic Regression Machine Learning-model voorspellen en tonen we de nauwkeurigheid van ons model op de voorbeeldgegevens.

In deze gids zullen we eerst de aanpak zien en vervolgens de beroerte van elke persoon voorspellen door de gegevens stap voor stap te analyseren.

Logistieke regressie

Logistische regressie, ook wel het 'Logit-model' genoemd, wordt gebruikt in voorspellende analyses voor classificatieproblemen. Dit is een Machine Learning-model dat alleen werkt op classificatie om de klassen (categorieën) te classificeren. Er zijn bijvoorbeeld twee categorieën in ons scenario (een persoon die getroffen is door een beroerte en een persoon die geen beroerte heeft). De beste toepassingen van het model zijn voorspelling van hartziekten, geslachtsvoorspelling, voorspelling van de levensduur van gewassen, enz.







Stappen:

1. Gegevensverzameling: De gegevens zijn nodig om eventuele voorspellingen/analyses uit te voeren. Dit kan onder andere de vorm van CSV/XLSX hebben. We kunnen dit in de Spark-omgeving (DataFrame) laden met behulp van de methode spark.read.csv().



2. Gegevensanalyse : Het analyseren van de attributen/kolommen staat bekend als “data-analyse”. De kolommen die helpen om de klasse te voorspellen, staan ​​bekend als 'onafhankelijke attributen'. De kolom die resulteert in voorspelling staat bekend als 'afhankelijk of doelattribuut'. In dit scenario kunnen we de eigenschap columns gebruiken om alle kolommen weer te geven. De distinct() methode wordt gebruikt om de unieke waarden te zien.



3. Gegevensvoorverwerking: Het filteren van de null/ontbrekende waarden staat bekend als 'preprocessing'. We verwijderen alle ontbrekende waarden in deze fase. De machine kent alleen de binaire taal. Alle tekenreekscategorieën moeten dus worden geconverteerd naar numerieke categorische waarden. In PySpark kunnen we de 'StringIndexer', de beschikbare klasse in de module pyspark.ml.feature, gebruiken om de tekenreekscategorieën naar numeriek te converteren. Het converteert ze automatisch intern. We hoeven de waarden niet op te geven. U kunt de volgende syntaxis gebruiken:





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

4. Vectormontage: Nu hebt u de gegevens die de machine kan begrijpen. In deze fase moeten alle onafhankelijke attributen in een enkele kolom worden gevectoriseerd. Dit kan worden gedaan met behulp van de klasse VectorAssembler. Er zijn twee parameters voor nodig: de eerste parameter is de inputCols die een lijst met onafhankelijke attributen nodig heeft. De tweede parameter is de outputCol die alle inputCols in deze variabele vectoriseert.

assembler=VectorAssembler(inputCols=[kolommen...],outputCol=vectorized_data)

5. Transformatie: Bereid nu uw gegevens voor door de bijgewerkte kolommen te transformeren (stap 3) met behulp van de functie transform().



assembler.transform(inxed_data)

6. De gegevens voorbereiden voor training en testen: In deze fase splitsen we de data op in “training” en “testen”. Het is beter als we de 70% data splitsen om het model te trainen en 30% data om het model te testen. Dit kan worden bereikt met de methode randomSplit(). Er is een lijst voor nodig die twee float-waarden bevat: een voor testsplitsing en een andere voor treinsplitsing.

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

7. Modelaanpassing & Evaluatie : Het is tijd om het Logistic Regression-model te passen. Het Logistic Regression-model is beschikbaar in de module pyspark.ml.classification. Hiervoor is de klasselabel/doelkolom nodig. Dit resulteert in rawPrediction-, waarschijnlijkheids- en voorspellingskolommen. Onze resultaten worden opgeslagen in de voorspellingskolom.

# Modelpassing

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

# Modelevaluatie

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Nauwkeurigheid en resultaten: Dit is de laatste fase waarin we de modelnauwkeurigheid testen met behulp van testtechnieken.

Laten we eens kijken naar het volgende project waarin we voorspellen of een persoon door een beroerte wordt getroffen of niet met behulp van het Logistic Regression-model.

Beroerte voorspelling

9. Installeer de PySpark-module in uw omgeving. Het volgende is de opdracht om te installeren:

pip installeer pyspark

10. Laten we een PySpark DataFrame maken met 10 records die betrekking hebben op beroertegegevens van 10 personen. Ter demonstratie maken we een DataFrame zonder CSV. Er zijn 7 kolommen in dit DataFrame. 'Geslacht', 'Glucose_niveau', 'getrouwd', 'leeftijd', 'hartziekte', 'hyper_tensie' zijn onafhankelijke attributen en 'Beroerte' is het klassenlabel of afhankelijke attribuut. Dat betekent dat de slag van een persoon afhankelijk is van deze onafhankelijke attributen.

pyspark importeren

importeer vanuit pyspark.sql SparkSession

linuxhint_spark_app = SparkSession.builder.appName( 'Linux-tip' ).getOrCreate()

stoke_data =[

{ 'Geslacht' : 'Vrouwelijk' , 'leeftijd' : vijftig , 'hartziekte' : 'Ja' ,

'hyper_tensie' : 'Ja' , 'getrouwd' : 'Ja' , 'Glucose_niveau' : 130 , 'Hartinfarct' : 1 },

{ 'Geslacht' : 'Mannelijk' , 'leeftijd' : twintig , 'hartziekte' : 'Nee' ,

'hyper_tensie' : 'Ja' , 'getrouwd' : 'Nee' , 'Glucose_niveau' : 97 , 'Hartinfarct' : 0 },

{ 'Geslacht' : 'Mannelijk' , 'leeftijd' : 12 , 'hartziekte' : 'Nee' ,

'hyper_tensie' : 'Nee' , 'getrouwd' : 'Nee' , 'Glucose_niveau' : 98 , 'Hartinfarct' : 0 },

{ 'Geslacht' : 'Vrouwelijk' , 'leeftijd' : 90 , 'hartziekte' : 'Nee' ,

'hyper_tensie' : 'Nee' , 'getrouwd' : 'Ja' , 'Glucose_niveau' : 170 , 'Hartinfarct' : 1 },

{ 'Geslacht' : 'Mannelijk' , 'leeftijd' : 43 , 'hartziekte' : 'Ja' ,

'hyper_tensie' : 'Ja' , 'getrouwd' : 'Ja' , 'Glucose_niveau' : 150 , 'Hartinfarct' : 1 },

{ 'Geslacht' : 'Vrouwelijk' , 'leeftijd' : eenentwintig , 'hartziekte' : 'Nee' ,

'hyper_tensie' : 'Nee' , 'getrouwd' : 'Ja' , 'Glucose_niveau' : 110 , 'Hartinfarct' : 0 },

{ 'Geslacht' : 'Vrouwelijk' , 'leeftijd' : vijftig , 'hartziekte' : 'Ja' ,

'hyper_tensie' : 'Nee' , 'getrouwd' : 'Ja' , 'Glucose_niveau' : 100 , 'Hartinfarct' : 0 },

{ 'Geslacht' : 'Mannelijk' , 'leeftijd' : 3. 4 , 'hartziekte' : 'Nee' ,

'hyper_tensie' : 'Ja' , 'getrouwd' : 'Ja' , 'Glucose_niveau' : 190 , 'Hartinfarct' : 1 },

{ 'Geslacht' : 'Mannelijk' , 'leeftijd' : 10 , 'hartziekte' : 'Nee' ,

'hyper_tensie' : 'Nee' , 'getrouwd' : 'Nee' , 'Glucose_niveau' : 90 , 'Hartinfarct' : 0 },

{ 'Geslacht' : 'Vrouwelijk' , 'leeftijd' : 56 , 'hartziekte' : 'Ja' ,

'hyper_tensie' : 'Ja' , 'getrouwd' : 'Ja' , 'Glucose_niveau' : 145 , 'Hartinfarct' : 1 }

]

# maak het dataframe van de bovenstaande gegevens

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Actuele stoke_df

stroke_df.show()

Uitgang:

11. Geef de onafhankelijke kolommen weer met behulp van de select()-methode.

# Geef onafhankelijke attributen weer

stroke_df.select(stroke_df[ 'Geslacht' ],slag_df[ 'Glucose_niveau' ],slag_df[ 'getrouwd' ],slag_df[ 'leeftijd' ],slag_df[ 'hartziekte' ],slag_df[ 'hyper_tensie' ]).show()

Uitgang:

12. Geef de unieke waarden weer die aanwezig zijn in het doelattribuut (Stroke).

# doelattribuut unieke waarden

stroke_df.select(stroke_df[ 'Hartinfarct' ]).distinct().show()

Uitgang:

13. Retourneer het gegevenstype van alle kolommen met behulp van de functie printSchema().

# Retourneer datatype van alle kolommen.

stroke_df.printSchema()

Uitgang:

We kunnen zien dat 4 kolommen van het type string zijn. Laten we ze omzetten in categorische numerieke waarden.

14. Laten we de categorische tekenreekswaarden converteren naar numerieke categorische waarden met behulp van de StringIndexer in de kolommen 'Gender', 'heart_disease', 'hyper_tension' en 'married' en deze in de kolommen Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension en Categotical_married schrijven. Sla de kolommen op in het geïndexeerde_data DataFrame met behulp van de fit() methode.

van pyspark.ml.feature importeer StringIndexer

# Converteer categorische tekenreekswaarden naar numerieke categorische waarden in de kolom 'Geslacht'.

indexer_data=StringIndexer(inputCol= 'Geslacht' ,outputCol= 'Categotisch_geslacht' )

geïndexeerde_data=indexer_data.fit(stroke_df).transform(stroke_df)

# Converteer string categorische waarden naar numerieke categorische waarden in de kolom 'heart_disease'.

indexer_data=StringIndexer(inputCol= 'hartziekte' ,outputCol= 'Categotische_hartziekte' )

geïndexeerde_data=indexer_data.fit(geïndexeerde_data).transform(geïndexeerde_data)

# Converteer string categorische waarden naar numerieke categorische waarden in de kolom 'hyper_tension'.

indexer_data=StringIndexer(inputCol= 'hyper_tensie' ,outputCol= 'Categotische_hyper_spanning' )

geïndexeerde_data=indexer_data.fit(geïndexeerde_data).transform(geïndexeerde_data)

# Converteer categorische tekenreekswaarden naar numerieke categorische waarden in de kolom 'getrouwd'.

indexer_data=StringIndexer(inputCol= 'getrouwd' ,outputCol= 'Categotisch_getrouwd' )

geïndexeerde_data=indexer_data.fit(geïndexeerde_data).transform(geïndexeerde_data)

# Geef de bijgewerkte weer

geïndexeerde_data.show()

Uitgang:

15. Converteer de onafhankelijke kolommen naar een vector met behulp van de vector-assembler. De naam van de vector is 'kenmerken'.

van pyspark.ml.feature importeer VectorAssembler

assembler= VectorAssembler(inputCols=[ 'Categotisch_geslacht' , 'Categotische_hartziekte' , 'Categotische_hyper_spanning' , 'Categotisch_getrouwd' , 'leeftijd' ,

'Glucose_niveau' ],outputCol= 'functies' )

16. Transformeer de vorige gegevens in een definitief DataFrame met behulp van de functie transform() en geef deze weer met de functie show().

Uitgang:

17. Bereid de gegevens voor op training en testen door deze op te splitsen in 70-30. De 'features' wordt opgeslagen in de train_data en 'Stroke' wordt opgeslagen in de test_data.

# Gegevens voorbereiden voor training en testen

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

18. Pas het Logistic Regression-model aan en evalueer het.

van pyspark.ml.classification import LogisticRegression

# Modelpassing

logistics_regression_model=LogisticRegression(labelCol= 'Hartinfarct' .fit(treingegevens)

# Modelevaluatie

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Uitgang:

19. Gebruik de BinaryClassificationEvaluator om de modelnauwkeurigheid te controleren. We kunnen zien dat ons model 100% nauwkeurig is.

van pyspark.ml.evaluation import BinaryClassificationEvaluator

# bel de BinaryClassificationEvaluator

resultaten = BinaryClassificationEvaluator(rawPredictionCol= 'voorspelling' ,labelKol= 'Hartinfarct' )

ROC_AUC = resultaten.evalueren(train_results)

afdrukken(ROC_AUC * 100 , '% Nauwkeurigheid' )

Conclusie

U kunt het real-tile classificatieprobleem voorspellen met behulp van het Logistic Regression-model in PySpark. Het verwijderen van de null/ontbrekende waarden is belangrijk omdat ze de modelevaluatie en nauwkeurigheid verminderen. Voorverwerking is een noodzakelijke stap voordat een machine learning-model wordt aangepast. Zorg ervoor dat u deze stap correct en nauwkeurig uitvoert.