[PYTHON] Prétraitement des fonctionnalités pour la modélisation

introduction

Notez le "prétraitement des fonctionnalités pour la modélisation" lorsque vous analysez vous-même les données. EDA, etc. des données avant le prétraitement Conseils et précautions lors de l'analyse des données Veuillez vous y référer tel qu'il est décrit dans.

Ce qui est important dans le prétraitement est *** ・ Traitement des valeurs manquantes *** *** ・ Quel est le type de quantité de caractéristiques à prétraiter ***.

Dans cet article


Informations précédentes
Cette fois, je vais vous expliquer en utilisant les données utilisées dans le concours Kaggle. Kaggle House Prices DataSet

Kaggle House Prices Kernel Faites une note en utilisant.

Veuillez noter que nous ne nous soucions pas de la précision du modèle, etc. car nous la conservons pour Memo`


Contenu des données
Il y a 81 caractéristiques en tout, dont SalePrices est utilisée comme variable objective (cible) pour l'analyse. Les variables explicatives sont autres que SalePrices.

Traitement de la valeur manquante

Tout d'abord, vérifiez le contenu des données, et si les données contiennent des valeurs manquantes, il existe deux approches pour éliminer les valeurs manquantes. 1. Supprimez la colonne ou la ligne contenant la valeur manquante. `2. Complétez (remplissez les espaces) avec une autre valeur numérique pour la valeur manquante.

Lorsque vous faites ce qui précède, il est important de noter *** pourquoi les données sont analysées et ce que vous voulez sortir comme sortie ***. Il y a deux raisons possibles pour l'analyse des données. *** La première est la construction d'un modèle qui prédit avec précision la variable objective (cible), et la seconde est la compréhension des données ***. Dans le cas de la construction du premier modèle qui prédit avec une grande précision, si les colonnes et les lignes contenant des valeurs manquantes sont supprimées inutilement, le nombre de données peut être considérablement réduit. On peut dire que ce n'est pas une bonne idée. Par conséquent, il est judicieux de compléter la valeur manquante par une autre valeur numérique. À ce stade, un exemple typique est de compléter avec la valeur moyenne. En revanche, lorsqu'il s'agit de comprendre les données, une sur-modification des données peut conduire à une mauvaise compréhension des données. *** En d'autres termes, lorsqu'il s'agit de valeurs manquantes, ce qui est important lors de l'analyse des données est important. *** ***

Voici le code pour «1. Supprimer les colonnes et les lignes contenant des valeurs manquantes», «2. Compléter (remplir) avec des nombres différents pour les valeurs manquantes».


import pandas as pd

## load Data
df = pd.read~~~~(csv , json etc...)  

## count nan
df.isnull().sum()

スクリーンショット 2020-08-23 17.56.44.png À partir de la figure ci-dessus, on peut voir que les données contiennent cette fois des valeurs manquantes. Maintenant, je voudrais traiter les valeurs manquantes pour * LotFrontage *.

Supprimer les colonnes et les lignes contenant des valeurs manquantes dropna ()

-. dropna (how = "???", axis = (0 ou 1)): how = ??? est tout ou partie, axis = 0 s'il y a lieu, colonne si 1

Le cas échéant, la colonne ou la ligne contenant au moins une valeur manquante est supprimée. En revanche, dans le cas de tous, les colonnes ou lignes où toutes les valeurs sont des valeurs manquantes sont supprimées.

df.dropna(how="any", axis=0)

スクリーンショット 2020-08-23 18.10.55.png

df.dropna(how="all", axis=0)

スクリーンショット 2020-08-23 18.11.35.png

Dans le cas de tout, si une seule valeur manquante est incluse, la valeur d'axe spécifiée est supprimée. Par conséquent, la forme de df est (0,81). Dans le cas de tous, si toutes les valeurs manquantes sont incluses, la valeur d'axe spécifiée est supprimée. Par conséquent, la forme de df est (1460,81).

*** <Supplément> *** Lorsque vous souhaitez supprimer une ligne / colonne qui a une valeur manquante dans une ligne ou une colonne spécifique

-. dropna (subset = ["???"]): Sélectionnez une colonne / ligne spécifique avec un sous-ensemble

df.dropna(subset=["LotFrontage"])

スクリーンショット 2020-08-23 18.20.01.png

En utilisant un sous-ensemble comme argument, si une colonne / ligne spécifique contient une valeur manquante, cette colonne / ligne peut être supprimée. Cet argument peut parfois fonctionner efficacement.

