फेसबुक साइटों पर उपयोगकर्ताओं की उम्र का अनुमान लगाने के लिए मशीन सीखने की तकनीक जो उन्हें पसंद है


25

मेरे पास मेरे फेसबुक एप्लिकेशन का एक डेटाबेस है और मैं उपयोगकर्ताओं की उम्र का अनुमान लगाने के लिए मशीन सीखने का उपयोग करने की कोशिश कर रहा हूं, जो कि वे फेसबुक साइट को पसंद करते हैं।

मेरे डेटाबेस की तीन महत्वपूर्ण विशेषताएं हैं:

  • मेरे प्रशिक्षण सेट में उम्र का वितरण (योग में उपयोगकर्ताओं का 12k) युवा उपयोगकर्ताओं (यानी मेरे पास 1157 उपयोगकर्ता हैं जिनकी आयु 27 वर्ष है, और 65 वर्ष की आयु के 23 उपयोगकर्ता हैं)

  • कई साइटों में 5 से अधिक लाइक नहीं हैं (मैंने 5 लाइबर्स से कम एफबी साइटों को फ़िल्टर किया है)।

  • नमूनों की तुलना में कई और विशेषताएं हैं।

तो, मेरे सवाल हैं: आगे की विश्लेषण के लिए डेटा तैयार करने के लिए आप क्या रणनीति सुझाएंगे? क्या मुझे किसी प्रकार की आयामी कमी करनी चाहिए? इस मामले में किस एमएल विधि का उपयोग करना सबसे उपयुक्त होगा?

मैं मुख्य रूप से पायथन का उपयोग करता हूं, इसलिए पायथन-विशिष्ट संकेत बहुत सराहना करेंगे।


1
जब आप कहते हैं, "नमूनों की तुलना में कई और विशेषताएं" मेरा मानना ​​है कि आपको पसंद की जाने वाली साइटों की अद्वितीय संख्या >> संख्या उपयोगकर्ता है। क्या यह साइटों के रूट डोमेन के लिए भी मामला है? यानी वे साइटों में youtube.com या cnn.com यूआरएल के एक नंबर हैं या वे पहले से ही डोमेन के लिए उपजी हैं? यदि संभव हो तो विशिष्ट पृष्ठों की बजाय URL को डोमेन की जड़ों तक गिराने से मैं आयामीता में कमी की ओर झुक रहा हूं।
cwharland

उत्तर के लिए धन्यवाद। सुविधाओं (अद्वितीय पसंद की गई साइट) की संख्या 32k है, जबकि नमूनों (उपयोगकर्ताओं) की संख्या 12k है। सुविधाएँ फेसबुक पेज हैं, इसलिए URLs को स्टेम करने की कोई आवश्यकता नहीं है। एक उपयोगकर्ता facebook.com/cnn पसंद कर सकता है या नहीं। मुझे उनके द्वारा साझा किए गए लिंक के आधार पर उपयोगकर्ताओं की उम्र का अनुमान लगाने की कोशिश करने का विचार पसंद है, हालाँकि :)
वोज्शिएक वाल्गायक

अहह, मुझे पसंद की गई साइटों का वर्णन गलत लगा। स्पष्टीकरण के लिए धन्यवाद।
cwharland

जवाबों:


16

के साथ शुरू करने के लिए एक चीज k-NN होगी। यहां विचार यह है कि आपके पास उपयोगकर्ता / आइटम मैट्रिक्स है और कुछ उपयोगकर्ताओं के लिए आपकी रिपोर्ट की गई आयु है। उपयोगकर्ता आइटम मैट्रिक्स में किसी व्यक्ति के लिए आयु कुछ अच्छी तरह से निर्धारित की जा सकती है जैसे कि आइटम स्थान में कुछ निकटतम पड़ोसियों के औसत या औसत आयु।

तो आपके पास प्रत्येक उपयोगकर्ता को आइटम स्थान में एक वेक्टर के रूप में व्यक्त किया गया है, k निकटतम पड़ोसियों को ढूंढें और प्रश्न में वेक्टर को निकटतम पड़ोसी युग के कुछ सारांश स्टेट को असाइन करें। आप एक दूरी कटऑफ पर k या अधिक वास्तविक रूप से चुन सकते हैं कि पुनरावृत्त रूप से एक ट्रेन पकड़ के युगों को असाइन करना और उस असाइनमेंट में त्रुटि को कम करने वाले k को चुनना।

