Régression logistique PySpark

Regression Logistique Pyspark



Dans ce guide PySpark, nous expliquerons comment effectuer la régression logistique pour prédire si une personne est affectée par un AVC ou non. En général, un accident vasculaire cérébral survient lorsqu'une personne est accro à la fumée ou à la boisson. D'autres raisons comme les maladies cardiaques et les niveaux élevés de glucose dans le sang (diabète) provoquent également des accidents vasculaires cérébraux. Avec l'aide du modèle Logistic Regression Machine Learning, nous allons prédire et montrer la précision de notre modèle sur les données de l'échantillon.

Dans ce guide, nous allons d'abord voir la démarche puis prédire l'AVC de chaque personne en analysant pas à pas les données.

Régression logistique

La régression logistique, également appelée « modèle Logit », est utilisée dans l'analyse prédictive pour les problèmes de classification. Il s'agit d'un modèle de Machine Learning qui ne fonctionne que sur la classification pour classer les classes (catégories). Par exemple, il y a deux catégories dans notre scénario (une personne affectée par un AVC et une personne qui n'est pas affectée par un AVC). Les meilleures applications du modèle sont la prédiction des maladies cardiaques, la prédiction du sexe, la prédiction de la durée de vie des cultures, etc.







Pas:

1. Collecte de données : Les données sont nécessaires pour effectuer des prévisions/analyses. Il peut être sous forme de CSV/XLSX, entre autres. Nous pouvons le charger dans l'environnement Spark (DataFrame) à l'aide de la méthode spark.read.csv().



2. Analyse des données : L'analyse des attributs/colonnes est appelée « analyse des données ». Les colonnes qui aident à prédire la classe sont appelées 'attributs indépendants'. La colonne qui aboutit à la prédiction est appelée 'attribut dépendant ou cible'. Dans ce scénario, nous pouvons utiliser la propriété columns pour afficher toutes les colonnes. La méthode distinct() est utilisée pour voir les valeurs uniques.



3. Prétraitement des données : Le filtrage des valeurs nulles/manquantes est appelé 'prétraitement'. Nous supprimons toutes les valeurs manquantes à cette étape. La machine ne connaît que le langage binaire. Ainsi, toutes les catégories de chaînes doivent être converties en valeurs catégorielles numériques. Dans PySpark, nous pouvons utiliser le 'StringIndexer' qui est la classe disponible dans le module pyspark.ml.feature pour convertir les catégories de chaînes en numériques. Il les convertit automatiquement en interne. Nous n'avons pas besoin de fournir les valeurs. Vous pouvez utiliser la syntaxe suivante :





indexer_data=StringIndexer(inputCol= 'String_Category_ColumnName' ,sortieCol= 'Nouveau_nom_de_colonne' )

4. Assemblage de vecteur : Maintenant, vous avez les données que la machine peut comprendre. Dans cette étape, tous les attributs indépendants doivent être vectorisés dans une seule colonne. Cela peut être fait en utilisant la classe VectorAssembler. Il prend deux paramètres : Le premier paramètre est le inputCols qui prend une liste d'attributs indépendants. Le deuxième paramètre est le outputCol qui vectorise tous les inputCols dans cette variable.

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

5. Transformation : Maintenant, préparez vos données en transformant les colonnes mises à jour (étape 3) à l'aide de la fonction transform().



assembleur.transform(inxed_data)

6. Préparation des données pour la formation et les tests : Dans cette étape, nous divisons les données en « formation » et « tests ». Ce sera mieux si nous divisons les 70 % de données pour former le modèle et les 30 % de données pour tester le modèle. Ceci peut être réalisé en utilisant la méthode randomSplit(). Il prend une liste qui contient deux valeurs flottantes : une pour le fractionnement du test et une autre pour le fractionnement du train.

train_data,test_data=final_data.select([ 'caractéristiques' ,colonne_cible]).randomSplit([0.70.0.30])

7. Ajustement et évaluation du modèle : Il est temps d'ajuster le modèle de régression logistique. Le modèle de régression logistique est disponible dans le module pyspark.ml.classification. Il prend la colonne étiquette de classe/cible. Cela se traduit par des colonnes rawPrediction, probabilité et prédiction. Nos résultats sont stockés dans la colonne de prédiction.

# Ajustement du modèle

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

