Was ist One Hot Encoding und wie es geht
Wenn Sie sich für maschinelles Lernen interessieren, werden Sie unweigerlich auf dieses Ding namens „One Hot Encoding“ stoßen. Es ist jedoch eines der Dinge, die als Anfänger des maschinellen Lernens schwer zu verstehen sind, da Sie einige Dinge über maschinelles Lernen wissen müssen, um es zu verstehen. Um zu helfen, dachte ich, ich würde versuchen, eine Anfängererklärung zu geben.
Das erste, was Sie tun, wenn Sie ein maschinelles Lernprogramm erstellen, ist normalerweise die Vorverarbeitung. Damit meine ich die Vorbereitung von Daten, die von Ihrem Programm analysiert werden sollen. Schließlich können Sie nicht einfach eine Tabelle oder ein paar Bilder in Ihr Programm werfen und erwarten, dass es weiß, was zu tun ist. Wir sind noch nicht auf diesem Niveau der KI.
Ein großer Teil der Vorverarbeitung ist etwas Codierung. Dies bedeutet, dass jedes Datenstück so dargestellt wird, dass der Computer es verstehen kann, daher der Name encode, was wörtlich „in Code konvertieren“ bedeutet. Es gibt viele verschiedene Arten der Codierung wie Label-Codierung, oder wie Sie vielleicht erraten haben, Eine Hot-Codierung. Label-Codierung ist intuitiv und leicht zu verstehen, also werde ich das zuerst erklären. Hoffentlich können Sie von dort aus eine heiße Kodierung vollständig verstehen.
Nehmen wir an, wir arbeiten mit kategorialen Daten wie Katzen und Hunden. Wenn Sie sich den Namen der Etikettencodierung ansehen, können Sie möglicherweise erraten, dass sie Etiketten codiert, wobei label nur eine Kategorie ist (dh Katze oder Hund), und codieren bedeutet nur, ihnen eine Zahl zu geben, die diese Kategorie darstellt (1 für Katze und 2 für Hund). Indem er jeder Kategorie eine Nummer gibt, weiß der Computer jetzt, wie er sie darstellt, da der Computer weiß, wie man mit Zahlen arbeitet. Und jetzt haben wir die Etikettencodierung bereits erklärt. Es gibt jedoch ein Problem, das dazu führt, dass kategoriale Daten häufig nicht funktionieren.
Das Problem ist, dass die Kategorien bei der Beschriftungscodierung jetzt natürliche geordnete Beziehungen haben. Der Computer tut dies, weil er so programmiert ist, dass er höhere Zahlen als höhere Zahlen behandelt; es wird natürlich den höheren Zahlen höhere Gewichte geben. Wir können das Problem damit in einem Beispiel sehen:
- Stellen Sie sich vor, Sie hätten 3 Kategorien von Lebensmitteln: Äpfel, Hühnchen und Brokkoli. Mit der Etikettencodierung würden Sie jedem von ihnen eine Nummer zuweisen, um sie zu kategorisieren: Äpfel = 1, Huhn = 2 und Brokkoli = 3. Aber jetzt, wenn Ihr Modell intern den Durchschnitt über Kategorien hinweg berechnen muss, könnte es 1 + 3 = 4/2 = 2 tun. Dies bedeutet, dass nach Ihrem Modell der Durchschnitt von Äpfeln und Hühnchen zusammen Brokkoli ist.
Offensichtlich wird diese Denkweise Ihres Modells dazu führen, dass Korrelationen völlig falsch sind, daher müssen wir eine One-Hot-Codierung einführen.
Anstatt die Dinge als eine Zahl zu kennzeichnen, die bei 1 beginnt und dann für jede Kategorie zunimmt, werden wir uns eher für einen binären Kategorisierungsstil entscheiden. Sie haben vielleicht gedacht, wenn Sie wüssten, was ein One-Hot ist (es bezieht sich auf binäre Codierung, aber machen Sie sich keine Sorgen darüber). Lassen Sie mich einen visualisierten Unterschied zwischen Label und One-Hot-Codierung angeben. Sehen Sie, ob Sie den Unterschied herausfinden können:
Was ist der Unterschied? Nun, unsere Kategorien waren früher Zeilen, aber jetzt sind sie Spalten. Unsere numerische Variable Kalorien ist jedoch gleich geblieben. Eine 1 in einer bestimmten Spalte teilt dem Computer die richtige Kategorie für die Daten dieser Zeile mit. Mit anderen Worten, wir haben für jede Kategorie eine zusätzliche Binärspalte erstellt.
Es ist nicht sofort klar, warum dies besser ist (abgesehen von dem zuvor erwähnten Problem), und das liegt daran, dass es keinen klaren Grund gibt. Wie viele Dinge im maschinellen Lernen werden wir dies nicht in jeder Situation verwenden. Es behebt nur ein Problem, das bei der Etikettencodierung auftritt, wenn Sie mit kategorialen Daten arbeiten
Eine heiße Codierung im Code (verstanden? Es ist ein Wortspiel)
Es ist immer hilfreich zu sehen, wie dies im Code gemacht wird. Normalerweise bin ich fest davon überzeugt, dass wir etwas ohne Bibliotheken tun sollten, um es zu lernen, aber nur für dieses mühsame Vorverarbeitungsmaterial brauchen wir es nicht wirklich. Bibliotheken können dies so einfach machen. Wir werden numpy, sklearn und Pandas verwenden, da Sie diese 3 Bibliotheken in vielen Ihrer Projekte verwenden werden
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd
Nachdem wir die Tools haben, fangen wir an. Wir arbeiten mit einem erfundenen Datensatz. Geben Sie den Datensatz mit Pandas ein.read_csv Funktion:
dataset = pd.read_csv('made_up_thing.csv')
Hoffentlich ist das selbsterklärend. Als nächstes ist es etwas schwieriger. Die Sache mit Tabellenkalkulationen ist, dass Sie sich möglicherweise für einige der Spalten interessieren oder nicht. Nehmen wir der Einfachheit halber an, wir kümmern uns um alles außer der letzten Spalte. Wir werden die Funktion von Pandas verwenden.iloc , das die Daten in den Spalten abruft, die Sie anweisen:
X = dataset.iloc.values
.iloc nimmt tatsächlich an, also haben wir eingegeben. Das : liegt daran, dass wir alle Zeilen in diesen Spalten haben wollen, und : ist genau so, wie Sie das tun. Wir fügen die .werte, um die Werte für die von uns ausgewählten Segmente abzurufen. Mit anderen Worten, der erste Teil wählt die Werte aus, der zweite Teil erhält die Werte.
Jetzt machen wir die eigentliche Codierung. Sklearn macht es unglaublich einfach, aber es gibt einen Haken. Sie haben vielleicht bemerkt, dass wir sowohl den labelencoder als auch den einen Hot Encoder importiert haben. Sklearns One Hot Encoder weiß eigentlich nicht, wie man Kategorien in Zahlen umwandelt, er weiß nur, wie man Zahlen in Binärzahlen umwandelt. Wir müssen zuerst den labelencoder verwenden.
Zuerst richten wir einen labelencoder wie jedes normale Objekt ein:
le = LabelEncoder()
Als nächstes müssen wir Sklearns verwenden.fit_transform Funktion. Nehmen wir an, wir müssen nur die erste Spalte codieren. Wir würden tun:
X = le.fit_transform(X)
Diese Funktion ist nur eine Kombination der .fit und .befehle transformieren. .fit nimmt X (in diesem Fall die erste Spalte von X wegen unseres X ) und konvertiert alles in numerische Daten. .transform wendet dann diese Konvertierung an.
Sie müssen nur noch den einen Hot-Encoder verwenden. Zum Glück ist es fast das gleiche wie das, was wir gerade getan haben:
ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()
Categorical_feartures ist ein Parameter, der angibt, welche Spalte wir wollen eine heiße kodieren, und da wollen wir die erste Spalte kodieren, wir setzen . Schließlich fit_transform wir fit_transform in binär und verwandeln es in ein Array, damit wir in Zukunft problemlos damit arbeiten können.
Und das war’s! Es ist ziemlich einfach. Eine letzte Anmerkung, wenn Sie mehr als nur die erste Spalte tun müssen, tun Sie, was wir gerade getan haben, aber anstelle von 0 setzen Sie die gewünschte Spalte. Für viele Spalten können Sie es in eine for-Schleife einfügen:
le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)
Viel Glück auf Sie maschinelles Lernen Abenteuer!