นี่คือแนวทางการเรียนรู้ของเครื่องโดยใช้ข้อมูลของ Starbucks ซึ่งเป็นส่วนหนึ่งของโปรแกรมปริญญา Udacity Nano

ภาพรวมโครงการ

เครือร้านอาหารฟาสต์ฟู้ดเป็นส่วนหนึ่งของอุตสาหกรรมร้านอาหารที่มีการแข่งขันสูง การกินและดื่มเป็นสิ่งจำเป็นในชีวิตประจำวันของทุกคน ดังนั้นผมจึงเชื่อว่าความต้องการบริการของร้านอาหารมักจะสูงอยู่เสมอ ดังนั้นการได้รับความได้เปรียบในอุตสาหกรรมนี้จึงขึ้นอยู่กับความพึงพอใจของลูกค้าและการรักษาลูกค้าไว้เป็นอย่างสูง

ความผูกพันของลูกค้าเป็นปัจจัยที่สะท้อนจากการรักษาลูกค้า การเสนอคำแนะนำเฉพาะบุคคลโดยอิงจากการซื้อที่ผ่านมาเป็นเทรนด์ที่องค์กรต่างๆ พยายามปฏิบัติตาม เป็นกลยุทธ์ที่มีประสิทธิภาพในการรักษาลูกค้า ในทำนองเดียวกันการเสนอรางวัล ข้อเสนอ หรือคูปองส่วนบุคคลที่สอดคล้องกับความสนใจของลูกค้าก็เป็นปัจจัยสำคัญในการรักษาลูกค้าเช่นกัน

คำชี้แจงปัญหา

เมื่อฉันเห็นชุดข้อมูลที่มีลักษณะที่สังเกตได้เกี่ยวกับลูกค้า คุณสมบัติของข้อเสนอที่มอบให้กับลูกค้า และประวัติการโต้ตอบของลูกค้ากับข้อเสนอที่มีให้ นี่คือแนวคิดแรกที่เข้ามาในใจของฉัน

การคาดการณ์ว่าลูกค้าจะตอบสนองต่อข้อเสนอที่ส่งถึงพวกเขาอย่างไร เพื่อค้นหาข้อเสนอที่ดีที่สุดที่จะส่งให้กับผู้ใช้ และสื่อใดคือสื่อที่ดีที่สุดในการส่งมอบ

การสำรวจข้อมูลและการแสดงภาพ

ข้อมูลมีให้ในสามไฟล์

  1. profile.json — มีลักษณะเฉพาะเกี่ยวกับลูกค้า เช่น เพศ อายุ รายได้ ฯลฯ ที่สามารถใช้เพื่อระบุรูปแบบตามลักษณะที่คล้ายคลึงกัน
  2. Portfolio.json — ประกอบด้วยฟีเจอร์เกี่ยวกับข้อเสนอ เช่น ประเภทข้อเสนอ รางวัล จำนวนเงินที่ต้องดำเนินการตามข้อเสนอที่มอบให้แก่ผู้ใช้
  3. transcript.json — มันมีข้อมูลเกี่ยวกับปฏิสัมพันธ์ของลูกค้ากับข้อเสนอ เช่น ธุรกรรมที่ทำโดยผู้ใช้ หรือไม่ว่าผู้ใช้จะทำตามข้อเสนอหรือไม่ก็ตาม

มีเหตุการณ์สี่เหตุการณ์ที่มีอยู่ใน Transaction.json ซึ่งได้แก่ offer_received, offer_viewed, Transaction, offer_completed ฉันอนุมานได้ว่าเพื่อระบุว่าผู้ใช้ดำเนินการตามข้อเสนอแล้วหรือไม่ เราจำเป็นต้องกำหนดเป้าหมายเพียงสองเหตุการณ์คือ offer_viewed และ offer_completed หากมีเหตุการณ์ทั้งสองนี้เกิดขึ้นสำหรับข้อเสนอ นั่นหมายความว่าผู้ใช้เห็นและใช้ข้อเสนอนั้น

สำหรับลูกค้า ฉันสังเกตเห็นตัวแปรสามประการ ได้แก่ เพศ อายุ และรายได้ ซึ่งสามารถใช้เป็นคุณลักษณะสำหรับผู้ใช้ทุกคนได้ รหัสเฉพาะของลูกค้าสามารถใช้เพื่อเข้าร่วมกิจกรรมใน Transaction.json ได้

คอลัมน์ทั้งหมดของพอร์ตโฟลิโอของข้อเสนอที่มีอยู่ด้านล่างสามารถใช้เป็นคุณสมบัติของข้อเสนอได้

การประมวลผลข้อมูลล่วงหน้า

ข้อมูลที่ให้ไว้ในชุดข้อมูลไม่มีคุณลักษณะทั้งหมดในรูปแบบที่สามารถใช้ได้โดยตรงในแบบจำลองการคาดการณ์

