เทคนิคการเรียนรู้ของเครื่องสำหรับการประเมินอายุของผู้ใช้ตามเว็บไซต์ Facebook ที่พวกเขาชอบ


25

ฉันมีฐานข้อมูลจากแอปพลิเคชัน Facebook ของฉันและฉันพยายามใช้การเรียนรู้ของเครื่องเพื่อประเมินอายุของผู้ใช้ตามไซต์ Facebook ที่พวกเขาชอบ

มีสามลักษณะที่สำคัญของฐานข้อมูลของฉัน:

  • การแจกแจงอายุในชุดการฝึกอบรมของฉัน (รวมเป็น 12k ของผู้ใช้) เอียงไปทางผู้ใช้ที่อายุน้อยกว่า (เช่นฉันมีผู้ใช้ 1157 คนอายุ 27 และ 23 ผู้ใช้อายุ 65 ปี)

  • หลายไซต์มี likers ไม่เกิน 5 (ฉันกรองเว็บไซต์ FB ที่มี likers น้อยกว่า 5)

  • มีคุณสมบัติมากมายกว่าตัวอย่าง

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

ฉันใช้ Python เป็นหลักดังนั้นคำแนะนำเฉพาะของ Python จะได้รับการชื่นชมอย่างมาก


1
เมื่อคุณพูดว่า "คุณสมบัติมากกว่าตัวอย่าง" ฉันคิดว่าคุณหมายถึงจำนวนเว็บไซต์ที่ชอบเป็นจำนวน >> ผู้ใช้ราย เป็นเช่นนั้นสำหรับโดเมนรูทของเว็บไซต์หรือไม่ คือพวกเขามีจำนวน youtube.com หรือ cnn.com url ในเว็บไซต์หรือพวกเขามาจากโดเมนแล้ว? ฉันกำลังโน้มตัวไปสู่การลดขนาดโดยการยุบ URL ไปยังรากโดเมนแทนที่จะเป็นหน้าเว็บเฉพาะหากเป็นไปได้
cwharland

ขอบคุณสำหรับคำตอบ. จำนวนฟีเจอร์ (ไซต์ที่ชอบเป็นพิเศษ) คือ 32k ในขณะที่จำนวนตัวอย่าง (ผู้ใช้) คือ 12k คุณสมบัติคือเพจของ Facebook ดังนั้นจึงไม่จำเป็นต้องปิดกั้น URL ผู้ใช้อาจชอบ facebook.com/cnn หรือไม่ ผมชอบความคิดของการพยายามที่จะประเมินอายุของผู้ใช้บนพื้นฐานของการเชื่อมโยงพวกเขาร่วมกันแม้ว่า :)
วอย Walczak

อ่าฉันผิดคำอธิบายไซต์ที่ชอบ ขอขอบคุณสำหรับการชี้แจง.
cwharland

คำตอบ:


16

สิ่งแรกที่ต้องเริ่มด้วยคือ k-NN แนวคิดนี้คือคุณมีเมทริกซ์ผู้ใช้ / ไอเท็มและสำหรับผู้ใช้บางคนที่คุณอายุรายงานไว้ อายุสำหรับบุคคลในเมทริกซ์ไอเท็มผู้ใช้อาจถูกกำหนดอย่างดีจากสิ่งต่าง ๆ เช่นอายุเฉลี่ยหรือค่ามัธยฐานของเพื่อนบ้านที่ใกล้ที่สุดในพื้นที่รายการ

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

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

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

ฉันต้องคิดอีกเล็กน้อยเกี่ยวกับวิธีการอื่น ๆ (การถดถอย rf ฯลฯ ... ) เนื่องจากการมุ่งเน้นที่แคบของฟีเจอร์สเปซของคุณ

ข้อควรระวังหนึ่งประการหากอายุที่คุณมีต่อการรถไฟเป็นรายงานด้วยตนเองคุณอาจต้องแก้ไขบางอย่าง ผู้คนบน Facebook มักจะรายงานอายุในทศวรรษที่พวกเขาเกิด พล็อตฮิสโตแกรมของวันเกิด (มาจากอายุ) และดูว่าคุณมีหนามแหลมในช่วงทศวรรษเช่น 70s, 80s, 90s


