Risposta breve
Ecco una funzione per eseguire la codifica one-hot senza usare numpy, panda o altri pacchetti. Prende un elenco di numeri interi, booleani o stringhe (e forse anche altri tipi).
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
Esempio:
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]]
Risposta lunga (er)
So che ci sono già molte risposte a questa domanda, ma ho notato due cose. Innanzitutto, la maggior parte delle risposte utilizza pacchetti come numpy e / o panda. E questa è una buona cosa. Se stai scrivendo un codice di produzione, dovresti probabilmente usare algoritmi robusti e veloci come quelli forniti nei pacchetti numpy / pandas. Ma, per motivi di educazione, penso che qualcuno dovrebbe fornire una risposta che abbia un algoritmo trasparente e non solo un'implementazione dell'algoritmo di qualcun altro. In secondo luogo, ho notato che molte delle risposte non forniscono un'implementazione robusta della codifica one-hot perché non soddisfano uno dei requisiti di seguito. Di seguito sono riportati alcuni dei requisiti (come li vedo io) per una funzione di codifica one-hot utile, accurata e robusta:
Una funzione di codifica one-hot deve:
- gestire un elenco di vari tipi (es. numeri interi, stringhe, float, ecc.) come input
- gestire un elenco di input con duplicati
- restituisce un elenco di elenchi corrispondenti (nello stesso ordine di) agli input
- restituisce un elenco di elenchi in cui ciascun elenco è il più breve possibile
Ho testato molte delle risposte a questa domanda e la maggior parte di esse non soddisfa uno dei requisiti di cui sopra.
drop_first=True
conget_dummies
rimuove la necessità di eliminare separatamente la colonna originale