ChatBot: Guide du développeur pour la création d’une application Whats Chatbot |

ChatBot: Guide du développeur pour la création d'une application Whats Chatbot |

Tout au long de cet article, vous deviendrez bon pour repérer, comprendre et imputer les données manquantes. Nous démontrons diverses techniques d’imputation sur une tâche de régression logistique du monde réel en utilisant Python. Une gestion appropriée des données manquantes a un effet amélioré sur les inférences et les prévisions. Cela ne doit pas être ignoré.

La première partie de cet article présente le cadre de compréhension des données manquantes. Plus tard, nous démontrons les stratégies les plus populaires pour faire face à la disparition d’une tâche de classification afin de prédire l’apparition du diabète.

Les données manquantes sont difficiles à éviter

Une partie considérable du travail de science des données ou d’apprentissage automatique est le nettoyage des données. Souvent, lorsque des données sont collectées, certaines valeurs manquantes apparaissent dans l’ensemble de données.

Pour comprendre la raison pour laquelle les données sont manquantes, simulons un ensemble de données avec deux prédicteurs x1, x2et une variable de réponse y.

Nous allons pratiquement manquer certaines données pour illustrer diverses raisons pour lesquelles de nombreux ensembles de données du monde réel peuvent contenir des valeurs manquantes.

données manquantes

Il y a 3 principaux types de valeurs manquantes à prendre en compte.

Manquant complètement au hasard (MCAR)

MCAR se produit lorsque la probabilité de valeurs manquantes dans une variable est la même pour tous les échantillons.

Par exemple, lorsqu’une enquête est menée et que des valeurs ont été omises au hasard lors de la saisie dans l’ordinateur ou qu’un répondant a choisi de ne pas répondre à une question.

Il n’y a aucun effet de MCAR sur les inférences faites par un modèle formé sur ces données.

Pour illustrer MCAR, nous supprimons au hasard la moitié des valeurs de x1 comme suit.

## Missing Completely at Random (MCAR) # randomly mark half of x1 samples as missing MCAR
# independend of any information recorded
idx_mcar= np.random.choice([0, 1], size=(100,)) == 1 plt.scatter(x1,y, label='data')
plt.scatter(x1[idx_mcar],y[idx_mcar], label='missing (MCAR)', color='red')
plt.xlabel('x1')
plt.ylabel('y')
plt.legend()
plt.title('Missing Completely at Random (MCAR)');
données manquantes

Les échantillons x1 (marqués en rouge), qui manquent complètement au hasard (MCAR), ne dépendent ni des valeurs x1 ni des valeurs d’aucune autre variable mesurée.

Manquant au hasard (MAR)

La probabilité de valeurs manquantes, au hasard, dans une variable ne dépend que des informations disponibles dans d’autres prédicteurs.

Par exemple, lorsque les hommes et les femmes répondent à la question «avez-vous déjà pris un congé parental?», Les hommes ont tendance à ignorer la question à un rythme différent de celui des femmes.

Les MAR sont gérés en utilisant les informations des autres prédicteurs pour construire un modèle et imputer une valeur pour l’entrée manquante.

Nous simulons MAR en supprimant x1 valeurs selon x2 valeurs. Quand x2 a la valeur 1, puis la valeur correspondante x1 est manquant.

## Missing at Random (MAR) # randomly mark half of x1 samples as missing MAR
# depending on value of recorded predictor x2 idx_mar = x2 == 1 fig, ax = plt.subplots(1,2,figsize=(15,5))
ax[0].scatter(x1, y, label='data')
ax[0].scatter(x1[idx_mar], y[idx_mar], label='missing', color='red')
ax[0].set_xlabel('x1')
ax[0].set_ylabel('y')
ax[0].legend()
ax[0].set_title('Missing at Random (MAR)');
ax[1].vlines(x1[x2 == 1], 0, 1, color='black')
ax[1].set_xlabel('x1')
ax[1].set_ylabel('x2')
ax[1].set_title('dependent predictor - measured');
données manquantes

