Régression logistique – Un tutoriel complet avec des exemples en R

La régression logistique est un algorithme de modélisation prédictive qui est utilisé lorsque la variable Y est catégorique binaire. C’est-à-dire qu’elle ne peut prendre que deux valeurs comme 1 ou 0. L’objectif est de déterminer une équation mathématique qui peut être utilisée pour prédire la probabilité de l’événement 1. Une fois l’équation établie, elle peut être utilisée pour prédire le Y lorsque seuls les X�s sont connus.

Régression logistique – Un tutoriel complet avec des exemples en R Contenu1. Introduction à la régression logistique
2. Quelques exemples réels de problèmes de classification binaire
3. Pourquoi pas la régression linéaire ?
4. L’équation logistique
5. Comment construire un modèle de régression logistique en R ?
6. Comment gérer le déséquilibre de classe ?
7. Comment gérer le déséquilibre de classe avec l’Upsample et le Downsample ?
8. Construction du modèle de régression logistique
9. Comment prédire sur le jeu de données de test
10. Pourquoi le traitement avec le déséquilibre de classe est important?
11. Conclusion

1. Introduction à la régression logistique

Vous avez vu précédemment ce qu’est la régression linéaire et comment l’utiliser pour prédire des variables Y continues.

Dans la régression linéaire, la variable Y est toujours une variable continue. Si supposons, la variable Y était catégorique, vous ne pouvez pas utiliser la régression linéaire pour la modéliser.

Alors, que feriez-vous lorsque la Y est une variable catégorique avec 2 classes ?

La régression logistique peut être utilisée pour modéliser et résoudre de tels problèmes, également appelés problèmes de classification binaire.

Un point clé à noter ici est que Y ne peut avoir que 2 classes et pas plus que cela. Si Y a plus de 2 classes, cela deviendrait une classification multi-classes et vous ne pouvez plus utiliser la régression logistique vanille pour cela.

Pour autant, la régression logistique est une technique classique de modélisation prédictive et reste toujours un choix populaire pour modéliser les variables catégorielles binaires.

Un autre avantage de la régression logistique est qu’elle calcule un score de probabilité de prédiction d’un événement. Plus sur cela quand vous commencez réellement à construire les modèles.

Quelques exemples du monde réel de problèmes de classification binaire

Vous pourriez vous demander pour quel genre de problèmes vous pouvez utiliser la régression logistique.

Voici quelques exemples de problèmes de classification binaire :

  • Détection de pourriels : Prédire si un courriel est un pourriel ou non
  • Fraude par carte de crédit : Prédire si une transaction par carte de crédit donnée est frauduleuse ou non
  • Santé : Prédire si une masse donnée de tissu est bénigne ou maligne
  • Marketing : Prédire si un utilisateur donné achètera un produit d’assurance ou non
  • Banque : Prédire si un client fera défaut sur un prêt.

Pourquoi pas la régression linéaire ?

Lorsque la variable de réponse n’a que 2 valeurs possibles, il est souhaitable d’avoir un modèle qui prédit la valeur soit comme 0 ou 1 ou comme un score de probabilité qui varie entre 0 et 1.

La régression linéaire n’a pas cette capacité. Parce que, Si vous utilisez la régression linéaire pour modéliser une variable de réponse binaire, le modèle résultant peut ne pas restreindre les valeurs Y prédites entre 0 et 1.

Régression linéaire contre régression logistique

C’est là que la régression logistique entre en jeu. Dans la régression logistique, vous obtenez un score de probabilité qui reflète la probabilité de l’occurrence de l’événement.

Un événement dans ce cas est chaque ligne de l’ensemble de données de formation. Cela pourrait être quelque chose comme classer si un email donné est un spam, ou une masse de cellule est maligne ou un utilisateur va acheter un produit et ainsi de suite.

L’équation logistique

La régression logistique réalise cela en prenant les chances logarithmiques de l’événement ln(P/1?P), où, P est la probabilité de l’événement. Donc, P se situe toujours entre 0 et 1.

Prendre l’exposant des deux côtés de l’équation donne :

Vous pouvez mettre en œuvre cette équation en utilisant la fonction glm() en définissant l’argument family à "binomial".

Aussi, une mise en garde importante est de s’assurer que vous définissez le type="response" lorsque vous utilisez la fonction predict sur un modèle de régression logistique. Sinon, elle prédit la probabilité logarithmique de P, c’est-à-dire la valeur Z, au lieu de la probabilité elle-même.

Comment construire un modèle de régression logistique dans R?

Voyons maintenant comment mettre en œuvre une régression logistique en utilisant le jeu de données BreastCancer dans le paquet mlbench. Vous devrez installer le paquet mlbench pour cela.

