You are currently viewing Problème courant avec l’indice de corrélation et comment y remédier

Problème courant avec l’indice de corrélation et comment y remédier

En machine Learning, l’une des étapes essentielle pour une bonne prédiction est l’étape du feature engineering. Lors de cette étapes plusieurs méthodes sont utilisées pour trouver les meilleurs features parmi l’ensemble de features contenues dans notre data base pour son modèle. En effet, parmi ces techniques, figure l’indice de corrélation couramment utilisée pour trouver une relation entre deux variables quantitatives. Aussi le test de khi2 pour ce qui est des variables qualitatives.

Quel type de relation l’indice de corrélation permet réellement de mesure ?

Comme vous pouvez imaginer l’indice de corrélation ne sert qu’à détecter d’éventuelle relation linéaire entre deux variables quantitatives. Autrement dire, qu’on peut approximer la variable dépendante à l’aide d’un ajustement linéaire des variables indépendantes. Toutefois dans la vie pratique, il n’est pas évident que tout le variable incluant notre base de données soit toute linéairement corrélé avec notre variable à prédire. Dans la suite, nous ferons un exemple afin de mieux illustrer ce problème.

Description data

Nous allons illustrer la relation avec une simulation de données uniforme. En effet, notre features sera une variable suivant une loi uniforme tandis que les targets seront lié avec cette dernière par soit une relation quadratique, sinusoïdale ou encore polynomiale.

In [100]: import pandas as pd,numpy as np
data=pd.DataFrame([np.random.uniform(-5,5)	for i in range(5000)],columns=['features data['targets_quadratique']= data.features**2
data['targets_sinus']= np.sin(data.features)
data['targets_ploly']= data.features**3 + data.features**2 + data.features

Indice de correlation

In [101]: import matplotlib.pyplot as plt
fig,ax=plt.subplots(figsize=(15,10)) plt.subplot(231) plt.scatter(data.features,data.targets_quadratique) plt.xlabel("features")
plt.ylabel("targets") plt.title("representation de y=x**2") plt.subplot(232) plt.scatter(data.features,data.targets_sinus)
 
plt.xlabel("features") plt.ylabel("targets") plt.title("representation de y=sin(x)") plt.subplot(233)
plt.scatter(data.features,data.targets_ploly) plt.xlabel("features")
plt.ylabel("targets") plt.title("representation de y=x**3 +x**2+x")
Out[101]: Text(0.5, 1.0, 'representation de y=x**3 +x**2+x')
In [102]:
Out[102]:	data.corr()	
features	
targets_quadratique	
targets_sinus	\
	features	1.000000	0.002368	-0.228784
	targets_quadratique	0.002368	1.000000	0.000069
	targets_sinus	-0.228784	0.000069	1.000000
	targets_ploly	0.915778	0.143604	-0.522612

features	targets_ploly
0.915778
targets_quadratique	0.143604
targets_sinus	-0.522612
targets_ploly	1.000000
In [104]: import matplotlib.pyplot as plt
sns.set() sns.pairplot(data) plt.savefig('corr.png')

Vous pouvez constater que seule la relation polynomiale est détectée. Pourtant, toutes les variables ont été créé avec le même feature et des relations bien connues de tous. Ceci montre en effet, l’importance de bien comprendre les données. Une alternative à cela est l’utilisation d’autres méthodes servant à trouver des relations non-linéaire entre deux variables. Un Plusieurs méthodes existes notamment, Récursive feature élimination(RFE) , Random forest, Predictive power scores (ppscore) etc… Dans cet article, nous allons prendre comme exemple ppscores

ppscore PPS ou encore prédictive power score est une technique utilisant l’arbre de décision avez une validation croisée pour pouvoir capter d’éventuelle lien entre deux variables qu’elle soit qualitative ou quantitative.

In [106]: #!pip install ppscore
import ppscore as pps import warnings
warnings.filterwarnings("ignore")
 
val_index=pps.matrix(data) val_index

Out[106]:		features	targets_quadratique	targets_sinus	\
	features	1.000000	0.000000	0	
	targets_quadratique	0.998947	1.000000	0	
targets_sinus	0.998659	0.011921	1
targets_ploly	0.998991	0.000000	0

features	targets_ploly
0.999459		
targets_quadratique	0.998947		
targets_sinus	0.998659		
targets_ploly	1.000000		
In [107]: sns.heatmap(val_index,annot=True,fmt='.2f') plt.savefig('pps.png')

Vous pouvez constater que vous arrivez à déceler certaines relations non linéaires qui étaient invisible avec la corrélation. Toutefois, il existe d’autres relation assez difficile à modélisation dont vous aurez à faire recourt à plusieurs algorithmes afin de les détecter. Vous pouvez toutefois, aller en crécha do tout en commençant votre étude par la détection de relation linéaire. Aussi, le type de relation peut vous aider au choix d’algorithme de machine Learning à utiliser.

Armel

ML Engineer

Laisser un commentaire