สวัสดีคำตอบของคุณค่อนข้างคล้ายกับกลยุทธ์จริงของฉัน ฉันใช้sklearn.neighbors.KNeighborsRegressorกับโคไซน์เมทริกบนพื้นที่ลด SVD (หลังจากใช้ SVD ข้อผิดพลาดการประเมินโดยเฉลี่ยลดลงจาก ~ 6 ปีถึง ~ 4) ผู้ใช้ในฐานข้อมูลของฉันมีอายุระหว่าง 18-65 ปี (มีการกรองผู้ใช้ที่มีอายุมากกว่า) ดังนั้นจึงมี 48 คลาสที่เป็นไปได้ ฉันสงสัยว่านั่นไม่ใช่คลาสที่มากเกินไปสำหรับ kNN หรือไม่และฉันควรปฏิบัติต่อมันว่าเป็นปัญหาการถดถอยหรือปัญหาการจัดหมวดหมู่
วอย Walczak

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

7

ฉันเพิ่งทำโครงการที่คล้ายกันใน Python (การทำนายความคิดเห็นโดยใช้ FB เช่นข้อมูล) และให้ผลลัพธ์ที่ดีด้วยกระบวนการพื้นฐานต่อไปนี้:

  1. อ่านในชุดฝึกอบรม (n = N) โดยวนซ้ำเครื่องหมายจุลภาคคั่นเช่นบันทึกบรรทัดต่อบรรทัดและใช้ตัวนับเพื่อระบุหน้าเว็บที่ได้รับความนิยมสูงสุด
  2. สำหรับแต่ละหน้า K ที่ได้รับความนิยมมากที่สุด (ฉันใช้ประมาณ 5000 แต่คุณสามารถเล่นด้วยค่าที่ต่างกัน) ใช้ pandas.DataFrame.isin เพื่อทดสอบว่าแต่ละคนในชุดการฝึกอบรมชอบแต่ละหน้าหรือไม่จากนั้นสร้าง N x K dataframe ของผลลัพธ์ (ฉันจะเรียกมันว่า xdata_train)
  3. สร้างซีรี่ส์ (ฉันจะเรียกมันว่า ydata_train) ที่มีตัวแปรผลลัพธ์ทั้งหมด (ในความคิดเห็นกรณีของฉันอายุของคุณ) ด้วยดัชนีเดียวกันกับ xdata_train
  4. ตั้งค่าตัวจําแนกฟอเรสต์แบบสุ่มโดยใช้ Scikit เรียนรู้เพื่อทำนาย ydata_train ตาม xdata_train
  5. ใช้การทดสอบการตรวจสอบข้ามการเรียนรู้ของ Scikit-Learn เพื่อปรับแต่งพารามิเตอร์และปรับแต่งความแม่นยำ (ปรับแต่งจำนวนหน้ายอดนิยมจำนวนต้นไม้ขนาดใบมินเป็นต้น)
  6. ตัวแยกประเภทฟอเรสต์แบบสุ่มและรายการของเพจยอดนิยมส่วนใหญ่ที่มีการดอง
  7. โหลดข้อมูลที่เหลือของคุณโหลดรายการหน้าเว็บยอดนิยม (ถ้าจำเป็น) และทำซ้ำขั้นตอนที่ 2 เพื่อสร้าง xdata_new
  8. โหลดตัวแยกประเภทฟอเรสต์แบบสุ่ม (ถ้าจำเป็น) และใช้เพื่อทำนายค่าสำหรับข้อมูล xdata_new
  9. ส่งออกคะแนนที่คาดการณ์ไปยัง CSV ใหม่หรือรูปแบบผลลัพธ์อื่น ๆ ที่คุณเลือก

ในกรณีของคุณคุณจะต้องสลับลักษณนามสำหรับ regressor (ดูที่นี่: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ) แต่อย่างอื่นกระบวนการเดียวกัน ควรทำงานได้อย่างไม่มีปัญหา