Remplissez les valeurs manquantes avec une autre valeur numérique (remplissez) fillna ()

-. fillna (???, inplace = bool (True of False)): L'objet d'origine peut être modifié en spécifiant fill (fill in) ou en place avec n'importe quelle valeur dans ???

Si inplace = True, il peut être mis à jour sans augmenter la mémoire, mais comme l'objet a été mis à jour, il devient difficile de le réutiliser. .. .. .. .. .. Par conséquent, il est recommandé de créer un nouvel objet pour les données non à grande échelle. (Opinion personnelle ...)

#Remplissez les espaces avec 0 pour NAN.
df.fillna(0)

#Lorsque vous remplissez pour plusieurs colonnes
df.fillna({'LotFrontage': df["LotFrontage"].mean(),'PoolArea': df["PoolArea"].median(), 'MoSold': df["MoSold"].mode().iloc[0]})

Comme décrit ci-dessus, la valeur moyenne (moyenne) et la valeur médiane (médiane) de la colonne peuvent être renseignées pour la partie argument. ʻDans le cas de la valeur (mode) la plus fréquente, elle est renvoyée dans la trame de données, donc la première ligne d'iloc [0] est acquise. ''

Il existe diverses autres méthodes de complément pour fillna, veuillez donc consulter le document officiel. pandas.DataFrame.fillna

Numérique (données numériques)

La première chose à faire lorsque vous travaillez avec des données numériques est la *** mise à l'échelle ***. La mise à l'échelle signifie la conversion en une valeur numérique d'une certaine largeur. Par exemple, si vous souhaitez prédire les ventes de glace à partir de variables telles que la température, les précipitations et l'humidité, chaque variable a une unité et une plage de valeurs différentes. Si vous continuez à apprendre tel quel, vous ne pourrez peut-être pas bien apprendre et il est nécessaire d'aligner les valeurs sur une certaine plage. C'est la mise à l'échelle.

Il existe plusieurs façons de mettre à l'échelle des entités. Dans cet article, je voudrais aborder le 1.Min Max Scaler, 2.Standard Scaler, 3.log transformation que j'utilise relativement.

  1. Min Max Scaler

Il s'agit de convertir les valeurs de toutes les entités à la même échelle. '' Soustrayez la valeur minimale de toutes les valeurs et divisez par la différence entre Min et Max. En conséquence, la valeur devient 0 à 1. '' *** Cependant, cette méthode présente un inconvénient, et comme la valeur est comprise entre 0 et 1, l'écart type devient petit et l'influence de la valeur d'écart est supprimée. *** *** Si vous devez vous soucier des valeurs aberrantes, cette méthode peut être difficile à envisager.

sklearn.preprocessing.MinMaxScaler

from sklearn import preprocessing

#D'abord de df à dtype=Extraire la colonne de la colonne de nombre
numb_columns = df.select_dtypes(include=['number']).columns

# dtype=Extraire uniquement les données numériques
num_df = df[numb_columns]

# MinMaxScaler
mm_scaler = preprocessing.MinMaxScaler()

#Obtenez avec tableau
num_df_fit = mm_scaler.fit_transform(num_df)

#Convertir en tableau en Dataframe
num_df_fit = pd.DataFrame(num_df_fit, columns=numb_columns)

** Une fois le processus de conversion terminé, il est préférable de vérifier si la mise à l'échelle est correcte. ** ** Par exemple


#Confirmation de la valeur maximale de chaque caractéristique
num_df_fit.max()

#Confirmation de la valeur minimale de chaque caractéristique
num_df_fit.min()

Il est préférable de vérifier après la conversion de cette manière: détendu:

  1. Standard Scaler