यदि आयामीता एक समस्या है, तो आप आसानी से इस सेटअप में कमी कर सकते हैं एकल मूल्य अपघटन द्वारा एम वैक्टर को चुनना जो पूरे समूह में सबसे अधिक विचरण को पकड़ता है।

सभी मामलों में चूंकि प्रत्येक सुविधा द्विआधारी है, ऐसा लगता है कि कोसाइनिटी ​​समानता दूरी मीट्रिक पर आपकी जाएगी।

मुझे अन्य दृष्टिकोणों (प्रतिगमन, आरएफ, आदि ...) के बारे में थोड़ा और सोचने की आवश्यकता है, जो कि आपके फ़ीचर स्पेस (एक ही एक्शन के सभी वेरिएंट) को ध्यान में रखते हुए दिया गया है, मुझे लगता है कि उपयोगकर्ता / आइटम का दृष्टिकोण सबसे अच्छा हो सकता है।

सावधानी के एक नोट, यदि आपके पास ट्रेन के लिए उम्र है, तो आपको सूचित किया जाता है कि आपको उनमें से कुछ को सही करने की आवश्यकता हो सकती है। फ़ेसबुक पर लोग पैदा होने वाले दशक में उम्र की रिपोर्ट करते हैं। जन्म की तारीखों (उम्र से प्राप्त) का हिस्टोग्राम प्लॉट करें और देखें कि क्या आपके पास 70, 80, 90 के दशक जैसे दशकों में स्पाइक्स हैं।


नमस्ते, आपका उत्तर मेरी वास्तविक रणनीति से काफी मिलता-जुलता है। मैंने sklearn.neighbors.KNeighborsRegressorएसवीडी-कम स्थान पर कोसाइन मीट्रिक के साथ उपयोग किया (एसवीडी लागू करने के बाद औसत अनुमान त्रुटि ~ 6 साल से ~ 4 तक चली गई)। मेरे डेटाबेस में उपयोगकर्ता 18-65 आयु वर्ग के हैं (पुराने उपयोगकर्ताओं को फ़िल्टर किया गया था), इसलिए 48 संभावित वर्ग हैं। मुझे आश्चर्य है कि क्या केएनएन के लिए बहुत अधिक कक्षाएं नहीं हैं, और क्या मुझे इसे प्रतिगमन या एक वर्गीकरण समस्या के रूप में मानना ​​चाहिए (मुझे लगता है कि दोनों लागू होते हैं)।
वोज्शिएक वाल्कैक

मैं कह सकता हूं, कि मैं कक्षा के रैंडम फॉरेस्ट का उपयोग कई वर्गों को व्यक्तिगत रूप से फिट करने के लिए करता हूं, फिर उन मॉडलों में से प्रत्येक के परिणामों को विभिन्न तरीकों से जोड़ दिया। इस मामले में, आप केएनएन के साथ प्रत्येक उपयोगकर्ता की उम्र के लिए पूर्व संभाव्यता को निर्दिष्ट करने के बारे में भी सोच सकते हैं, फिर प्रत्येक वर्ग आधारित मॉडल के माध्यम से चला सकते हैं, प्रत्येक वर्ग के लिए पूर्व संभाव्यता को अद्यतन करने के लिए उन स्कोर का उपयोग कर सकते हैं और उन पोस्टएयर से सबसे संभावित वर्ग का चयन कर सकते हैं। यह थोड़ा उलझा हुआ लगता है, लेकिन सबसे खराब रूप से आपके पास kNN सटीकता होगी।
cwharland

7

