คำตอบสั้น ๆ
นี่คือฟังก์ชั่นในการเข้ารหัสแบบ hot-encoding โดยไม่ต้องใช้ 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 แต่เพื่อประโยชน์ในการศึกษาฉันคิดว่าใครบางคนควรให้คำตอบซึ่งมีอัลกอริทึมที่โปร่งใสไม่ใช่แค่การใช้อัลกอริทึมของคนอื่น ประการที่สองฉันสังเกตเห็นว่าคำตอบจำนวนมากไม่ได้นำเสนอการเข้ารหัสแบบร้อนแรงที่มีประสิทธิภาพเนื่องจากไม่ตรงตามข้อกำหนดด้านล่าง ด้านล่างนี้เป็นข้อกำหนดบางประการ (ตามที่ฉันเห็น) สำหรับฟังก์ชันการเข้ารหัสแบบ one-hot ที่มีประโยชน์ถูกต้องและมีประสิทธิภาพ:
ฟังก์ชันการเข้ารหัสแบบ one-hot ต้อง:
- จัดการรายการประเภทต่างๆ (เช่นจำนวนเต็มสตริงลอย ฯลฯ ) เป็นอินพุต
- จัดการรายการอินพุตที่มีรายการที่ซ้ำกัน
- ส่งคืนลิสต์รายการที่เกี่ยวข้อง (ในลำดับเดียวกัน) ไปยังอินพุต
- ส่งคืนรายการที่แต่ละรายการสั้นที่สุด
ฉันได้ทดสอบคำตอบหลายข้อสำหรับคำถามนี้และส่วนใหญ่ไม่ผ่านข้อกำหนดข้อใดข้อหนึ่งข้างต้น
drop_first=True
โดยไม่get_dummies
จำเป็นต้องวางคอลัมน์เดิมแยกต่างหาก