นอกจากนี้คุณควรตระหนักถึงคุณสมบัติที่น่าทึ่งที่สุดของป่าสุ่มใน Python: การขนานแบบทันที! พวกเราที่เริ่มต้นทำสิ่งนี้ใน R แล้วย้ายมาประหลาดใจอยู่เสมอโดยเฉพาะอย่างยิ่งเมื่อคุณได้ทำงานกับเครื่องที่มีแกนไม่กี่โหล (ดูที่นี่: http://blog.yhathq.com/posts/comparing- random-jungle-in-python-and-r.html )

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

โชคดี!


2
สิ่งที่น่าสนใจอย่างหนึ่งของการใช้ไซต์ 5000 อันดับแรกคือข้อเท็จจริงที่ว่าพวกเขาอาจไม่สามารถแบ่งกลุ่มผู้ใช้ตามอายุได้ ไซต์ยอดนิยมโดยการก่อสร้างเป็นไซต์ที่ทุกคนเข้าชม พวกเขาจึงไม่ดีในการแบ่งกลุ่มผู้ใช้ของคุณเนื่องจากการจำแนกประเภท (อายุ) ที่เป็นไปได้ทั้งหมดได้มีส่วนร่วมกับเว็บไซต์เหล่านั้น นี่เป็นแนวคิดที่คล้ายคลึงกับส่วน idf ของ tf-idf idf ช่วยกรองสัญญาณรบกวน "ทุกคนมีคุณสมบัตินี้" ไซต์ที่เข้าชมมากที่สุดจัดอันดับเป็นคุณลักษณะในแปลงความสำคัญของตัวแปรด้วย RF ของคุณอย่างไร
cwharland

1
จุดดี. การแก้ไขที่ง่ายสำหรับเรื่องนี้คือการแบ่งกลุ่มชุดข้อมูลการฝึกอบรมลงในถังขยะอายุ J (เช่น 13-16, 17-20, 21-24 ฯลฯ ) และนำหน้า (K / J) ชั้นนำสำหรับแต่ละกลุ่ม เพื่อให้แน่ใจว่าคุณมีตัวแทนที่สำคัญสำหรับแต่ละกลุ่ม จะมีการทับซ้อนกันระหว่างกลุ่มดังนั้นถ้าคุณจู้จี้จุกจิกจริงๆคุณอาจต้องการที่จะนำหน้าพิเศษ (K / J) ที่ไม่ซ้ำสำหรับแต่ละกลุ่ม แต่ฉันคิดว่ามันอาจเกินความเป็นจริง
Therriault

5

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

Sklearn เสนอแพ็คเกจsklearn.linear_model.LogisticRegressionที่ออกแบบมาเพื่อจัดการข้อมูลที่กระจัดกระจายเช่นกัน

ดังที่ได้กล่าวถึงในความคิดเห็นในกรณีปัจจุบันที่มีตัวแปรอินพุตมากกว่าตัวอย่างคุณจะต้องทำให้โมเดลเป็นปกติ (ด้วยsklearn.linear_model.LogisticRegressionใช้penalty='l1'อาร์กิวเมนต์)


1
ด้วย LR คุณจะต้องสร้างแบบจำลองหลายแบบสำหรับถังขยะอายุฉันคิดว่า จะเปรียบเทียบสองแบบจำลองสำหรับถังขยะอายุที่แตกต่างกันซึ่งคาดการณ์ปัญหาเดียวกันในการรวมสำหรับผู้ใช้อย่างไร
cwharland

1
โปรดทราบว่า LR ล้มเหลวเมื่อมีตัวแปรมากกว่าการสังเกตและทำงานได้ไม่ดีหากข้อสันนิษฐานของโมเดลไม่เป็นไปตาม หากต้องการใช้งานการลดขนาดจะต้องเป็นขั้นตอนแรก
Christopher Louden

1
@ cwharland คุณไม่ควรพิจารณาตัวแปรการตอบสนองที่จะจัดหมวดหมู่ตามที่ต่อเนื่องโดยธรรมชาติและ discretized ตามคำนิยามปัญหา เมื่อพิจารณาอย่างละเอียดแล้วจะหมายถึงการบอกอัลกอริทึมที่ทำนายอายุ 16 เมื่อจริง ๆ แล้วคือ 17 เป็นข้อผิดพลาดที่ร้ายแรงเมื่อทำนาย 30 เมื่อจริง ๆ แล้วคือ 17 การพิจารณามันต่อเนื่องทำให้แน่ใจว่าข้อผิดพลาดเล็ก ๆ (16 vs 17) 30 กับ 17) ถือว่ามีขนาดใหญ่ การถดถอยโลจิสติกถูกนำมาใช้ในกรณีนี้เพื่อทำนายค่าอย่างต่อเนื่องและไม่ประมาณความน่าจะเป็นหลัง
damienfrancois

@ChristopherLouden คุณถูกต้องแล้วว่าการถดถอยโลจิสติกในรุ่นวานิลลาไม่เหมาะกับกรณี 'large p small n' ฉันควรจะกล่าวว่าการทำให้เป็นระเบียบเป็นสิ่งสำคัญในกรณีปัจจุบัน ฉันอัพเดตคำตอบของฉัน แต่ LR ที่ทำให้เป็นมาตรฐาน L1 นั้นเป็นการเลือกคุณสมบัติดังนั้นฉันคิดว่าไม่จำเป็นต้องใช้ขั้นตอน FS ขั้นต้น
damienfrancois