मैंने हाल ही में पायथन में एक समान प्रोजेक्ट किया था (डेटा की तरह एफबी का उपयोग करके राय की भविष्यवाणी), और निम्नलिखित मूल प्रक्रिया के साथ अच्छे परिणाम थे:

  1. प्रशिक्षण सेट में पढ़ें (n = N) कॉमा से अधिक सीमांकित द्वारा रिकॉर्ड लाइन-बाय-लाइन की तरह और सबसे लोकप्रिय पृष्ठों की पहचान करने के लिए एक काउंटर का उपयोग करें
  2. K के सबसे लोकप्रिय पृष्ठों में से प्रत्येक के लिए (मैंने लगभग 5000 का उपयोग किया था, लेकिन आप विभिन्न मूल्यों के साथ खेल सकते हैं), पंडों का उपयोग करें। DataFrame.isin यह परीक्षण करने के लिए कि क्या प्रशिक्षण सेट में प्रत्येक व्यक्ति प्रत्येक पृष्ठ को पसंद करता है, तो एक N x K का डेटाफ्रेम बनाएं परिणामों का (मैं इसे xdata_train कहूँगा)
  3. एक श्रृंखला बनाएं (मैं इसे ydata_train कहूंगा) जिसमें सभी परिणाम चर (मेरी स्थिति में, आपकी उम्र में) xdata_train के समान सूचकांक के साथ होंगे
  4. Xdata_train पर आधारित ydata_train की भविष्यवाणी करने के लिए scikit-learn के माध्यम से एक यादृच्छिक वन क्लासिफायरियर सेट करें
  5. मापदंडों को परिशोधित करने और सटीकता को परिष्कृत करने के लिए स्किकिट-लर्न-क्रॉस-टेस्टिंग परीक्षण का उपयोग करें (लोकप्रिय पृष्ठों की संख्या, पेड़ों की संख्या, न्यूनतम पत्ती का आकार, आदि)।
  6. यादृच्छिक वन क्लासिफ़ायर और अचार के साथ सबसे लोकप्रिय पृष्ठों की सूची (या यदि आप एक ही बार में सब कुछ कर रहे हैं तो याद रखें)
  7. अपने शेष डेटा में लोड करें, लोकप्रिय पृष्ठों की सूची लोड करें (यदि आवश्यक हो), और xdata_new का उत्पादन करने के लिए चरण 2 को दोहराएं
  8. यादृच्छिक वन क्लासिफ़ायर (यदि आवश्यक हो) लोड करें और xdata_new डेटा के लिए मूल्यों की भविष्यवाणी करने के लिए इसका उपयोग करें
  9. एक नए CSV या अपने चयन के अन्य आउटपुट स्वरूप के लिए अनुमानित अंकों का उत्पादन करें

अपने मामले में, आपको एक रजिस्ट्रार के लिए क्लासिफायर को स्वैप करना होगा (इसलिए यहां देखें: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRedoror.html ) लेकिन अन्यथा वही प्रक्रिया ज्यादा परेशानी के बिना काम करना चाहिए।

