Jawaban singkat
Berikut adalah fungsi untuk melakukan satu-hot-encoding tanpa menggunakan numpy, panda, atau paket lainnya. Dibutuhkan daftar bilangan bulat, boolean, atau string (dan mungkin tipe lainnya juga).
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
Contoh:
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]]
Panjang (er) Jawaban
Saya tahu sudah ada banyak jawaban untuk pertanyaan ini, tetapi saya memperhatikan dua hal. Pertama, sebagian besar jawaban menggunakan paket seperti numpy dan / atau panda. Dan ini adalah hal yang baik. Jika Anda menulis kode produksi, Anda mungkin harus menggunakan algoritma yang kuat dan cepat seperti yang disediakan dalam paket numpy / panda. Tetapi, demi pendidikan, saya pikir seseorang harus memberikan jawaban yang memiliki algoritma transparan dan bukan hanya implementasi algoritma orang lain. Kedua, saya perhatikan bahwa banyak jawaban tidak memberikan implementasi yang kuat dari pengodean satu-panas karena tidak memenuhi salah satu persyaratan di bawah ini. Berikut adalah beberapa persyaratan (seperti yang saya lihat) untuk fungsi pengkodean satu panas yang bermanfaat, akurat, dan kuat:
Fungsi pengkodean satu-panas harus:
- menangani daftar berbagai jenis (misalnya bilangan bulat, string, float, dll.) sebagai input
- menangani daftar input dengan duplikat
- mengembalikan daftar daftar yang sesuai (dalam urutan yang sama seperti) ke input
- mengembalikan daftar daftar di mana setiap daftar sesingkat mungkin
Saya menguji banyak jawaban untuk pertanyaan ini dan kebanyakan dari mereka gagal pada salah satu persyaratan di atas.
drop_first=True
denganget_dummies
menghilangkan kebutuhan untuk menjatuhkan kolom asli secara terpisah