Kurze Antwort
Hier ist eine Funktion zum Ausführen einer One-Hot-Codierung ohne Verwendung von Numpy, Pandas oder anderen Paketen. Es wird eine Liste von Ganzzahlen, Booleschen Werten oder Zeichenfolgen (und möglicherweise auch anderen Typen) benötigt.
import typing
def one_hot_encode(items: list) -> typing.List[list]:
results = []
# find the unique items (we want to unique items b/c duplicate items will have the same encoding)
unique_items = list(set(items))
# sort the unique items
sorted_items = sorted(unique_items)
# find how long the list of each item should be
max_index = len(unique_items)
for item in items:
# create a list of zeros the appropriate length
one_hot_encoded_result = [0 for i in range(0, max_index)]
# find the index of the item
one_hot_index = sorted_items.index(item)
# change the zero at the index from the previous line to a one
one_hot_encoded_result[one_hot_index] = 1
# add the result
results.append(one_hot_encoded_result)
return results
Beispiel:
one_hot_encode([2, 1, 1, 2, 5, 3])
# [[0, 1, 0, 0],
# [1, 0, 0, 0],
# [1, 0, 0, 0],
# [0, 1, 0, 0],
# [0, 0, 0, 1],
# [0, 0, 1, 0]]
one_hot_encode([True, False, True])
# [[0, 1], [1, 0], [0, 1]]
one_hot_encode(['a', 'b', 'c', 'a', 'e'])
# [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 0, 1]]
Lange Antwort
Ich weiß, dass es bereits viele Antworten auf diese Frage gibt, aber ich habe zwei Dinge bemerkt. Erstens verwenden die meisten Antworten Pakete wie Numpy und / oder Pandas. Und das ist gut so. Wenn Sie Produktionscode schreiben, sollten Sie wahrscheinlich robuste, schnelle Algorithmen verwenden, wie sie in den numpy / pandas-Paketen enthalten sind. Aus Gründen der Bildung denke ich jedoch, dass jemand eine Antwort geben sollte, die einen transparenten Algorithmus und nicht nur eine Implementierung des Algorithmus eines anderen hat. Zweitens habe ich festgestellt, dass viele der Antworten keine robuste Implementierung der One-Hot-Codierung bieten, da sie eine der folgenden Anforderungen nicht erfüllen. Im Folgenden sind einige der Anforderungen (wie ich sie sehe) für eine nützliche, genaue und robuste One-Hot-Codierungsfunktion aufgeführt:
Eine One-Hot-Codierungsfunktion muss:
- Behandeln Sie eine Liste verschiedener Typen (z. B. Ganzzahlen, Zeichenfolgen, Gleitkommazahlen usw.) als Eingabe
- Behandeln Sie eine Eingabeliste mit Duplikaten
- Geben Sie eine Liste von Listen zurück, die den Eingaben entsprechen (in derselben Reihenfolge wie)
- Geben Sie eine Liste mit Listen zurück, bei denen jede Liste so kurz wie möglich ist
Ich habe viele der Antworten auf diese Frage getestet und die meisten scheitern an einer der oben genannten Anforderungen.
drop_first=True
mitget_dummies
beseitigt die Notwendigkeit, die ursprüngliche Spalte separat zu