Câu trả lời ngắn
Đây là một chức năng để thực hiện mã hóa một nóng mà không cần sử dụng numpy, gấu trúc hoặc các gói khác. Nó nhận một danh sách các số nguyên, booleans hoặc chuỗi (và có lẽ các loại khác nữa).
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
Thí dụ:
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]]
Long (er) Trả lời
Tôi biết đã có rất nhiều câu trả lời cho câu hỏi này, nhưng tôi nhận thấy hai điều. Đầu tiên, hầu hết các câu trả lời sử dụng các gói như numpy và / hoặc gấu trúc. Và đây là một điều tốt. Nếu bạn đang viết mã sản xuất, có lẽ bạn nên sử dụng các thuật toán mạnh mẽ, nhanh chóng như các thuật toán được cung cấp trong các gói numpy / pandas. Nhưng, vì lợi ích của giáo dục, tôi nghĩ ai đó nên cung cấp một câu trả lời có thuật toán minh bạch và không chỉ là việc thực hiện thuật toán của người khác. Thứ hai, tôi nhận thấy rằng nhiều câu trả lời không cung cấp triển khai mạnh mẽ mã hóa một nóng vì chúng không đáp ứng một trong các yêu cầu dưới đây. Dưới đây là một số yêu cầu (như tôi thấy chúng) về chức năng mã hóa một nóng hữu ích, chính xác và mạnh mẽ:
Hàm mã hóa một nóng phải:
- xử lý danh sách các loại khác nhau (ví dụ: số nguyên, chuỗi, số float, v.v.) làm đầu vào
- xử lý một danh sách đầu vào với các bản sao
- trả về một danh sách các danh sách tương ứng (theo thứ tự như) cho các đầu vào
- trả về một danh sách các danh sách trong đó mỗi danh sách càng ngắn càng tốt
Tôi đã thử nghiệm nhiều câu trả lời cho câu hỏi này và hầu hết chúng đều thất bại ở một trong những yêu cầu trên.
drop_first=True
vớiget_dummies
loại bỏ sự cần thiết phải bỏ riêng cột ban đầu