Dies ist eine Fortsetzung des vorherigen Artikels. https://qiita.com/shallowdf20/items/eb35a9cf3c24403debb1
Dieses Mal möchte ich die Codierungsverarbeitung von DataLiner vorstellen.
! pip install -U dataliner
Bereiten Sie die Titanic-Daten wie zuvor vor.
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]
Indem Sie kategoriale Variablen wie Geschlecht und Name auf irgendeine Weise codieren, können Sie Zeichenfolgen verarbeiten, die nicht wie in Formeln und Modellen behandelt werden können. Lassen Sie uns jetzt einen Blick darauf werfen.
OneHotEncoding Dies ist die häufigste Codierungsmethode. Ersetzen Sie die kategorialen Variablen durch 0 und 1 Dummy-Variablen. Lassen Sie uns zuerst einen Blick darauf werfen.
trans = dl.OneHotEncoding()
trans.fit_transform(X)
Die Anzahl der Spalten hat sich gleichzeitig erhöht. Da es beispielsweise Namenstypen für die Anzahl der Daten = 891 Personen gibt, werden 891 Spalten gleichzeitig erhöht. Danach können Sie die Variable mit DropLowAUC usw. löschen. Es ist jedoch besser, GroupRareCategory oder DropHighCardinality im Voraus anzuwenden. Versuchen Sie die Codierung, nachdem Sie DropHighCardinality in der Pipeline angewendet haben.
from sklearn.pipeline import make_pipeline
process = make_pipeline(
dl.DropHighCardinality(),
dl.OneHotEncoding(),
)
process.fit_transform(X)
Es passt in die Anzahl der gemeinsamen Merkmalsmengen. Wenn Sie eine Variable, die nur für Männer und Frauen existiert, wie z. B. das Geschlecht der Titanic, als Dummy-Variable festlegen, wird häufig eine der Spalten gelöscht, um eine Co-Linearität zu vermeiden. DataLiner bereitet ein Argument namens drop_first vor und standardmäßig wird True = automatisch gelöscht.
CountEncoding Dies ist eine Codierung, die kategoriale Variablen durch die Anzahl der Vorkommen der Kategorie ersetzt. Schauen wir uns zunächst die Anzahl der Passagiere nach Geschlecht auf der Titanic an.
df['Sex'].value_counts()
male 577 female 314 Name: Sex, dtype: int64
Es gibt 577 Männer und 314 Frauen.
Lassen Sie uns nun CountEncoding durchführen.
trans = dl.CountEncoding()
trans.fit_transform(X)
Wenn Sie sich die Spalte Geschlecht ansehen, können Sie sehen, dass sie sicherlich durch die Zählung ersetzt wird. Da die Kategoriespalte automatisch erkannt wird, werden auch andere Kategoriespalten wie Name und Eingeschifft durch Zahlen ersetzt.
RankedCountEncoding CountEncoding ist eine einfache, aber leistungsstarke Technik, hat jedoch den Nachteil, dass sie für Ausreißer anfällig ist. Beispielsweise gibt es eine ungewöhnlich große Anzahl von Kategorien. Wenn es Kategorien mit der gleichen Anzahl von Vorkommen gibt, werden sie durch die gleiche Anzahl ersetzt, sodass sie nicht mehr zu unterscheiden sind. (Natürlich ist das richtig, wenn es nicht in der Natur unterschieden werden sollte)
Daher ersetzt dieser Encoder die Anzahl der Vorkommen, erstellt eine Rangfolge in absteigender Reihenfolge der Anzahl der Vorkommen und ersetzt die kategorialen Variablen in dieser Reihenfolge. Im vorherigen Beispiel gibt es 577 Männer, also ist es der erste beim Sex und 314 Frauen, also der zweite beim Sex.
trans = dl.RankedCountEncoding()
trans.fit_transform(X)
Männer und Frauen werden durch 1 bzw. 2 ersetzt. Wenn Sie den Namen überprüfen, können Sie auch feststellen, dass die Anzahl der Vorkommen 1 beträgt, diese jedoch mit unterschiedlichen Nummern codiert sind. Selbst wenn die Anzahl der Vorkommen gleich ist, wird sie nach dem Ranking mithilfe des Index codiert. Wenn sich die Kategorie also unterscheidet, können Sie sie jederzeit durch eine andere Zahl ersetzen.
FrequencyEncoding CountEncoding codiert nach der Anzahl der Vorkommen, FrequencyEncoding jedoch nach der Häufigkeit des Auftretens. Es ist einfach zu handhaben, da das Ergebnis automatisch zwischen 0 und 1 liegt.
Zum Beispiel wird in Sex 577 / (577 + 314) für Männer mit 0,647 ... und Frauen mit 314 / (577 + 314) mit 0,352 ... codiert.
trans = dl.FrequencyEncoding()
trans.fit_transform(X)
Wie bei CountEncoding bleibt die Eigenschaft erhalten, dass Kategorien mit derselben Anzahl von Vorkommen nicht unterschieden werden können, aber der Punkt, an dem sie für Ausreißer anfällig sind, wurde verbessert. RankedFrequencyEncoding ist nicht vorbereitet, da es das gleiche Ergebnis wie RankedCountEncoding liefert.
TargetMeanEncoding Obwohl der Name in Kaggle usw. berühmt wurde, ist die Idee selbst die Grundlage der Datenanalyse. Insbesondere wird die kategoriale Variable durch den Durchschnittswert der Zielvariablen für jede Kategorie ersetzt.
Da die Zielvariable das Leben und der Tod von Passagieren ist, beispielsweise beim Geschlecht, wird sie durch die Überlebensrate nach Geschlecht ersetzt. Da jedoch die Information des vorherzusagenden Ziels, die der Durchschnitt der Zielvariablen ist, verwendet wird, entspricht der codierte Wert der Zielvariablen, wenn die Anzahl der Daten klein ist, und es tritt leicht ein Leck auf. Bei der Implementierung von DataLiner wird wie bei Bayes der Durchschnitt aller objektiven Variablen als Vorwahrscheinlichkeit für jede Kategorie verwendet, und die Konvertierung wird mit der Anzahl der Daten gewichtet.
trans = dl.TargetMeanEncoding()
trans.fit_transform(X, y)
RankedTargetMeanEncoding Es ordnet die Ergebnisse von TargetMeanEncoding und ersetzt sie in dieser Reihenfolge. Wenn beispielsweise die Überlebensrate für Frauen 1 und für Männer 2 beträgt, ersetzen Sie sie durch 1 für Frauen und 2 für Männer. Wenn bei der mittleren Zielcodierung, die die Vorwahrscheinlichkeit verwendet, die Anzahl bestimmter Kategorien im Vergleich zur Gesamtzahl der Daten gering ist, wird sie trotz unterschiedlicher Kategorien mit nahezu ähnlichen (= nahezu vorwahrscheinlichen) Zahlen codiert. RankedTargetMeanEncoding codiert sie als deutlich unterschiedlich.
trans = dl.RankedTargetMeanEncoding()
trans.fit_transform(X, y)
Dieses Mal habe ich die Codierungselemente von DataLiner vorgestellt. Als nächstes möchte ich das Konvertierungssystem vorstellen.
Artikel zur Veröffentlichung des Dataliner: https://qiita.com/shallowdf20/items/36727c9a18f5be365b37 GitHub: https://github.com/shallowdf20/dataliner PyPI: https://pypi.org/project/dataliner/