짧은 답변
다음은 numpy, pandas 또는 기타 패키지 를 사용 하지 않고 원-핫 인코딩을 수행하는 기능 입니다. 정수, 부울 또는 문자열 (및 다른 유형도 포함) 목록을받습니다.
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
예:
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]]
긴 답변
이 질문에 대한 답이 이미 많이 있다는 것을 알고 있지만 두 가지를 발견했습니다. 첫째, 대부분의 답변은 numpy 및 / 또는 pandas와 같은 패키지를 사용합니다. 그리고 이것은 좋은 것입니다. 프로덕션 코드를 작성하는 경우 numpy / pandas 패키지에서 제공하는 것과 같은 강력하고 빠른 알고리즘을 사용해야합니다. 하지만 교육을 위해서는 다른 사람의 알고리즘을 구현하는 것이 아니라 투명한 알고리즘을 가진 답변을 제공해야한다고 생각합니다. 둘째, 아래 요구 사항 중 하나를 충족하지 않기 때문에 많은 답변이 원-핫 인코딩의 강력한 구현을 제공하지 않는다는 것을 알았습니다. 다음은 유용하고 정확하며 강력한 원-핫 인코딩 기능에 대한 몇 가지 요구 사항 (내가 본대로)입니다.
원-핫 인코딩 기능은 다음을 충족해야합니다.
- 다양한 유형 (예 : 정수, 문자열, 부동 소수점 등)의 목록을 입력으로 처리합니다.
- 중복 된 입력 목록 처리
- 입력에 해당하는 (동일한 순서로) 목록 목록을 반환합니다.
- 각 목록이 가능한 한 짧은 목록 목록을 반환합니다.
이 질문에 대한 많은 답변을 테스트했는데 대부분이 위의 요구 사항 중 하나에 실패했습니다.
drop_first=True
으로get_dummies
제거 할 필요 별도로 원래 열을 드롭