Kısa cevap
Burada bir sıcak-kodlama yapmak için bir fonksiyonudur olmadan numpy, panda veya diğer paketleri kullanarak. Tam sayıların, mantıksal değerlerin veya dizelerin (ve belki başka türlerin de) bir listesini alır.
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
Misal:
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]]
Uzun (er) Cevap
Bu sorunun zaten birçok cevabı olduğunu biliyorum ama iki şeyi fark ettim. İlk olarak, cevapların çoğu uyuşmuş ve / veya pandalar gibi paketler kullanıyor. Ve bu iyi bir şey. Üretim kodu yazıyorsanız, muhtemelen numpy / pandas paketlerinde sağlananlar gibi sağlam, hızlı algoritmalar kullanıyor olmalısınız. Ancak, eğitim adına, birisinin sadece bir başkasının algoritmasının bir uygulaması değil, şeffaf bir algoritmaya sahip bir cevap vermesi gerektiğini düşünüyorum. İkincisi, yanıtların birçoğunun, aşağıdaki gereksinimlerden birini karşılamadığı için tek sıcak kodlamanın sağlam bir uygulamasını sağlamadığını fark ettim. Yararlı, doğru ve sağlam bir etkin kodlama işlevi için bazı gereksinimler (gördüğüm kadarıyla) aşağıda verilmiştir:
Tek sıcak kodlama işlevi şunları yapmalıdır:
- giriş olarak çeşitli türlerin listesini (ör. tamsayılar, dizeler, kayan değerler, vb.)
- yinelenen bir girdi listesini işlemek
- girişlere karşılık gelen (aynı sırada) listelerin bir listesini döndürür
- her listenin olabildiğince kısa olduğu bir liste listesi döndür
Bu sorunun yanıtlarının çoğunu test ettim ve çoğu yukarıdaki gereksinimlerden birinde başarısız oldu.
drop_first=True
ileget_dummies
uzaklaşmaların ihtiyacını ayrı orijinal sütun bırakın