Ceci est une continuation de l'article précédent. https://qiita.com/shallowdf20/items/eb35a9cf3c24403debb1
Cette fois, je voudrais vous présenter le traitement de type Encoding de DataLiner.
! pip install -U dataliner
Préparez les données Titanic comme avant.
import pandas as pd
import dataliner as dl
df = pd.read_csv('train.csv')
target_col = 'Survived'
X = df.drop(target_col, axis=1)
y = df[target_col]
En codant des variables catégorielles telles que Sex et Name d'une manière ou d'une autre, vous serez en mesure de gérer des chaînes de caractères qui ne peuvent pas être gérées telles qu'elles sont dans les formules et les modèles. Jetons un coup d'oeil maintenant.
OneHotEncoding C'est la méthode de codage la plus courante. Remplacez les variables catégorielles par 0 et 1 variables factices. Jetons un coup d'oeil d'abord.
trans = dl.OneHotEncoding()
trans.fit_transform(X)
Le nombre de colonnes a augmenté à la fois. Par exemple, comme il existe des types de noms pour le nombre de données = 891 personnes, 891 colonnes augmenteront à la fois. Après cela, vous pouvez supprimer la variable avec DropLowAUC etc., mais il est préférable d'appliquer GroupRareCategory ou DropHighCardinality à l'avance. Essayez de coder après avoir appliqué DropHighCardinality dans le pipeline.
from sklearn.pipeline import make_pipeline
process = make_pipeline(
dl.DropHighCardinality(),
dl.OneHotEncoding(),
)
process.fit_transform(X)
Il s'inscrit dans le nombre de quantités de caractéristiques communes. De plus, lorsque vous créez une variable qui n'existe que des hommes et des femmes, comme le sexe du Titanic, comme variable fictive, il est courant de supprimer l'une des colonnes pour éviter la colinéarité. DataLiner prépare un argument appelé drop_first, et par défaut True = tombe automatiquement.
CountEncoding Il s'agit d'un codage qui remplace les variables catégorielles par le nombre d'occurrences de la catégorie. Tout d'abord, regardons le nombre de passagers par sexe sur Titanic.
df['Sex'].value_counts()
male 577 female 314 Name: Sex, dtype: int64
Il y a 577 hommes et 314 femmes.
Maintenant, faisons CountEncoding.
trans = dl.CountEncoding()
trans.fit_transform(X)
Si vous regardez la colonne Sex, vous pouvez voir qu'elle est certainement remplacée par le nombre. Puisque la colonne de catégorie est automatiquement reconnue, les autres colonnes de catégorie telles que Nom et Embarqué sont également remplacées par des nombres.
RankedCountEncoding CountEncoding est une technique simple mais puissante, mais elle présente l'inconvénient d'être vulnérable aux valeurs aberrantes, par exemple, il existe un nombre inhabituellement élevé de catégories. De plus, s'il y a des catégories avec le même nombre d'occurrences, elles seront remplacées par le même numéro, donc il sera impossible de les distinguer. (Bien sûr, c'est correct s'il ne doit pas être distingué dans la nature)
Par conséquent, cet encodeur remplace le nombre d'apparitions, crée un classement par ordre décroissant du nombre d'apparitions et remplace les variables catégorielles dans cet ordre. Dans l'exemple précédent, il y a 577 hommes, donc c'est le premier dans Sex, et 314 femmes, donc c'est le deuxième dans Sex.
trans = dl.RankedCountEncoding()
trans.fit_transform(X)
Les hommes et les femmes sont remplacés respectivement par 1 et 2. De plus, si vous vérifiez le nom, vous pouvez voir que le nombre d'occurrences est de 1 mais qu'elles sont codées avec des nombres différents. Même si le nombre d'occurrences est le même, il est encodé à l'aide de l'index après classement, donc si la catégorie est différente, vous pouvez toujours la remplacer par un autre nombre.
FrequencyEncoding CountEncoding encode par le nombre d'occurrences, mais FrequencyEncoding encode par la fréquence d'occurrence. Il est facile à manipuler dans la mesure où le résultat tombe automatiquement entre 0 et 1.
Par exemple, dans Sex, 577 / (577 + 314) pour les hommes est codé à 0,647 ... et les femmes sont codées à 314 / (577 + 314) à 0,352 ...
trans = dl.FrequencyEncoding()
trans.fit_transform(X)
Comme avec CountEncoding, la propriété selon laquelle les catégories avec le même nombre d'occurrences ne peuvent pas être distinguées demeure, mais le fait qu'il est vulnérable aux valeurs aberrantes a été amélioré. ClasséFrequencyEncoding n'est pas préparé car il donne le même résultat que ClasséCountEncoding.
TargetMeanEncoding Bien que le nom soit devenu célèbre dans Kaggle etc., l'idée elle-même est à la base de l'analyse des données. Plus précisément, il remplace la variable catégorielle par la valeur moyenne de la variable objectif pour chaque catégorie.
La variable objective étant la vie et la mort des passagers, par exemple dans le sexe, elle est remplacée par le taux de survie par sexe. Cependant, comme l'information de la cible à prédire, qui est la moyenne des variables objectives, est utilisée, si le nombre de données est petit, la valeur codée correspond à la variable objectif et une fuite se produit facilement. Dans la mise en œuvre de DataLiner, comme Bayes, la moyenne de toutes les variables objectives est adoptée comme pré-probabilité de chaque catégorie, et la conversion est pondérée par le nombre de données.
trans = dl.TargetMeanEncoding()
trans.fit_transform(X, y)
RankedTargetMeanEncoding Il classe les résultats de TargetMeanEncoding et les remplace dans cet ordre. Par exemple, si le taux de survie est 1er pour les femmes et 2ème pour les hommes, remplacez-le par 1 pour les femmes et 2 pour les hommes. Dans le codage moyen cible qui adopte la pré-probabilité, lorsque le nombre de certaines catégories est petit par rapport au nombre total de données, il sera codé avec des nombres presque similaires (= proches de la pré-probabilité) malgré des catégories différentes. ClasséTargetMeanEncoding les encodera comme étant distinctement différents.
trans = dl.RankedTargetMeanEncoding()
trans.fit_transform(X, y)
Donc, cette fois, j'ai présenté les éléments liés à l'encodage de DataLiner. Ensuite, je voudrais vous présenter le système de conversion.
Article sur la version Dataliner: https://qiita.com/shallowdf20/items/36727c9a18f5be365b37 GitHub: https://github.com/shallowdf20/dataliner PyPI: https://pypi.org/project/dataliner/
Recommended Posts