Les échantillons x1 (marqués en rouge), qui sont manquants au hasard (MAR), sont liés aux valeurs d’une autre variable dépendante et mesurée (x2) à l’intérieur de l’ensemble de données. Lorsque x2 a la valeur booléenne 1, alors x1 est manquant.

Manquant pas au hasard (MNAR)

La probabilité de valeurs manquantes, pas au hasard, dépend des informations qui n’ont pas été enregistrées, et ces informations prédisent également les valeurs manquantes.

Par exemple, dans une enquête, les tricheurs sont moins susceptibles de répondre lorsqu’on leur demande s’ils ont déjà triché.

Les MNAR sont presque impossibles à gérer.

Heureusement, MNAR ne devrait avoir aucun effet sur les inférences faites par un modèle formé à ces données.

En supposant qu’il existe une variable hypothétique x3 qui n’a pas été mesuré, mais qui détermine x1 valeurs manquantes, nous pouvons simuler MNAR comme suit.

## Missing Not at Random (MNAR) # randomly mark half of x1 samples as missing MNAR
# depending on unrecorded predictor x3
x3 = np.random.uniform(0, 1, 100)
idx_mnar = x3 > .5 fig, ax = plt.subplots(1,2,figsize=(15,5))
ax[0].scatter(x1, y, label='data')
ax[0].scatter(x1[idx_mnar], y[idx_mnar], label='missing', color='red')
ax[0].set_xlabel('x1')
ax[0].set_ylabel('y')
ax[0].legend()
ax[0].set_title('Missing Not at Random (MNAR)');
ax[1].scatter(x1, x3, color='black')
ax[1].axhline(.5, -3, 3)
ax[1].set_xlabel('x1')
ax[1].set_ylabel('x3')
ax[1].set_title('dependent predictor - not measured');
données manquantes

Les échantillons x1 (marqués en rouge), qui ne manquent pas au hasard (MNAR), sont liés aux valeurs d’une autre variable dépendante (x3) en dehors de l’ensemble de données. Lorsque x3 est supérieur à 0,5, la valeur x1 est manquante.

Aimez-vous ce contenu éducatif approfondi sur l’apprentissage automatique appliqué? Abonnez-vous à notre liste de diffusion Enterprise AI pour être alerté lorsque nous publierons de nouveaux documents.

3 principales approches pour compenser les valeurs manquantes

Il n’est généralement pas possible de déterminer si des données manquent au hasard ou si la disparité dépend de prédicteurs non observés ou des données manquantes elles-mêmes.

En pratique, l’hypothèse manquante au hasard est raisonnable.

Plusieurs approches différentes pour imputer les valeurs manquantes se trouvent dans la littérature:

1. Imputation utilisant la valeur zéro, moyenne, médiane ou la plus fréquente

Cela fonctionne en imputant toutes les valeurs manquantes avec zéro, les signifier ou médian pour les variables quantitatives, ou valeur la plus courante pour les variables catégorielles.

De plus, nous pouvons créer une nouvelle variable qui est un indicateur de manque et l’inclut dans le modèle pour prédire la réponse. Cela se fait après avoir branché la valeur zéro, moyenne, médiane ou la plus fréquente dans la variable réelle.

2. Imputation utilisant une valeur choisie au hasard

Cela fonctionne en sélectionnant au hasard une entrée observée dans la variable et en l’utilisant pour imputer les valeurs manquantes.

3. Imputation avec un modèle

Cela fonctionne en remplaçant les valeurs manquantes par des valeurs prédites à partir d’un modèle basé sur les autres prédicteurs observés.

le k L’algorithme du plus proche voisin est souvent utilisé pour imputer une valeur manquante en fonction de sa ressemblance avec les points de l’ensemble d’apprentissage.

Imputation basée sur un modèle avec incertitude fonctionne en remplaçant les valeurs manquantes par des valeurs prédites plus le caractère aléatoire d’un modèle basé sur les autres prédicteurs observés.

Imputation progressive basée sur un modèle utilise des valeurs manquantes imputées précédemment pour prédire d’autres valeurs manquantes.