คอลัมน์หมวดหมู่ต่อไปนี้จะถูกแปลงเป็นตัวแปรจำลองโดยตรงโดยใช้ฟังก์ชัน get_dummies ในไลบรารี pandas:

  1. offer_type (พอร์ตโฟลิโอ. json)
  2. เพศ (profile.json)
  3. เหตุการณ์ (transcript.json)

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

คอลัมน์ค่าใน transcript.json แสดงอยู่ในรูปแบบของพจนานุกรม เหตุการณ์ธุรกรรมมีค่าเท่ากับจำนวนธุรกรรม แต่ฉันไม่ได้ใช้เหตุการณ์ธุรกรรมในการวิเคราะห์ของฉัน ดังนั้นให้ปล่อยบันทึกเหล่านั้นพร้อมกับเหตุการณ์ธุรกรรม มีการใช้คีย์สำหรับมูลค่าของเหตุการณ์อื่นเพื่อเก็บมูลค่าของรหัสข้อเสนอที่ใช้ในการรวมเหตุการณ์เข้ากับข้อเสนอ

ชุดข้อมูลโปรไฟล์มีค่าว่างหลายค่าสำหรับคอลัมน์เพศและรายได้ ฉันวางแผนพล็อตกระจายเพื่อระบุรูปแบบที่สามารถใช้เพื่อประมวลผลข้อมูลที่ขาดหายไป

มีความสัมพันธ์กันในระดับหนึ่งระหว่างอายุ เพศ และรายได้ในการสังเกตโครงเรื่องข้างต้น แต่ฉันไม่มั่นใจว่าจะกรอกข้อมูลที่ขาดหายไปสำหรับสองคอลัมน์ตามนั้น ดังนั้นฉันจึงทิ้งข้อมูลที่หายไป

รหัสเฉพาะของผู้ใช้และข้อมูลระบุตัวตนเฉพาะของข้อเสนอได้ถูกนำมาใช้เพื่อรวมชุดข้อมูลทั้งสามชุดโดยใช้ฟังก์ชัน ผสาน ของแพนด้า

เหตุการณ์ของการโต้ตอบข้อเสนอของผู้ใช้แต่ละครั้งถูกจัดกลุ่มเข้าด้วยกันโดยใช้ฟังก์ชัน groupby ของ pandas โดยใช้ person_id และ offer_id การรวมกันของ person_id และ offer_id แต่ละชุดมีเพียงระเบียนเดียวเท่านั้น และเป้าหมายคือ offer_viewed และ offer_completed

การนำไปปฏิบัติ

เนื่องจากมีตัวแปรเป้าหมายสองตัวคือ offer_viewed และ offer_completed ฉันจึงตัดสินใจใช้ MultiOutputClassifier จาก scikit-learn

ฉันแบ่งข้อมูลออกเป็นข้อมูลการฝึกอบรมและการทดสอบโดย 20% เป็นขนาดของข้อมูลการทดสอบโดยใช้ฟังก์ชัน train_test_split ของ scikit-learn

ฉันใช้โมเดล RandomForestClassifier เป็นโมเดลประมาณค่าสำหรับ MultiOutputClassifier และฝึกฝนมันกับข้อมูลรถไฟ

หลังจากการฝึกอบรม ฉันได้ใช้ฟังก์ชัน classification_report ของ scikit-learn เพื่อทดสอบผลลัพธ์ของข้อมูลการทดสอบ

เมตริก

ฟังก์ชันรายงานการจำแนกประเภทจะส่งคืนการวัดที่แม่นยำ การเรียกคืน และคะแนน f1 ระหว่างผลลัพธ์ที่คาดการณ์ไว้กับผลลัพธ์ดั้งเดิม

ฉันกำลังใช้ตัวชี้วัด การเรียกคืน เป็นตัวชี้วัดหลักสำหรับการประเมินแบบจำลอง แนวคิดเบื้องหลังโมเดลนี้คือการเพิ่มการรักษาลูกค้า ดังนั้นเราจึงไม่ต้องการการคาดการณ์ที่ผิดพลาดสำหรับลูกค้าที่จะดำเนินการตามข้อเสนอจริง ๆ

ดังนั้นฉันต้องการให้ค่าลบลวง (แบบจำลองทำนายค่าเท็จสำหรับเป้าหมายที่เป็นจริง) ให้น้อยที่สุด

การประเมินและการตรวจสอบแบบจำลอง

ก่อนอื่นฉันตรวจสอบผลลัพธ์ของ RandomClassifierModel ที่ฉันใช้ในการทำนายโดยใช้ Classification_report กับผลลัพธ์

ผลลัพธ์แรกคือ offer_completed และผลลัพธ์ที่สองคือ offer_viewed