Le but ici est de modéliser et de prédire si un spécimen donné (ligne dans le jeu de données) est benign ou malignant, en fonction de 9 autres caractéristiques de cellules. Chargeons donc les données et ne gardons que les cas complets.

Données sur le cancer du sein

Le jeu de données comporte 699 observations et 11 colonnes. La colonne Class est la variable de réponse (dépendante) et elle indique si un tissu donné est malin ou bénin.

Vérifions la structure de cet ensemble de données.

À l’exception de Id, toutes les autres colonnes sont des facteurs. C’est un problème lorsque vous modélisez ce type de données.

Parce que, lorsque vous construisez un modèle logistique avec des variables de facteurs comme caractéristiques, il convertit chaque niveau du facteur en une variable binaire fictive de 1 et de 0.

Par exemple, la forme de la cellule est un facteur avec 10 niveaux. Lorsque vous utilisez glm pour modéliser la classe en fonction de la forme de la cellule, la forme de la cellule sera divisée en 9 variables catégorielles binaires différentes avant de construire le modèle.

Si vous devez construire un modèle logistique sans faire aucune étape préparatoire, alors voici ce que vous pourriez faire. Mais nous n’allons pas suivre cela car il y a certaines choses à prendre en charge avant de construire le modèle logit.

La syntaxe pour construire un modèle logit est très similaire à la fonction lm que vous avez vue dans la régression linéaire. Vous devez seulement définir le family='binomial' pour glm pour construire un modèle de régression logistique.

glm signifie modèles linéaires généralisés et il est capable de construire de nombreux types de modèles de régression en plus de la régression linéaire et logistique.

Voyons à quoi pourrait ressembler le code pour construire un modèle logistique. Je reviendrai sur cette étape plus tard car il y a des étapes de prétraitement à effectuer avant de construire le modèle.

Dans le modèle ci-dessus, Class est modélisé comme une fonction de Cell.shape seul.

Mais notez à partir de la sortie, le Cell.Shape a été divisé en 9 variables différentes. C’est parce que, puisque Cell.Shape est stocké comme une variable de facteur, glm crée 1 variable binaire (a.k.a. une variable factice) pour chacun des 10 niveaux catégoriels de Cell.Shape.

De toute évidence, à partir de la signification de Cell.Shape, il semble y avoir une sorte d’ordre dans les niveaux catégoriels de Cell.Shape. C’est-à-dire qu’une valeur de forme de cellule de 2 est supérieure à la forme de cellule 1 et ainsi de suite.

C’est également le cas pour d’autres variables de l’ensemble de données. Donc, il est préférable de les convertir en variables numériques et de supprimer la colonne id.

S’il s’agissait d’une pure variable catégorielle sans ordre interne, comme, par exemple, le sexe du patient, vous pouvez laisser cette variable comme un facteur lui-même.

# remove id columnbc <- bc# convert factors to numericfor(i in 1:9) { bc <- as.numeric(as.character(bc))}

Another important point to note. When converting a factor to a numeric variable, you should always convert it to character and then to numeric, else, the values can get screwed up.

Now all the columns are numeric.

Also I’d like to encode the response variable into a factor variable of 1’s and 0’s. Though, this is only an optional step.

So whenever the Class is malignant, it will be 1 else it will be 0. Then, I am converting it into a factor.

bc$Class <- ifelse(bc$Class == "malignant", 1, 0)bc$Class <- factor(bc$Class, levels = c(0, 1))

The response variable Class is now a factor variable and all other columns are numeric.

Alright, the classes of all the columns are set. Let’s proceed to the next step.

How to deal with Class Imbalance?

Before building the logistic regressor, you need to randomly split the data into training and test samples.

Since the response variable is a binary categorical variable, you need to make sure the training data has approximately equal proportion of classes.

table(bc$Class)#> benign malignant #> 444 239

Les classes ‘bénigne’ et ‘maligne’ sont divisées approximativement dans un rapport de 1:2.

Il y a clairement un déséquilibre de classe. Donc, avant de construire le modèle logit, vous devez construire les échantillons de telle sorte que les 1 et les 0 soient dans des proportions approximativement égales.

Ce souci est normalement traité avec un couple de techniques appelées :

  • Down Sampling
  • Up Sampling
  • Échantillonnage hybride utilisant SMOTE et ROSE.

Alors, qu’est-ce que l’échantillonnage descendant et l’échantillonnage ascendant ?

7. Comment gérer le déséquilibre de classe avec le suréchantillonnage et le sous-échantillonnage

Dans l’échantillonnage descendant, la classe majoritaire est aléatoirement sous-échantillonnée pour être de la même taille que la classe plus petite. Cela signifie que, lors de la création de l’ensemble de données d’entraînement, les lignes avec la classe bénigne seront choisies moins de fois pendant l’échantillonnage aléatoire.