Des méthodes supplémentaires incluent l’imputation par régression stochastique, les imputations multiples, le Datawig, l’imputation à chaud, l’extrapolation, l’interpolation, la suppression par liste.

données manquantes

Il ne manque rien ici – Image de Nika Akin sur Pixabay

Un guide pratique pour gérer les valeurs manquantes

Décrire les données

Dans les sections suivantes, nous allons utiliser le Le diabète chez les Indiens Pima ensemble de données à trouver ici.

Cet ensemble de données décrit les données des dossiers médicaux des patients des Indiens Pima et s’ils ont eu un début de diabète dans les cinq ans.

Il s’agit d’un problème de classification binaire (début du diabète à 1 ou non à 0).

Les variables d’entrée qui décrivent chaque patient sont numériques et ont des échelles variables.

La liste ci-dessous montre les huit attributs plus la variable cible pour l’ensemble de données:

  • Le nombre de fois où la patiente était enceinte.
  • Concentration plasmatique de glucose de 2 heures toutes les 2 heures dans un test de tolérance au glucose par voie orale.
  • Pression artérielle diastolique (mm Hg).
  • Épaisseur du pli cutané du triceps (mm).
  • Insuline sérique de 2 heures (mu U / ml).
  • Indice de masse corporelle.
  • Fonction pedigree du diabète.
  • Années d’âge).
  • Résultat (1 pour l’apparition précoce du diabète dans les cinq ans, 0 pour non).
import pandas as pd pima_df = pd.read_csv('pima-indians-diabetes.csv') response = 'Outcome'
predictors = pima_df.columns.difference([response]).values pima_df.describe()

données manquantes

Les données ont 764 observations et 9 caractéristiques. On voit immédiatement valeurs étranges pour certains des prédicteurs.

Les grossesses vont jusqu’à 17. Les variables de la pression artérielle, du glucose, de l’épaisseur de la peau, de l’insuline et de l’IMC incluent des zéros, qui sont physiquement invraisemblables.

Nous devrons les gérer d’une manière ou d’une autre.

Signaler correctement les valeurs manquantes

Bien que les valeurs manquantes soient généralement codées à l’aide de NaN, Null ou None, il semble qu’aucune des observations ne soit marquée de cette manière.

données manquantes

Dans un premier temps, nous devrions signaler correctement les valeurs manquantes.

En termes de données manquantes, les variables que nous devons examiner de plus près sont le glucose, la pression artérielle, l’épaisseur de la peau, l’insuline et l’IMC, qui contiennent tous 0 parmi leurs observations.

Une recherche rapide dans la littérature montre que ces caractéristiques ne peuvent pas avoir une valeur physiologique nulle. L’explication la plus plausible est que les observations manquantes ont été en quelque sorte remplacées par zéro.

Ces données manquantes déguisées pourraient induire en erreur nos tentatives de classification ultérieures. Nous allons nettoyer les données en marquant clairement les valeurs manquantes déguisées comme NaN.

La variable de réponse, qui devrait être codée comme 0 ou 1, contenait des valeurs avec ou} ajoutées aux 0 et aux 1. Il ressemble à une erreur similaire à celles introduites lors de la lecture ou de l’écriture de CSV qui ont trouvé leur chemin dans les données. La solution que nous choisissons est simplement de supprimer les caractères.

En examinant les types de données, les prédicteurs sont stockés sous forme de flottant et la réponse sous forme d’objet. Le type de données float est logique pour l’IMC et DiabetesPedigreeFunction. Les fonctionnalités restantes peuvent être stockées sous forme d’entiers.

La fonction suivante nettoie les données et remplace les zéros par des NaN pour les cinq colonnes discutées: Glucose, BloodPressure, SkinThickness, Insulin, et BMI.

def clean_data(df_raw, cols_with_zeros=['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI'], response = ['Outcome']): df = df_raw.copy() # replace zero with NaN in features df[cols_with_zeros] = df[cols_with_zeros].replace(0, np.nan) # remove and } from response df = df.replace(to_replace=r'|}', value='', regex=True) # change response data type to int df[response] = df[response].astype('int') return df pima_df_cleaned = clean_data(pima_df)
pima_df_cleaned.head()