ตัวชี้วัดทั้งหมดมีความแม่นยำน้อยกว่าที่ฉันคาดไว้ ต่อไปฉันจะทำการปรับแต่งไฮเปอร์พารามิเตอร์บางส่วนของโมเดลเพื่อให้ได้ผลลัพธ์ที่ดีขึ้น

ฉันจะใช้ไลบรารี GridSearchCV ของ scikit-learn ที่เปรียบเทียบค่าที่กำหนดของพารามิเตอร์ไฮเปอร์ และเลือกค่าที่ดีที่สุดสำหรับการทำนาย

พารามิเตอร์ n_estimators และพารามิเตอร์เกณฑ์ของ RandomClassifierModel ฉันจะส่งผ่าน GridSearchCV เพื่อเลือกค่าที่เหมาะสมยิ่งขึ้น จากนั้นสร้าง Classification_report ของการคาดคะเนจากแบบจำลองที่ปรับแล้ว

ฉันสังเกตเห็นการเปลี่ยนแปลงเล็กน้อยหลังจากดำเนินการ GridSearchCV กับโมเดล ดังนั้นฉันจึงตัดสินใจเปลี่ยนโมเดล

การปรับแต่ง

ตัวแยกประเภทที่ได้รับความนิยมอีกรุ่นหนึ่งคือ XGBClassifier ซึ่งใช้เทคนิคการไล่ระดับสีแบบไล่ระดับซึ่งเป็นชุดของแบบจำลองการทำนายที่อ่อนแอและมักจะมีประสิทธิภาพเหนือกว่าแบบจำลอง RandomForest

ฉันได้ประเมินผลลัพธ์ของ XGBClassifier อีกครั้งโดยใช้ Classification_report

มีการปรับปรุงที่สำคัญในผลลัพธ์โดยใช้โมเดล XGBClassifier ตอนนี้ฉันจะใช้ GridSearchCV กับโมเดลและประเมินผลลัพธ์

การเรียกคืนโดยเฉลี่ยและการเรียกคืนสำหรับการคาดการณ์ข้อเสนอที่เสร็จสมบูรณ์นั้นดีในแบบจำลองนี้ ดังนั้นฉันจะบันทึกแบบจำลองนี้โดยใช้ไลบรารี pickle

การให้เหตุผล

XGBoost เป็นอัลกอริธึมที่ซับซ้อนกว่า RandomForest มากที่จะนำไปใช้ แต่โดยทั่วไปแล้วจะเร็วกว่าและแม่นยำกว่ามาก เนื่องจากจะทำการเพิ่มการไล่ระดับสีบนต้นไม้ทุกต้นทีละต้น ในขณะที่ RandomForestClassifier จะสร้างต้นไม้หลายต้นเข้าด้วยกัน และรับผลลัพธ์โดยเฉลี่ยของต้นไม้ทั้งหมด

การสะท้อน

ผู้ใช้ใดๆ ที่ได้รับการทำนายข้อเสนอใน offer_completed และ offer_viewed ทั้งคู่เป็น 1 ควรได้รับข้อเสนอ หากผู้ใช้ไม่ดำเนินการตามข้อเสนอให้เสร็จสิ้น การส่งข้อเสนอให้พวกเขานั้นไม่ใช่การใช้ทรัพยากรที่ดี และหากผู้ใช้กำลังดำเนินการตามข้อเสนอโดยไม่ได้ดูด้วยซ้ำ ฉันเชื่อว่าองค์กรสามารถประหยัดทรัพยากรและไม่ส่งข้อเสนอนั้นให้พวกเขาเนื่องจากพวกเขาใช้จ่ายไปนั้น จำนวนเงินมากอยู่แล้วเพื่อให้พวกเขาสามารถมีส่วนร่วมกับข้อเสนออื่นได้

การประมวลผลข้อมูลล่วงหน้าและการล้างข้อมูลใช้เวลาส่วนใหญ่ของฉันในขณะที่ทำโปรเจ็กต์นี้ให้เสร็จสิ้น สำหรับฉันส่วนที่ยุ่งยากคือการระบุโครงสร้างของฟีเจอร์ที่ฉันจะใช้ในการทำนาย

การปรับปรุง

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

นอกจากนี้ยังมีเหตุการณ์ธุรกรรมใน transcript.json ซึ่งฉันไม่ได้ใช้ในโมเดลของฉัน ฉันไม่แน่ใจเป็นพิเศษเกี่ยวกับโครงสร้างเกี่ยวกับวิธีการใช้งานฟีเจอร์ แต่ฉันเชื่อว่าโครงสร้างนี้มีความสำคัญต่อการใช้จ่ายของผู้ใช้ก่อนและหลังรับข้อเสนอ และสามารถใช้สำหรับข้อมูลเชิงลึกเกี่ยวกับผลกระทบของข้อเสนอต่อผู้ใช้ได้ ถ้ามันยังไม่เสร็จ

รหัสสำหรับโครงการข้างต้นสามารถพบได้ที่นี่ใน "Github"