Vous pouvez convertir en une distribution standardisée avec une moyenne de 0 et une variance de 1. ` Tout d'abord, la valeur moyenne est soustraite pour obtenir une valeur autour de 0. Ensuite, la méthode de conversion consiste à diviser la valeur par l'écart type afin que la distribution résultante devienne la norme avec une moyenne de 0 et un écart type de 1. StandardScaler présente les mêmes inconvénients (traitement des valeurs aberrantes) que MinMaxScaler. Dans StandardScaler, les valeurs aberrantes ont un effet lors du calcul de la moyenne et des écarts-types, réduisant ainsi la plage des caractéristiques. *** En particulier, étant donné que l'amplitude de la valeur d'écart de chaque quantité d'entités est différente, l'étalement des données de conversion de chaque quantité d'entités peut différer considérablement. *** ***

sklearn.preprocessing.StandardScaler


# StandardScaler
s_scaler = preprocessing.StandardScaler()

#Obtenez avec tableau
num_df_s_fit = s_scaler.fit_transform(num_df)

#Convertir en tableau en Dataframe
num_df_s_fit = pd.DataFrame(num_df_s_fit, columns=numb_columns)

  1. log transformation

J'ai discuté de la conversion logarithmique dans l'article précédent, je vais donc l'expliquer légèrement. Dans le modèle d'apprentissage automatique, «Puisque la distribution normale est souvent supposée, s'il y a une variable qui ne suit pas la distribution normale, une conversion logarithmique, etc. peut être effectuée afin qu'elle suive la distribution normale». Conseils et précautions lors de l'analyse des données


num_df = np.log(num_df)

Catégorique

Les données Catergorical sont des données de chaînes de caractères telles que le sexe (homme / femme) et la préfecture (Hokkaido / préfecture d'Aomori / préfecture d'Iwate ...). `Lors de la manipulation de telles données, elles sont souvent converties en données numériques avant d'être manipulées. ' Dans cet article, je voudrais aborder «1.Label Encoding, 2.One Hot Encoding», que j'utilise relativement.

  1. Label Encoding Je pense que cette méthode est la méthode la plus couramment utilisée. `C'est une méthode d'extraction des valeurs uniques des caractéristiques sélectionnées et de les mapper à différentes valeurs numériques. '' En faisant cela, le montant de fonction acquis par la chaîne de caractères peut être changé en une valeur numérique.

sklearn.preprocessing.LabelEncoder

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

#D'abord de df à dtype=Extraire la colonne de la colonne de l'objet
obj_columns = df.select_dtypes(include=["object"]).columns

# dtype=Extraire uniquement les données d'objet
obj_df = df[obj_columns]

#Extraire des valeurs uniques pour les colonnes Street
str_uniq = obj_df["Street"].unique()

# labelEncoder
le.fit(str_uniq)

list(le.classes_)

le.transform(str_uniq)

スクリーンショット 2020-08-25 17.10.56.png

Créez une instance avec ** le.fit ** comme ci-dessus Vous pouvez obtenir la valeur unique de la quantité de caractéristiques avec ** list (le.classes_) **. Utilisez ** le.transform () ** pour mapper des valeurs uniques sur des nombres.

Lors de la gestion des valeurs numériques converties par LabelEncoder, le modèle basé sur l'arbre (forêt aléatoire, etc.) est considéré comme bon. '' Le modèle non arborescent (analyse de régression, etc.) n'est pas efficace. '' *** En effet, les valeurs uniques sont converties en valeurs numériques, mais l'ampleur des valeurs numériques est gérée dans le cas d'une analyse de régression, même si l'ampleur des valeurs numériques n'a aucune signification. *** ***

  1. One Hot Encoding Etant donné que LabelEncoder ne peut pas être appliqué à l'analyse de régression, One Hot Encoding est utilisé pour l'appliquer à l'analyse de régression. (Il peut y avoir des malentendus de cette manière ...) Parce que ʻOne Hot Encoding a déjà été mis à l'échelle à un maximum de 1 et un minimum de 0. '' *** Au contraire, les données binaires pour le nombre de catégories sont générées sous forme de quantités d'entités, elles ne conviennent donc pas au modèle basé sur l'arbre. *** ***

sklearn.preprocessing.OneHotEncoder

from sklearn import preprocessing

# One Hot Encoder
oh = preprocessing.OneHotEncoder()

str_oh = oh.fit_transform(obj_df.values)

Spécifiez le type de tableau comme argument de transformation.

Résumé

Dans cet article, nous avons décrit le prétraitement des quantités de caractéristiques pour la modélisation. Dans Kaggle etc., nous voyons que ** Encodage cible ** est souvent utilisé pour les données catégorielles. Je n'ai pas pu le publier dans l'article en raison de mon manque d'étude, mais j'aimerais le mettre à jour dès que j'étudie.

Articles pour l'analyse des données

Conseils et précautions lors de l'analyse des données

Recommended Posts

Prétraitement des fonctionnalités pour la modélisation
Prétraitement japonais pour l'apprentissage automatique
Modèle de pipeline de prétraitement pour DataLiner
Extraire uniquement Python pour le prétraitement
Modèle de prétraitement pour l'analyse des données (Python)
Score de puissance prédictif pour la sélection des fonctionnalités
Unité 5 Ingénierie des fonctionnalités pour la sélection des fonctionnalités d'apprentissage automatique