données manquantes

Nous avons remplacé tout zéro et indiqué les valeurs manquantes par NaN.

Explorer les valeurs manquantes

Nous pouvons maintenant calculer la proportion de valeurs manquantes pour chaque caractéristique: 48,56% d’insuline, 29,58% de SkinThickness, 4,58% de BloodPressure, 1,43% d’IMC et 0,65% de glucose. Les fonctionnalités restantes n’ont aucune valeur manquante.

print("Proportion of missing values")
missing_values_count = pima_df_cleaned.isna().sum()*100/pima_df_cleaned.shape[0]
features_with_missing_values = missing_values_count[missing_values_count>0].index.values
missing_values_count

données manquantes

Dans un deuxième temps, nous devrons peut-être effectuer des tests statistiques de l’hypothèse que les caractéristiques sont manquantes au hasard (MAR), complètement manquantes au hasard (MCAR) ou manquantes pas au hasard (MNAR).

En y regardant de plus près, il semble que les valeurs manquantes pour SkinThickness soient corrélées avec les valeurs manquantes pour l’insuline. Lorsque SkinThickness est manquant, l’insuline est également manquante.

De plus, lorsque la pression artérielle ou l’IMC est manquant, la probabilité est plus élevée que les valeurs d’insuline ou d’épaisseur de peau soient également manquantes.

données manquantes

Dans un troisième temps, nous explorons et choisissons la technique la plus appropriée pour gérer les valeurs manquantes.

Stratégies de gestion des données manquantes

Nous allons de l’avant en fournissant une fonction Python où les stratégies d’imputation de données suivantes sont mises en œuvre.

le stratégie d’abandon supprime toutes les observations où au moins une des entités a une valeur manquante (NaN).

le stratégie moyenne remplace toute valeur manquante (NaN) par la moyenne de toutes les valeurs disponibles pour cette fonction.

le stratégie médiane et stratégie la plus fréquente remplacer les valeurs manquantes par la médiane ou les valeurs les plus fréquentes, respectivement.

le stratégie basée sur un modèle utilise les fonctionnalités sans valeurs manquantes pour l’apprentissage des modèles de régression kNN.

Nous choisissons kNN afin de saisir la variabilité des données disponibles. Ce ne serait pas le cas si nous utilisions un modèle de régression linéaire qui prédirait les valeurs manquantes le long d’une ligne de régression.

Nous distinguons deux modes dans cette stratégie basée sur un modèle. Les fonctionnalités suivantes sont utilisées comme prédicteurs dans mode simple: Age, DiabètePedigreeFunction, Outcome, Pregnancies. Le modèle ajusté est utilisé pour prédire les valeurs manquantes dans les entités restantes.

dans le mode progressif, après avoir rempli les valeurs manquantes dans une entité donnée, nous considérons l’entité comme un prédicteur pour estimer les valeurs manquantes de l’entité suivante.

Les données imputées peuvent éventuellement être normalisées entre 0 et 1. Cela pourrait améliorer les performances de la classification en utilisant une régression logistique régularisée.

Étant donné que les caractéristiques sont sur une échelle différente (par exemple, âge vs insuline) et que leur plage de valeurs diffère (par exemple, Pedigree vs insuline), la pénalité de retrait pourrait être mal calculée si les caractéristiques ne sont pas mises à l’échelle.

données manquantes

Apparition du diabète? Photo de Myriam sur Pixabay

Régression logistique avec données manquantes

Dans cette section, nous ajustons un modèle de régression logistique sur les données nettoyées après avoir appliqué une stratégie d’imputation spécifique:

  • supprimer des lignes avec des valeurs manquantes,
  • supprimer des colonnes avec des valeurs manquantes,
  • imputation des valeurs manquantes avec la moyenne des colonnes,
  • imputation de valeurs manquantes avec une prédiction basée sur un modèle,
  • imputation des valeurs manquantes avec une prédiction progressive basée sur un modèle.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionCV
