Réponse courte
Voici une fonction pour effectuer un encodage à chaud sans utiliser numpy, pandas ou autres packages. Il prend une liste d'entiers, de booléens ou de chaînes (et peut-être d'autres types aussi).
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
Exemple:
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]]
Réponse longue (er)
Je sais qu'il y a déjà beaucoup de réponses à cette question, mais j'ai remarqué deux choses. Premièrement, la plupart des réponses utilisent des packages comme numpy et / ou pandas. Et c'est une bonne chose. Si vous écrivez du code de production, vous devriez probablement utiliser des algorithmes robustes et rapides comme ceux fournis dans les packages numpy / pandas. Mais, dans un souci d'éducation, je pense que quelqu'un devrait fournir une réponse qui a un algorithme transparent et pas seulement une implémentation de l'algorithme de quelqu'un d'autre. Deuxièmement, j'ai remarqué que de nombreuses réponses ne fournissent pas une implémentation robuste de l'encodage à chaud car elles ne répondent pas à l'une des exigences ci-dessous. Voici quelques-unes des exigences (telles que je les vois) pour une fonction d'encodage à chaud utile, précise et robuste:
Une fonction d'encodage à chaud doit:
- gérer une liste de différents types (par exemple des entiers, des chaînes, des flottants, etc.) en entrée
- gérer une liste d'entrée avec des doublons
- retourne une liste de listes correspondant (dans le même ordre que) aux entrées
- retourne une liste de listes où chaque liste est la plus courte possible
J'ai testé de nombreuses réponses à cette question et la plupart d'entre elles échouent à l'une des exigences ci-dessus.
drop_first=True
avecget_dummies
supprime la nécessité de supprimer la colonne d'origine séparément