# Évaluation du modèle

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Précision et résultats : Il s'agit de la dernière étape où nous testons la précision du modèle à l'aide de toutes les techniques de test.

Regardons le projet suivant où nous prédisons si une personne est affectée par un AVC ou non en utilisant le modèle de régression logistique.

Prédiction d'AVC

9. Installez le module PySpark dans votre environnement. Voici la commande à installer :

pip installer pyspark

10. Créons un PySpark DataFrame avec 10 enregistrements liés aux détails de l'AVC de 10 personnes. Pour la démonstration, nous créons un DataFrame sans CSV. Il y a 7 colonnes dans ce DataFrame. 'Gender', 'Glucose_level', 'married', 'age', 'heart_disease', 'hyper_tension' sont des attributs indépendants et 'Stroke' est l'étiquette de classe ou l'attribut dépendant. Cela signifie que l'AVC d'une personne dépend de ces attributs indépendants.

importer pyspark

depuis pyspark.sql importer SparkSession

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

stoke_data =[

{ 'Genre' : 'Femme' , 'âge' : cinquante , 'cardiopathie' : 'Oui' ,

'hypertension' : 'Oui' , 'marié' : 'Oui' , 'Niveau_de_glycémie' : 130 , 'Accident vasculaire cérébral' : 1 },

{ 'Genre' : 'Homme' , 'âge' : vingt , 'cardiopathie' : 'Non' ,

'hypertension' : 'Oui' , 'marié' : 'Non' , 'Niveau_de_glycémie' : 97 , 'Accident vasculaire cérébral' : 0 },

{ 'Genre' : 'Homme' , 'âge' : 12 , 'cardiopathie' : 'Non' ,

'hypertension' : 'Non' , 'marié' : 'Non' , 'Niveau_de_glycémie' : 98 , 'Accident vasculaire cérébral' : 0 },

{ 'Genre' : 'Femme' , 'âge' : 90 , 'cardiopathie' : 'Non' ,

'hypertension' : 'Non' , 'marié' : 'Oui' , 'Niveau_de_glycémie' : 170 , 'Accident vasculaire cérébral' : 1 },

{ 'Genre' : 'Homme' , 'âge' : 43 , 'cardiopathie' : 'Oui' ,

'hypertension' : 'Oui' , 'marié' : 'Oui' , 'Niveau_de_glycémie' : 150 , 'Accident vasculaire cérébral' : 1 },

{ 'Genre' : 'Femme' , 'âge' : vingt-et-un , 'cardiopathie' : 'Non' ,

'hypertension' : 'Non' , 'marié' : 'Oui' , 'Niveau_de_glycémie' : 110 , 'Accident vasculaire cérébral' : 0 },

{ 'Genre' : 'Femme' , 'âge' : cinquante , 'cardiopathie' : 'Oui' ,

'hypertension' : 'Non' , 'marié' : 'Oui' , 'Niveau_de_glycémie' : 100 , 'Accident vasculaire cérébral' : 0 },

{ 'Genre' : 'Homme' , 'âge' : 3. 4 , 'cardiopathie' : 'Non' ,

'hypertension' : 'Oui' , 'marié' : 'Oui' , 'Niveau_de_glycémie' : 190 , 'Accident vasculaire cérébral' : 1 },

{ 'Genre' : 'Homme' , 'âge' : dix , 'cardiopathie' : 'Non' ,

'hypertension' : 'Non' , 'marié' : 'Non' , 'Niveau_de_glycémie' : 90 , 'Accident vasculaire cérébral' : 0 },

{ 'Genre' : 'Femme' , 'âge' : 56 , 'cardiopathie' : 'Oui' ,

'hypertension' : 'Oui' , 'marié' : 'Oui' , 'Niveau_de_glycémie' : 145 , 'Accident vasculaire cérébral' : 1 }

]

# créer le dataframe à partir des données ci-dessus

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Réel stoke_df

stroke_df.show()

Sortir:

11. Affichez les colonnes indépendantes à l'aide de la méthode select().

# Afficher les attributs indépendants

stroke_df.select(stroke_df[ 'Genre' ],stroke_df[ 'Niveau_de_glycémie' ],stroke_df[ 'marié' ],stroke_df[ 'âge' ],stroke_df[ 'cardiopathie' ],stroke_df[ 'hypertension' ]).montrer()