from sklearn.metrics import accuracy_score
from timeit import default_timer as timer # function for handling missing values # and fitting logistic regression on clean data
def logistic_regression(data, impute_strategy=None, cols_to_standardize=None, test_size=0.25, random_state=9001): start = timer() # store original columns original_columns = data.columns.difference(['Outcome']) df_imputed = impute_data(data, impute_strategy, cols_to_standardize) train_data, test_data = train_test_split(df_imputed, test_size=test_size, random_state=random_state) # note which predictor columns were dropped or kept kept_columns = df_imputed.columns.difference(['Outcome']) dropped_columns = original_columns.difference(df_imputed.columns) original_columns = original_columns.difference(['Outcome']) # prepare tensors X_train = train_data.drop(columns=['Outcome']) y_train = train_data['Outcome'] X_test = test_data.drop(columns=['Outcome']) y_test = test_data['Outcome'] # model training logistic_model = LogisticRegressionCV(cv=10, penalty='l2', max_iter=1000).fit( X_train, y_train) # model evaluation train_score = accuracy_score(y_train, logistic_model.predict(X_train)) test_score = accuracy_score(y_test, logistic_model.predict(X_test)) duration = timer() - start print("Classification rate on training data: {}".format(train_score)) print("Classification rate on test data: {}".format(test_score)) print("Execution time: {}".format(duration)) return { 'imputation strategy': impute_strategy, 'standardized': cols_to_standardize!=None, 'model': logistic_model, 'train score': train_score, 'test score': test_score, 'execution time (s)': duration } # list to store models' performance lr_results = [] # prepare data
pima_df_cleaned = clean_data(pima_df)
cols_to_standardize=['Age','BMI','BloodPressure','Glucose','Insulin','Pregnancies','SkinThickness','DiabetesPedigreeFunction'] # fit logistic regression for each imputation strategy
# with and without standardizing features
for impute_strategy in ['drop_rows', 'mean', 'model_basic', 'model_progressive']: for cols in [None, cols_to_standardize]: result = logistic_regression(pima_df_cleaned, impute_strategy=impute_strategy, cols_to_standardize=cols) lr_results.append(result) # display logistic regression performance
lr_results_df = pd.DataFrame(lr_results)
lr_results_df.drop(['model'], axis=1).drop_duplicates()

Il convient de noter l’effet significatif que l’imputation apporte aux valeurs des paramètres estimés et à leur précision.

données manquantes

Effet de la stratégie d’abandon sur la précision

En supprimant des lignes ou des colonnes avec des valeurs manquantes, nous perdons des informations précieuses qui pourraient avoir un impact significatif sur la variable de réponse.

La conséquence est un surajustement dans le jeu de données d’apprentissage et une pire performance de prédiction sur le jeu de données de test.

Effet de l’imputation moyenne / modèle sur la précision

L’imputation moyenne des données manquantes réduit le surajustement et améliore la prédiction sur l’ensemble de données de test.

La classification est la meilleure lorsqu’un modèle est utilisé pour imputer les données manquantes. En effet, la variance d’origine des données est mieux approchée lors de l’utilisation de k voisins les plus proches en remplacement des données manquantes.

Effet de l’imputation sur le temps de formation

La complexité de calcul est évaluée en mesurant le temps d’exécution cumulé de l’imputation, l’ajustement du modèle de régression logistique et la prédiction.

Le temps d’exécution de l’approche basée sur un modèle est le plus élevé lorsque les prédicteurs ne sont pas standardisés. Le calcul de la distance euclidienne aux voisins les plus proches nécessite plus de temps d’exécution que le calcul de la moyenne des données.

Lorsque nous traitons un très grand nombre d’observations, nous pourrions préférer l’imputation moyenne au prix d’une précision de classification inférieure.

Effet de l’imputation sur l’inférence

Nous récupérons les coefficients estimés par nos modèles de régression logistique régularisée comme suit.

