ลูกค้าเปลี่ยนใจโดยใช้ PySpark

การทำนายสำหรับแอปเพลง

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

Sparkify เป็นแอปสำหรับฟังเพลง ชุดข้อมูลนี้ประกอบด้วยบันทึกกิจกรรมของผู้ใช้ sparkify ระยะเวลาสองเดือน บันทึกประกอบด้วยข้อมูลผู้ใช้พื้นฐานบางส่วน และข้อมูลเกี่ยวกับการดำเนินงาน ผู้บริโภคสามารถมีได้หลายรายการในนั้น ฉันปั่นส่วนหนึ่งของผู้ใช้ในผลลัพธ์โดยการยกเลิกบัญชี ฉันอัปโหลดข้อมูลการวิจัยของฉันไปยังพื้นที่เก็บข้อมูล GitHub

ค้นหารหัส GitHub ที่นี่:

คุณจะได้รู้อะไรบ้าง

จุดมุ่งหมายหลักของบทความนี้คือการสาธิตอินเทอร์เฟซ SQL ที่ PySpark นำเสนอและความสามารถด้าน Machine Learning ที่นี่ เราพยายามแสดงให้เห็นว่าหากคุณรู้จัก SQL และไลบรารี scikit-learn อยู่แล้ว คุณสามารถขยายการวิเคราะห์ Machine Learning ไปยังชุดข้อมูลขนาดใหญ่ได้อย่างง่ายดาย (เช่น ชุดข้อมูลที่ไม่พอดีกับหน่วยความจำของเครื่องเดียว)

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

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

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

มาเริ่มเซสชัน Spark และโหลดลงใน Jupyter Work Space Notebook กันดีกว่า

ด้านล่างนี้เป็นโค้ดที่ฉันใช้เพื่อสร้างเซสชัน Spark ในพื้นที่

ฉันใช้โค้ดต่อไปนี้เพื่อโหลดข้อมูลจากไฟล์ json โดยใช้ spark

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

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

การวิเคราะห์ข้อมูลเชิงสำรวจ

ขณะที่เราสำรวจข้อมูล เราจะป้อนข้อมูลเหตุการณ์ทั้งหมดลงในแอตทริบิวต์ "หน้า" ซึ่งเป็นหนึ่งในคุณลักษณะที่สำคัญที่สุดในการวิจัยของเรา เราอาจอ้างว่าเมื่อผู้ใช้เยี่ยมชมหน้าการยืนยันการยกเลิก ผู้ใช้อาจเปลี่ยนใจ ดังนั้น เราจะระบุตัวแปรเป้าหมายของเราโดยใช้เหตุการณ์ "การยืนยันการยกเลิก" บนหน้าเว็บ ดังนั้นหากผู้ใช้ (1) กำลังเปลี่ยนใจเป็นอย่างอื่นที่ไม่ใช่ (0)

มาดูฟังก์ชันของเพจที่มีตัวแปร “การยืนยันการยกเลิก” ซึ่งเราสามารถรับตัวแปรเป้าหมายของเราได้ เช่น เลิกใช้งานหรือไม่

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

วิศวกรรมคุณสมบัติ

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

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

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

ด้านล่างนี้เป็นแผนผังคุณลักษณะที่เรานำมาพิจารณา

เราได้รับฟีเจอร์ที่เราเชื่อว่าส่วนใหญ่เป็นตัวทำนายเป้าหมายที่ทรงพลัง เช่น การเปลี่ยนใจ และจะใช้ฟีเจอร์นั้นเพื่อทดสอบ / ฝึกโมเดลของเรา

ตอนนี้เรามาสร้างตารางใหม่กันดีกว่า คุณลักษณะที่เราพบด้านบน

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

มาทดสอบความสัมพันธ์ระหว่างคอลัมน์ทั้งหมดที่เลือกก่อนฝึกโมเดล:

การสร้างแบบจำลอง

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

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

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

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

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

สิ่งที่แนบมาในภาพคือความแม่นยำและคะแนน F-1 รหัสที่ใช้ในชุดข้อมูลทดสอบเพื่อค้นหาความแม่นยำ