De même, dans l’échantillonnage vers le haut, les lignes de la classe minoritaire, c’est-à-dire malignant sont échantillonnées de façon répétée jusqu’à ce qu’elles atteignent la même taille que la classe majoritaire (benign).

Mais dans le cas de l’échantillonnage hybride, des points de données artificiels sont générés et sont systématiquement ajoutés autour de la classe minoritaire. Cela peut être mis en œuvre en utilisant les paquets SMOTE et ROSE.

Mais pour cet exemple, je vais montrer comment faire un échantillonnage vers le haut et vers le bas.

Alors laissez-moi créer les données d’entraînement et de test en utilisant le paquet caret.

Dans le snippet ci-dessus, j’ai chargé le paquet caret et utilisé la fonction createDataPartition pour générer les numéros de ligne pour le jeu de données d’entraînement. En définissant p=.70, j’ai choisi que 70% des lignes aillent à l’intérieur de trainData et que les 30% restants aillent à testData.

table(trainData$Class)

Il y a environ 2 fois plus d’échantillons bénins. Alors descendons-le en utilisant la fonction downSample du paquet caret.

Pour ce faire, il suffit de fournir les variables X et Y comme arguments.

Les bénins et les malins sont maintenant dans le même ratio.

La %ni% est la négation de la fonction %in% et je l’ai utilisée ici pour sélectionner toutes les colonnes sauf la colonne Class.

La fonction downSample nécessite le ‘y’ comme variable facteur, c’est la raison pour laquelle j’avais converti la classe en facteur dans les données originales.

Génial ! Maintenant, laissez-moi faire le suréchantillonnage en utilisant la fonction upSample. Elle suit une syntaxe similaire à celle de downSample.

Comme prévu, bénin et malin sont maintenant dans le même ratio.

J’utiliserai la version downSampled de l’ensemble de données pour construire le modèle logit dans l’étape suivante.

Construction du modèle de régression logistique

Comment prédire sur l’ensemble de données de test

Le logitmod est maintenant construit. Vous pouvez maintenant l’utiliser pour prédire la réponse sur testData.

pred <- predict(logitmod, newdata = testData, type = "response")

Maintenant, pred contient la probabilité que l’observation soit maligne pour chaque observation.

Notez que, lorsque vous utilisez la régression logistique, vous devez définir type='response' afin de calculer les probabilités de prédiction. Cet argument n’est pas nécessaire dans le cas de la régression linéaire.

La pratique courante est de prendre le seuil de probabilité à 0,5. Si la probabilité de Y est > 0,5, alors on peut classer un événement (malin).

Donc si la prédiction est supérieure à 0,5, il est malin sinon il est bénin.

y_pred_num <- ifelse(pred > 0.5, 1, 0)y_pred <- factor(y_pred_num, levels=c(0, 1))y_act <- testData$Class

Calculons la précision, qui n’est rien d’autre que la proportion de y_pred qui correspond à y_act.

mean(y_pred == y_act) 

Vous avez là un taux de précision de 94%.

Pourquoi traiter avec le déséquilibre de classe est important ?

D’accord j’ai promis que je vous dirai pourquoi vous devez vous occuper du déséquilibre de classe plus tôt. Pour comprendre cela, supposons que vous avez un ensemble de données où 95% des valeurs Y appartiennent à la classe bénigne et 5% à la classe maligne.

Si j’avais juste prédit aveuglément tous les points de données comme étant bénins, j’obtiendrais un pourcentage de précision de 95%. Ce qui semble assez élevé. Mais évidemment, c’est imparfait. Ce qui compte, c’est la façon dont vous prédisez les classes malignes.

Donc cela nécessite que les classes bénignes et malignes soient équilibrées ET en plus de cela, j’ai besoin de mesures de précision plus raffinées et de métriques d’évaluation du modèle pour améliorer mon modèle de prédiction.

Code complet

Conclusion

Dans ce post, vous avez vu quand et comment utiliser la régression logistique pour classer des variables de réponse binaires dans R.

Vous avez vu cela avec un exemple basé sur le jeu de données BreastCancer où l’objectif était de déterminer si une masse donnée de tissu est maligne ou bénigne.

Construire le modèle et classer le Y n’est que la moitié du travail effectué. En fait, même pas la moitié. Car, le champ des métriques d’évaluation pour juger de l’efficacité du modèle est vaste et nécessite un jugement attentif pour choisir le bon modèle. Dans la prochaine partie, j’aborderai diverses métriques d’évaluation qui permettront de comprendre la performance du modèle de classification sous différents angles.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.