# get index of strategies
lr_results_df = pd.DataFrame(lr_results)
strategies = lr_results_df['imputation strategy'] # get a boolean array where True => standardized
standardized = lr_results_df['standardized']
st = lambda s: ' standardized' if s else ''
coefs_ = {}
for key, value in enumerate(strategies): if value == 'drop_cols': # skip pass else: strategy = value + st(standardized[key]) coefs_[strategy] = lr_results_df['model'][key].coef_[0]
coef_df = pd.DataFrame(data=coefs_, index=predictors)
coef_df.T

données manquantes

Les coefficients du tableau montrent comment chaque prédicteur affecte la probabilité d’apparition du diabète.

Des valeurs positives indiquent des facteurs en faveur de l’apparition du diabète.

Des valeurs proches de zéro suggèrent que les prédicteurs associés ne contribuent pas beaucoup à l’apparition du diabète.

Le tableau montre les coefficients inférés après avoir appliqué une stratégie d’imputation pour les données manquantes. Des coefficients sont également fournis tels qu’ils sont obtenus par ajustement de régression logistique sur des valeurs de prédicteurs normalisés (après imputation).

  • Les coefficients standardisés globaux sont plus importants.
  • Lorsque des lignes / colonnes sont supprimées, les estimations des coefficients changent considérablement, par rapport à leurs valeurs lorsque les données manquantes sont imputées par la moyenne ou le modèle.
  • Les coefficients pour l’insuline ne varient pas beaucoup entre les méthodes d’imputation. L’insuline avait le pourcentage le plus élevé de valeurs manquantes entre tous les prédicteurs. Cela suggère que l’insuline pourrait manquer complètement au hasard (MCAR).

Le tableau suivant compare l’effet de l’imputation moyenne et de l’imputation basée sur un modèle sur l’amplitude du coefficient obtenu après la suppression de lignes avec des données manquantes.

coef_perc_df = coef_df.copy()
cols = coef_df.columns.difference(['drop_rows']).values
for col in cols: coef_perc_df[col] = np.round(100*(coef_df[col]/coef_df['drop_rows']-1))
coef_perc_df[['drop_rows','mean','model_basic','model_progressive']]

données manquantes

La première colonne montre les estimations de coefficient pour le modèle logistique formé sur les données où les lignes avec des valeurs manquantes ont été supprimées.

Les autres colonnes montrent la variation en pourcentage des valeurs des coefficients après imputation des valeurs manquantes, par rapport à la stratégie de baisse.

L’âge, la tension artérielle et la fonction Pedigree présentent le pourcentage de variation le plus élevé entre les lignes de chute et les imputations moyennes / basées sur le modèle.

La stratégie d’abandon n’est généralement pas la voie d’or.

données manquantes

Coloriage De Sophie Madeleine

Conclusion

Dans cet article, nous avons montré comment le nettoyage des données et la gestion des valeurs manquantes signifieraient de bien meilleures performances des algorithmes d’apprentissage automatique.

La différenciation entre les types de données manquantes MCAR, MAR, MNAR est essentielle car elles peuvent affecter de manière significative les inférences et les prévisions.

Bien qu’il n’existe aucun moyen idéal pour gérer les données manquantes, vous devez être conscient des différentes méthodes disponibles.

Compenser les données manquantes et tirer parti des informations qui en découlent est l’une des parties chronophages du travail d’un Data Scientist.

Un modèle pour les voitures autonomes qui a appris d’un ensemble de formation insuffisamment diversifié est un exemple intéressant. Si la voiture ne sait pas où il y a un piéton sur la route, nous nous attendons à ce qu’elle laisse le conducteur prendre les choses en main.

Cet article a été initialement publié dans le Medium et republié sur TOPBOTS avec la permission de l’auteur.

Vous aimez cet article? Inscrivez-vous pour plus de mises à jour sur le ML appliqué.

Nous vous informerons lorsque nous publierons plus de formation technique.

ChatBot: Guide du développeur pour la création d'une application Whats Chatbot |

#Guide #développeur #pour #création #dune #application #Whats #