इसके अलावा, आपको पायथन में यादृच्छिक जंगलों की सबसे आश्चर्यजनक विशेषता के बारे में पता होना चाहिए: तत्काल समानांतरकरण! हम में से जो आर में ऐसा करने लगे और फिर आगे बढ़ गए, वे हमेशा चकित रह गए, खासकर जब आपको कुछ दर्जन कोर के साथ मशीन पर काम करना पड़ता है (यहाँ देखें: http://blog.yhathq.com/posts/comparing- यादृच्छिक-जंगलों में अजगर और r.html )।

अंत में, ध्यान दें कि यह नेटवर्क विश्लेषण के लिए एक सही अनुप्रयोग होगा यदि आपके पास मित्रों के साथ-साथ स्वयं व्यक्तियों का भी डेटा है। यदि आप किसी उपयोगकर्ता के दोस्तों की उम्र का विश्लेषण कर सकते हैं, तो उपयोगकर्ता की उम्र लगभग निश्चित रूप से एक या दो साल के भीतर उसके दोस्तों के बीच होगी, खासकर अगर उपयोगकर्ता युवा हैं, जबकि अभी भी अपने दोस्त नेटवर्क का निर्माण कर चुके हैं स्कूल (चूंकि अधिकांश सहपाठी होंगे)। इस भविष्यवाणी की संभावना है कि आप मॉडलिंग से जो भी प्राप्त करेंगे --- यह एक समस्या का एक पाठ्यपुस्तक उदाहरण है जहां सही डेटा> हर बार सही मॉडल।

सौभाग्य!


2
शीर्ष 5000 साइटों का उपयोग करने का एक दिलचस्प पहलू यह है कि वे उपयोगकर्ताओं को उम्र में खंडित करने में अच्छे नहीं हो सकते हैं। शीर्ष साइटें, निर्माण के द्वारा, वे हैं जो सभी का दौरा करती हैं। इसलिए वे अपने उपयोगकर्ताओं को खंडित करने में बहुत अच्छे नहीं हैं क्योंकि सभी संभावित वर्गीकरण (उम्र) उन साइटों के साथ लगे हुए हैं। यह tf-idf के निष्क्रिय भाग के समान धारणा है। आईडीएफ "हर किसी के पास यह सुविधा है" शोर को फ़िल्टर करने में मदद करता है। आपके आरएफ के साथ चर महत्व के भूखंडों में सुविधाओं के रूप में सबसे अधिक देखी जाने वाली साइटें कैसे रैंक करती हैं?
cwharland

1
अच्छी बात। इसके लिए एक आसान निर्धारण यह होगा कि प्रशिक्षण डेटासेट को J उम्र के डिब्बे (जैसे, १३-१६, १ ,-२०, २१-२४, आदि) में विभाजित करें और प्रत्येक समूह के लिए शीर्ष (K / J) पृष्ठ लें। यह सुनिश्चित करेगा कि आपके पास प्रत्येक समूह के लिए महत्वपूर्ण प्रतिनिधित्व हो। निश्चित रूप से समूहों में कुछ ओवरलैप होंगे, इसलिए यदि आप वास्तव में योग्य थे, तो आप प्रत्येक समूह के लिए शीर्ष (K / J) अद्वितीय पृष्ठ लेना चाह सकते हैं, लेकिन मुझे लगता है कि यह ओवरकिल हो सकता है।

5

एक अन्य सुझाव लॉजिस्टिक रिग्रेशन का परीक्षण करना है । एक अतिरिक्त बोनस के रूप में, मॉडल का वजन (गुणांक) आपको यह अनुमान लगाएगा कि कौन सी साइटें उम्र-विचलित हैं।

Sklearn sklearn.linear_model.ogisticRegression पैकेज प्रदान करता है जिसे विरल डेटा के साथ-साथ संभालने के लिए डिज़ाइन किया गया है।

जैसा कि टिप्पणियों में उल्लेख किया गया है, वर्तमान मामले में, नमूनों की तुलना में अधिक इनपुट चर के साथ, आपको मॉडल को नियमित करने की आवश्यकता है ( sklearn.linear_model.ogisticRegressionpenalty='l1' तर्क का उपयोग करें )।


1
एलआर के साथ आपको लगता है कि मुझे लगता है कि उम्र के डिब्बे के लिए कई मॉडल बनाने होंगे। अलग-अलग उम्र के डिब्बे के लिए दो मॉडलों की तुलना कैसे होगी जो एक उपयोगकर्ता के लिए समावेश पर एक ही संभावना की भविष्यवाणी करते हैं?
cwharland

1
ध्यान दें कि एलआर विफल रहता है जब टिप्पणियों की तुलना में अधिक चर होते हैं और मॉडल की मान्यताओं को पूरा नहीं होने पर खराब प्रदर्शन करते हैं। इसका उपयोग करने के लिए, आयामीता में कमी पहला कदम होना चाहिए।
क्रिस्टोफर लाउडेन

1
@cwharland आपको प्रतिक्रिया चर को श्रेणीबद्ध नहीं मानना ​​चाहिए क्योंकि यह प्रकृति द्वारा जारी है, और समस्या की परिभाषा से अलग है। इसे स्पष्ट करने पर विचार करने का अर्थ होगा कि एल्गोरिथ्म बता रहा है कि 16 वर्ष की आयु होने पर 16 वर्ष की भविष्यवाणी करना एक गंभीर त्रुटि है जबकि 30 की भविष्यवाणी करना वास्तव में 17 वर्ष है। इसे निरंतर मानते हुए यह सुनिश्चित करता है कि छोटी त्रुटियां (16 बनाम 17) छोटी और बड़ी त्रुटियां मानी जाएं। 30 बनाम 17) को बड़ा माना जाता है। लॉजिस्टिक रिग्रेशन का उपयोग इस मामले में निरंतर मूल्य की भविष्यवाणी करने और उत्तरवर्ती संभावनाओं का अनुमान नहीं लगाने के लिए किया जाता है।
डेमियनफ्रैंकोइस

@ChristopherLouden आप सही हैं कि लॉजिस्टिक रिग्रेशन का वैनिला संस्करण 'बड़े पी छोटे एन' केस के लिए उपयुक्त नहीं है, मुझे यह उल्लेख करना चाहिए था कि वर्तमान मामले में नियमितीकरण महत्वपूर्ण है। मैं अपना जवाब अपडेट करता हूं। लेकिन एल 1-नियमित एलआर एक तरह की सुविधा का चयन है, इसलिए मुझे प्रारंभिक एफएस कदम की कोई आवश्यकता नहीं है।
डेमियनफ्रैंकोइस