@damienfrancois: ฉันเห็นด้วยอย่างแน่นอน ฉันแค่กังวลเล็กน้อยว่าในกรณีนี้ LR จะลงโทษค่ากลางอย่างรุนแรงเกินไป ดูเหมือนจะไม่มีแรงจูงใจในการทำแผนที่ไปยัง sigmoidal เหมือนส่วนโค้งเนื่องจากคุณไม่สนใจค่าอายุที่มากเกินไป บางทีฉันอาจตีความการใช้ผิด ๆ
cwharland

4

งานวิจัยบางส่วนจากD. Nguyen และคณะ พยายามทำนายอายุของผู้ใช้ Twitter โดยใช้ทวีตของพวกเขา บางทีคุณอาจพบว่ามีประโยชน์ พวกเขาใช้การถดถอยโลจิสติกและเชิงเส้น


3

นอกเหนือจากวิธีการที่นักเล่นที่คุณสามารถลองสูตร Bayes

P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))

P (I | p1 ... pn) เป็นความน่าจะเป็นที่ผู้ใช้อยู่ในกลุ่มอายุฉันถ้าเขาชอบ p1, .. , pn

P (i) คือความน่าจะเป็นที่ผู้ใช้อยู่ในกลุ่มอายุ i

P (p1 .. pn | i) คือความน่าจะเป็นที่ผู้ใช้ชอบ p1, .. , pn ถ้าเขาอยู่ในกลุ่มอายุ i

  • คุณมีค่าประมาณสำหรับ P (i) จากข้อมูลของคุณแล้ว: นี่เป็นเพียงสัดส่วนของผู้ใช้ในกลุ่มอายุ I
  • ในการประมาณค่า P (p1 ... pn | i) สำหรับแต่ละกลุ่มอายุฉันประมาณความน่าจะเป็น (ความถี่) p_ij ให้เหมือนกับหน้า j หากต้องการให้ p_ij ไม่เป็นศูนย์สำหรับ j ทั้งหมดคุณสามารถผสมในความถี่สำหรับประชากรทั้งหมดด้วยน้ำหนักขนาดเล็ก

  • จากนั้นบันทึก P (p1 ... pn | i) = sum (บันทึก p_ij, i = p1, .. , pn), ผลรวมของทุกหน้าที่ผู้ใช้ใหม่ชอบ สูตรนี้จะเป็นจริงโดยประมาณโดยสมมติว่าผู้ใช้ชอบหน้าเว็บในกลุ่มอายุของเขาอย่างอิสระ

  • ในทางทฤษฎีคุณควรเพิ่ม log (1-p_ij) สำหรับ i ทั้งหมดที่เขาไม่ชอบ แต่ในทางปฏิบัติคุณควรพบว่าผลรวมของ log (1-p_ij) จะมีขนาดเล็กมากดังนั้นคุณจึงไม่ต้องการ หน่วยความจำมาก

หากคุณหรือคนอื่นได้ลองแล้วโปรดแสดงความคิดเห็นเกี่ยวกับผลลัพธ์


2

นี่เป็นปัญหาที่น่าสนใจมาก

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

  • แทนที่จะเชื่อมโยงข้อมูลกับทุกวัย (15 yo, 27 yo, ... ) สิ่งที่ฉันทำคือการสร้างกลุ่มอายุที่แตกต่างกัน: น้อยกว่า 18 จาก 18 เป็น 30 และมากกว่า 30 (นี่เป็นเพราะปัญหาเฉพาะที่เราเป็น แต่คุณสามารถเลือกช่วงเวลาใดก็ได้ที่คุณต้องการ) แผนกนี้ช่วยแก้ไขปัญหาได้มากมาย
  • หลังจากนั้นฉันสร้างการจัดกลุ่มตามลำดับชั้น (หารหรือรวม) จากนั้นฉันเลือกสาขาเหล่านั้นที่ฉันมีผู้ใช้ที่มีอายุรู้จัก (หรืออายุกลุ่ม) และจากนั้นสำหรับสาขานั้นฉันขยายอายุเดียวกันให้กับกลุ่มนั้น

วิธีนี้เป็นการเรียนรู้แบบกึ่งกำกับและฉันแนะนำในกรณีที่คุณมีข้อมูลบางส่วนเท่านั้น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.