ความแม่นยำของแต่ละโมเดลบนชุดข้อมูลทดสอบ

Logistic Regression Classifier Accuracy:0.8430953322074095
Random Forest  Classifier Accuracy:0.9638506593840958
GBT-Classifier  Classifier Accuracy:0.9915196377879191

รหัสที่ใช้ในการค้นหาคะแนน f-1 บนชุดข้อมูลทดสอบ

คะแนน F1 ของแต่ละรุ่นบนชุดข้อมูลทดสอบ:

Logistic Regression Classifier F1-Score:0.7765470592259909
Random Forest  Classifier F1-Score:0.9619697735890758
GBTClassifier  Classifier F1-Score:0.9914322037770119

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

บทสรุป

สรุป

ขั้นตอนสุดท้าย

ทำความสะอาดโค้ดของคุณ เพิ่มความคิดเห็น และเปลี่ยนชื่อตัวแปรเพื่อให้อ่านและบำรุงรักษาโค้ดได้ง่ายขึ้น โปรดดูหน้าภาพรวมโปรเจ็กต์ Spark และรูบริกโปรเจ็กต์ Data Scientist Capstone เพื่อให้แน่ใจว่าคุณได้รวมส่วนประกอบทั้งหมดของโปรเจ็กต์ Capstone และตรงตามความคาดหวังทั้งหมด โปรดจำไว้ว่า นี่รวมถึงเอกสารประกอบโดยละเอียดในไฟล์ README ในพื้นที่เก็บข้อมูล GitHub และเว็บแอปหรือโพสต์บล็อก

คำอธิบาย

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

ภาพสะท้อนของโครงการนี้

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

เพื่อป้องกันการปั่นป่วน สิ่งสำคัญคือต้องปฏิบัติตามคำแนะนำต่อไปนี้

เมื่อเรากำหนดได้ว่าใครจะเปลี่ยนใจด้วยโมเดลการคาดการณ์ เราจะต้องดำเนินการบางอย่างเพื่อหยุดพวกเขาจากการถูกเปลี่ยนใจโดยใช้ข้อเสนอส่งเสริมการขายบางอย่างเพื่อดึงดูดผู้บริโภคที่เป็นเป้าหมายนี้ และค้นหาว่าสาเหตุหลักคืออะไรสำหรับผู้ใช้ที่ไม่ชอบแอป Music และเปลี่ยนกรณีรากเหล่านั้น เช่น: รวมถึงการปรับปรุง UI, อัตราการสมัครสมาชิก ฯลฯ …

การอัพเกรด

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

เรามีบัญชีผู้ใช้ที่ไม่ซ้ำกันประมาณ 223,106 บัญชี และมีเพียง 80 เปอร์เซ็นต์เท่านั้นที่ใช้เพื่อการเรียนรู้ กล่าวคือ โมเดลนี้มีศักยภาพอย่างมากในการปรับปรุงหากขนาดตัวอย่างเพิ่มขึ้น และประสิทธิภาพที่คาดหวังก็จะเพิ่มขึ้นเช่นกัน

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

มาตรการสุดท้าย

ทำความสะอาดโค้ดของคุณ เพิ่มความคิดเห็น และเปลี่ยนแปลงตัวแปรเพื่อให้อ่านและจัดการโค้ดของคุณได้ง่ายขึ้น โปรดดูหน้าคำอธิบายโปรเจ็กต์ Spark และรูบริกโปรเจ็กต์ Data Scientist Capstone เพื่อให้แน่ใจว่าองค์ประกอบโปรเจ็กต์หลักทั้งหมดถูกรวมไว้และเป็นไปตามมาตรฐานทั้งหมด โปรดทราบว่าซึ่งรวมถึงเอกสารประกอบที่ครอบคลุมในไฟล์ README ของที่เก็บ GitHub และเว็บแอปหรือโพสต์บล็อก

ฉันได้อัปโหลดรายละเอียดการวิเคราะห์ของฉันไปยังที่เก็บ GitHub แล้ว

ตรวจสอบโค้ดบน GitHub: ที่นี่