Sortir:

12. Affichez les valeurs uniques qui sont présentes dans l'attribut cible (Stroke).

# valeurs uniques d'attribut cible

stroke_df.select(stroke_df[ 'Accident vasculaire cérébral' ]).distinct().show()

Sortir:

13. Renvoyez le type de données de toutes les colonnes à l'aide de la fonction printSchema().

# Renvoie le type de données de toutes les colonnes.

stroke_df.printSchema()

Sortir:

Nous pouvons voir que 4 colonnes sont de type chaîne. Convertissons-les en valeurs numériques catégorielles.

14. Convertissons les valeurs catégorielles de chaîne en valeurs catégorielles numériques à l'aide de StringIndexer dans les colonnes 'Gender', 'heart_disease', 'hyper_tension' et 'married' et écrivons-les dans les colonnes Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension et Categotical_married. Stockez les colonnes dans le DataFrame indexed_data à l'aide de la méthode fit().

à partir de pyspark.ml.feature importer StringIndexer

# Convertissez les valeurs catégorielles de chaîne en valeurs catégorielles numériques dans la colonne 'Sexe'.

indexer_data=StringIndexer(inputCol= 'Genre' ,sortieCol= 'Categotical_Gender' )

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

# Convertir les valeurs catégorielles de chaîne en valeurs catégorielles numériques dans la colonne 'heart_disease'.

indexer_data=StringIndexer(inputCol= 'cardiopathie' ,sortieCol= 'Categotical_heart_disease' )

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

# Convertir les valeurs catégorielles de chaîne en valeurs catégorielles numériques dans la colonne 'hyper_tension'.

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

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

# Convertir les valeurs catégorielles de chaîne en valeurs catégorielles numériques dans la colonne 'marié'.

indexer_data=StringIndexer(inputCol= 'marié' ,sortieCol= 'Categotical_married' )

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

# Afficher la mise à jour

indexed_data.show()

Sortir:

15. Convertissez les colonnes indépendantes en un vecteur à l'aide de l'assembleur de vecteurs. Le nom du vecteur est 'fonctionnalités'.

à partir de pyspark.ml.feature importer VectorAssembler

assembleur= VecteurAssembleur(inputCols=[ 'Categotical_Gender' , 'Categotical_heart_disease' , 'Categotical_hyper_tension' , 'Categotical_married' , 'âge' ,

'Niveau_de_glycémie' ],sortieCol= 'caractéristiques' )

16. Transformez les données précédentes en un DataFrame final à l'aide de la fonction transform() et affichez-les à l'aide de la fonction show().

Sortir:

17. Préparez les données pour la formation et les tests en les divisant en 70-30. Les « caractéristiques » sont stockées dans le train_data et « Stroke » est stocké dans le test_data.

# Préparer les données pour la formation et les tests

train_data,test_data=final.select([ 'caractéristiques' , 'Accident vasculaire cérébral' ]).randomSplit([ 0,70 , 0,30 ])

18. Ajustez le modèle de régression logistique et évaluez-le.

à partir de pyspark.ml.classification importer LogisticRegression

# Ajustement du modèle

logistique_regression_model=Régression Logistique(labelCol= 'Accident vasculaire cérébral' ).fit(train_data)

# Évaluation du modèle

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Sortir:

19. Utilisez BinaryClassificationEvaluator pour vérifier la précision du modèle. Nous pouvons voir que notre modèle est précis à 100 %.

à partir de pyspark.ml.evaluation importer BinaryClassificationEvaluator

# appeler le BinaryClassificationEvaluator

résultats = BinaryClassificationEvaluator(rawPredictionCol= 'prédiction' ,labelCol= 'Accident vasculaire cérébral' )

ROC_AUC = résultats.évaluer(train_results)

imprimer(ROC_AUC * 100 , '% Précision' )

Conclusion

Vous pouvez prédire le problème de classification des tuiles réelles à l'aide du modèle de régression logistique dans PySpark. La suppression des valeurs nulles/manquantes est importante car elles diminuent l'évaluation et la précision du modèle. Le prétraitement est une étape nécessaire avant d'adapter un modèle d'apprentissage automatique. Assurez-vous que vous effectuez cette étape correctement et avec précision.