ตัวแทน: วิศวกรรมฟีเจอร์

แต่ในการเขียนโปรแกรมแบบดั้งเดิม จุดเวลามักจะอยู่ที่โค้ด ในโปรเจ็กต์แมชชีนเลิร์นนิง การมุ่งเน้นจะเปลี่ยนเป็นการนําเสนอ ช่องทางหนึ่งที่นักพัฒนาซอฟต์แวร์ให้ความสําคัญ คือการเพิ่มและปรับปรุงฟีเจอร์ต่างๆ

การแมปข้อมูลดิบเกี่ยวกับฟีเจอร์ต่างๆ

ด้านซ้ายของรูปที่ 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 ในการจําลองแบบกระจาย น้ําหนักของโมเดลอิสระจะยังคงเรียนรู้สําหรับค่าฟีเจอร์แต่ละค่าตามที่อธิบายไว้ข้างต้น