ลูกค้าเปลี่ยนใจโดยใช้ 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: ที่นี่