แต่ในการเขียนโปรแกรมแบบดั้งเดิม จุดเวลามักจะอยู่ที่โค้ด ในโปรเจ็กต์แมชชีนเลิร์นนิง การมุ่งเน้นจะเปลี่ยนเป็นการนําเสนอ ช่องทางหนึ่งที่นักพัฒนาซอฟต์แวร์ให้ความสําคัญ คือการเพิ่มและปรับปรุงฟีเจอร์ต่างๆ
การแมปข้อมูลดิบเกี่ยวกับฟีเจอร์ต่างๆ
ด้านซ้ายของรูปที่ 1 แสดงข้อมูลดิบจากแหล่งข้อมูลอินพุต ส่วนด้านขวาจะแสดงเวกเตอร์ฟีเจอร์ซึ่งเป็นชุดค่าจุดลอยตัวที่ประกอบด้วยตัวอย่างในชุดข้อมูล วิศวกรรมฟีเจอร์หมายถึงการแปลงข้อมูลดิบเป็นเวกเตอร์ฟีเจอร์ คุณควรใช้เวลาอย่างมากไปกับ การสร้างฟีเจอร์
โมเดลแมชชีนเลิร์นนิงจํานวนมากต้องแสดงถึงฟีเจอร์ในฐานะเวกเตอร์ที่มีจํานวนจริง เนื่องจากค่าของฟีเจอร์ต้องคูณด้วยน้ําหนักของโมเดล
รูปที่ 1 วิศวกรรมฟีเจอร์จะแมปข้อมูลดิบกับฟีเจอร์ของ ML
การจับคู่ค่าตัวเลข
จํานวนเต็มและข้อมูลจุดลอยตัวไม่จําเป็นต้องมีการเข้ารหัสแบบพิเศษ เนื่องจากอาจคูณด้วยน้ําหนักที่เป็นตัวเลขได้ ดังที่แนะนําในรูปที่ 2 การแปลงค่าข้อมูลดิบ 6 ของค่าให้เป็น 6.0 เป็นค่าเบื้องต้น
รูปที่ 2 การจับคู่ค่าจํานวนเต็มกับค่าทศนิยม
การจับคู่ค่าเชิงหมวดหมู่
ฟีเจอร์เชิงหมวดหมู่มีชุดค่าที่เป็นไปได้แบบแยกต่างหาก
เช่น อาจมีฟีเจอร์ชื่อ street_name
ที่มีตัวเลือกต่างๆ ต่อไปนี้
{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}
เนื่องจากโมเดลไม่สามารถคูณสตริงตามน้ําหนักที่เรียนรู้ได้ เราจึงใช้วิศวกรรมฟีเจอร์เพื่อแปลงสตริงเป็นค่าตัวเลข
เราสามารถกําหนดการแมปจากค่าฟีเจอร์ ซึ่งในจํานวนนี้เราจะเรียกว่าคําศัพท์ของค่าที่เป็นไปได้เป็นจํานวนเต็ม เนื่องจากถนนบางเส้นในโลกจะไม่ปรากฏในชุดข้อมูล เราจึงจัดกลุ่มถนนอื่นๆ ทั้งหมดเป็นหมวดหมู่ที่รับได้ทั้งหมด รวมถึงหมวดหมู่ที่เรียกว่าOOV (นอกคําศัพท์) ได้
เราใช้วิธีต่อไปนี้ในการจับคู่ชื่อถนนกับตัวเลขโดยใช้แนวทางต่อไปนี้
- แมป Charleston Road กับ 0
- แมป North Shoreline Boulevard กับ 1
- แผนที่ Shorebird Way ไปยัง 2
- แมปถนน Rengstorff Avenue กับ 3
- แมปทุกอย่างที่เหลือ (OOV) กับ 4
แต่หากเรารวมหมายเลขดัชนีเหล่านี้ไว้ในโมเดลโดยตรง ก็อาจทําให้มีข้อจํากัดบางประการที่อาจทําให้เกิดปัญหา
เราจะเรียนรู้น้ําหนักที่มีผลกับถนนทุกสาย เช่น ถ้าเราเรียนรู้น้ําหนักที่ 6 สําหรับ
street_name
เราจะนําค่านั้นไปคูณ 0 สําหรับถนนชาร์ลสตัน ด้วย 1 กับถนนชอร์ไลน์บรรทัดหนึ่ง และ 2 สําหรับถนนชอร์เบิร์ด และอื่นๆ พิจารณาโมเดลที่คาดการณ์ราคาบ้านโดยใช้street_name
เป็นฟีเจอร์ มีโอกาสน้อยที่จะมีการปรับราคาแบบเชิงเส้นตามชื่อถนน และยังถือว่าคุณเรียงลําดับถนนตามราคาบ้านเฉลี่ยด้วย โมเดลของเราต้องการความยืดหยุ่นในการเรียนรู้น้ําหนักที่แตกต่างกันสําหรับแต่ละถนน ซึ่งจะเพิ่มให้กับราคาโดยประมาณโดยใช้ฟีเจอร์อื่นๆเราไม่พิจารณากรณีที่
street_name
อาจมีค่าหลายค่า ตัวอย่างเช่น บ้านหลายหลังตั้งอยู่ที่มุมของถนนสองเส้น และไม่สามารถ เข้ารหัสข้อมูลดังกล่าวในค่าstreet_name
ได้ หากมีดัชนีเดียว
หากต้องการนําข้อจํากัดทั้งสองนี้ออก เราก็สามารถสร้างเวกเตอร์ไบนารีสําหรับฟีเจอร์ตามหมวดหมู่แต่ละรายการในโมเดลของเราแทนค่าต่างๆ ดังต่อไปนี้
- สําหรับค่าที่ใช้กับตัวอย่าง ให้ตั้งค่าองค์ประกอบเวกเตอร์ที่เกี่ยวข้องเป็น
1
- ตั้งค่าองค์ประกอบอื่นๆ ทั้งหมดเป็น
0
ความยาวของเวกเตอร์นี้เท่ากับจํานวนองค์ประกอบในคําศัพท์ การเป็นตัวแทนนี้เรียกว่า การเข้ารหัสแบบหนึ่งทิศทาง เมื่อค่าเดียวคือ 1 และ การเข้ารหัสแบบหลายรุ่น หากมีหลายค่าเป็น 1
รูปที่ 3 แสดงถึงการเข้ารหัสแบบหนึ่งทิศทางของถนนบางเส้น: Shorebird Way
องค์ประกอบในเวกเตอร์ไบนารีสําหรับ Shorebird Way มีค่าเป็น 1
ขณะที่องค์ประกอบสําหรับถนนอื่นๆ ทั้งหมดจะมีค่า 0
รูปที่ 3 การจับคู่ที่อยู่ถนนผ่านการเข้ารหัสแบบคลิกเดียว
วิธีนี้จะสร้างตัวแปรบูลีนสําหรับค่าฟีเจอร์ทุกค่าได้อย่างมีประสิทธิภาพ (เช่น ชื่อถนน) ในที่นี้ หากบ้านอยู่บน Shorebird Way ค่าไบนารีควรเป็น 1 เท่านั้นสําหรับ Shorebird Way ดังนั้น โมเดลจะใช้น้ําหนักสําหรับ Shorebird Way เท่านั้น
ในทํานองเดียวกัน หากบ้านอยู่ที่มุมถนน 2 ค่า ค่าไบนารี 2 ค่าจะถูกตั้งเป็น 1 และโมเดลใช้น้ําหนักของค่าทั้ง 2
การแทนแบบบางส่วน
สมมติว่าคุณมีชื่อถนนที่แตกต่างกัน 1,000,000 ชื่อในชุดข้อมูลที่คุณต้องการใส่เป็นค่าสําหรับ street_name
การสร้างเวกเตอร์ไบนารีที่มีองค์ประกอบ 1,000,000 รายการอย่างชัดเจน โดยที่องค์ประกอบเพียง 1 หรือ 2 จริงเป็นค่าที่สื่อได้น้อยมาก ทั้งในแง่ของพื้นที่เก็บข้อมูลและเวลาในการคํานวณเมื่อประมวลผลเวกเตอร์เหล่านี้ ในสถานการณ์นี้ วิธีทั่วไปคือการใช้ตัวแทนที่มีขนาดเล็ก ซึ่งเก็บเฉพาะค่าที่ไม่ใช่ 0 ในการจําลองแบบกระจาย น้ําหนักของโมเดลอิสระจะยังคงเรียนรู้สําหรับค่าฟีเจอร์แต่ละค่าตามที่อธิบายไว้ข้างต้น