@ एडमियनफ्रैंकोइस: मैं निश्चित रूप से सहमत हूं। मैं थोड़ा चिंतित हूं कि इस मामले में एलआर मध्यवर्ती मूल्यों को बहुत कठोर रूप से दंडित करेगा। प्रतीत होता है कि वक्र जैसे सिग्मोयडल को मैप करने के लिए कोई प्रेरणा नहीं दी गई है जो कि आप विशेष रूप से चरम आयु के मूल्यों में रुचि नहीं रखते हैं। शायद मैं हालांकि उपयोग गलत कर रहा हूँ।
cwharland

4

डी। गुयेन एट अल के कुछ शोध उनके ट्वीट के आधार पर ट्विटर उपयोगकर्ता की उम्र का अनुमान लगाने की कोशिश करें। शायद आप उन्हें उपयोगी पाते हैं। वे लॉजिस्टिक और लीनियर रिग्रेशन का उपयोग करते हैं।


3

धर्मांध तरीकों के अलावा आप बेयस फॉर्मूला आजमा सकते हैं

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

P (I | p1 ... pn) सम्भावना है कि कोई उपयोगकर्ता आयु वर्ग I का है यदि उसे p1, .., pn पसंद है

पी (i) संभावना है कि उपयोगकर्ता आयु वर्ग i से संबंधित है

P (p1 .. pn | i) संभावना है कि एक उपयोगकर्ता को p1 पसंद है, .., pn अगर वह आयु वर्ग से संबंधित है i।

  • आपके डेटा से P (i) के लिए आपके पास पहले से ही अनुमान है: यह आयु वर्ग I के उपयोगकर्ताओं का अनुपात है।
  • P का अनुमान लगाने के लिए (p1 ... pn | i), प्रत्येक आयु समूह के लिए, मैं पृष्ठ j की तरह प्रायिकता (आवृत्ति) p_ij का अनुमान लगाता हूं। सभी j के लिए p_ij गैर-शून्य होने के लिए, आप एक छोटे वजन के साथ पूरी आबादी के लिए आवृत्ति में मिश्रण कर सकते हैं।

  • उसके बाद P (p1 ... pn | i) = sum (log p_ij, i = p1, .., pn), उन सभी पेजों पर योग करें जिन्हें एक नया उपयोगकर्ता पसंद करता है। यह सूत्र लगभग सही होगा कि एक उपयोगकर्ता स्वतंत्र रूप से अपने आयु वर्ग के पृष्ठों को पसंद करता है।

  • सैद्धांतिक रूप से, आपको उन सभी के लिए लॉग (1-p_ij) भी जोड़ना चाहिए जो उसे पसंद नहीं हैं, लेकिन व्यवहार में आपको पता लगाना चाहिए कि लॉग का योग (1-p_ij) अप्रासंगिक रूप से छोटा होगा, इसलिए आपको इसकी आवश्यकता भी नहीं होगी बहुत याददाश्त।

यदि आपने या किसी और ने यह कोशिश की है, तो कृपया परिणाम के बारे में टिप्पणी करें।


2

यह एक बहुत ही दिलचस्प समस्या है।

उपयोगकर्ताओं द्वारा सोशल नेटवर्क पर अपलोड की गई तस्वीरों का विश्लेषण करके मैंने इसी तरह का सामना किया। मैंने निम्नलिखित दृष्टिकोण किया:

  • डेटा को उम्र से जोड़ने के बजाय (15 यो, 27 यो, ...) मैंने जो किया वह उम्र के विभिन्न समूहों को स्थापित करने के लिए है: 18 से कम, 18 से 30 तक और 30 से अधिक (यह उस विशिष्ट समस्या के कारण है जो हम थे सामना करना पड़ रहा है, लेकिन आप जो चाहें अंतराल चुन सकते हैं)। यह विभाजन समस्या को हल करने में बहुत मदद करता है।
  • बाद में, मैंने एक पदानुक्रमिक क्लस्टरिंग (विभाजन या समुच्चय) बनाया। फिर मैं उन शाखाओं को चुनता हूं, जहां मेरे पास ज्ञात आयु (या समूह युग) वाले उपयोगकर्ता थे और फिर उस शाखा के लिए मैंने उसी आयु को उस समूह में बढ़ाया।

यह दृष्टिकोण अर्ध-पर्यवेक्षणीय शिक्षण है और मैंने आपको केवल कुछ डेटा लेबल होने की स्थिति में इसकी अनुशंसा की है।

कृपया, ध्यान दें कि सोशल नेटवर्क पर, लोग आमतौर पर उम्र के बारे में झूठ बोलते हैं (केवल मनोरंजन के लिए, या कभी-कभी क्योंकि वे खुद को सामाजिक जाल पर बाँधना चाहते हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.