Krótka odpowiedź
Oto funkcja do kodowania na gorąco bez używania numpy, pandy lub innych pakietów. Pobiera listę liczb całkowitych, wartości logicznych lub łańcuchów (i być może także innych typów).
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
Przykład:
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]]
Długa (e) odpowiedź
Wiem, że jest już wiele odpowiedzi na to pytanie, ale zauważyłem dwie rzeczy. Po pierwsze, większość odpowiedzi używa pakietów takich jak numpy i / lub pandy. I to jest dobra rzecz. Jeśli piszesz kod produkcyjny, prawdopodobnie powinieneś używać solidnych, szybkich algorytmów, takich jak te zawarte w pakietach numpy / pandas. Ale ze względu na edukację myślę, że ktoś powinien udzielić odpowiedzi, która ma przejrzysty algorytm, a nie tylko implementację cudzego algorytmu. Po drugie, zauważyłem, że wiele odpowiedzi nie zapewnia solidnej implementacji kodowania typu one-hot, ponieważ nie spełniają one jednego z poniższych wymagań. Poniżej znajdują się niektóre wymagania (tak jak je widzę) dotyczące użytecznej, dokładnej i niezawodnej funkcji kodowania na gorąco:
Funkcja kodowania typu one-hot musi:
- obsługuje listę różnych typów (np. liczby całkowite, ciągi znaków, zmiennoprzecinkowe itp.) jako dane wejściowe
- obsłużyć listę wejściową z duplikatami
- zwraca listę list odpowiadających (w tej samej kolejności co) wejściom
- zwraca listę list, z których każda jest możliwie najkrótsza
Przetestowałem wiele odpowiedzi na to pytanie i większość z nich nie spełnia jednego z powyższych wymagań.
drop_first=True
zget_dummies
eliminuje potrzebę oddzielnego upuszczania oryginalnej kolumny