स्पार्क ALS: नए उपयोगकर्ताओं के लिए सिफारिश करना


10

प्रश्न

स्पार्क में प्रशिक्षित एएलएस मॉडल में नए उपयोगकर्ता के लिए रेटिंग की भविष्यवाणी कैसे करूं? (प्रशिक्षण समय के दौरान नया नहीं देखा गया)

समस्या

मैं यहाँ आधिकारिक स्पार्क ए एल एस ट्यूटोरियल का अनुसरण कर रहा हूँ:

http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html

मैं एक अच्छे MSE के साथ एक अच्छे रेंडर का निर्माण करने में सक्षम हूं, लेकिन मॉडल के नए डेटा को कैसे इनपुट करना है, इसके साथ संघर्ष कर रहा हूं। ट्यूटोरियल पहले उपयोगकर्ता की रेटिंग को प्रशिक्षण से पहले बदल देता है, लेकिन यह वास्तव में एक हैक है। वे निम्नलिखित संकेत देते हैं:

9.2। मैट्रिक्स कारक बढ़ाना:

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

हालांकि कार्यान्वयन मुझे बिल्कुल मदद नहीं करता है। आदर्श रूप में, मैं कुछ इस तरह की तलाश में हूँ:

predictions = model.predictAllNew(newinput)

लेकिन ऐसी कोई विधि मौजूद नहीं है। मैं मूल आरडीडी को जा सकता था और संशोधित कर सकता था, लेकिन मुझे लगता है कि मुझे मॉडल को फिर से अपनाने की आवश्यकता होगी, इसलिए यह एक आदर्श समाधान भी नहीं होगा। निश्चित रूप से एक और अधिक सुंदर तरीका होना चाहिए?

मैं अभी कहाँ हूँ:

मुझे लगता है कि मुझे नए वेक्टर के अव्यक्त प्रतिनिधित्व को खोजने की आवश्यकता है। मूल कागज के अनुसार हम इसकी गणना इस तरह कर सकते हैं:

एक्सयू=(YटीसीयूY+λमैं)-1Yटीसीयूपी(यू)

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

मेरा वर्तमान प्रयास:

V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y

Cui =  alpha * np.abs(newinput)
Cui =  (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)

lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term   = np.dot(np.dot(Vt,Cui),V)+lambdaI
term   = np.dot(np.linalg.inv(term),Vt)
term   = np.dot(term,Cui)
term   = np.dot(term,newinput)
latentinput = term

लेकिन यह मेल नहीं खाता।

जवाबों:


9

यहाँ बहुत सारे प्रश्न। पहला, बिना किसी डेटा वाले वास्तव में नए उपयोगकर्ता के लिए, एक सिफारिश करने वाले मॉडल का उपयोग करने का कोई तरीका नहीं है। यदि आपके पास शाब्दिक रूप से उपयोगकर्ता पर कोई जानकारी नहीं है, तो केवल एक चीज जो आप कर सकते हैं, वह है कुछ डिफ़ॉल्ट सिफारिशें।

बेशक, एक बार जब आपके पास कोई डेटा होता है, और आप उपयोगकर्ता को शामिल करने के लिए मॉडल का पुनर्निर्माण कर सकते हैं, तो आप सिफारिशें कर सकते हैं। आप स्पार्क में ऐसा कर सकते हैं लेकिन आप पहले से ही जानते हैं। यदि आपको रनटाइम पर नए उपयोगकर्ताओं के बारे में जानकारी जोड़ने की आवश्यकता है, तो यह बहुत लंबा होगा। जो तकनीक आप चाहते हैं उसे "फोल्ड-इन" कहा जाता है, यह पता लगाने के लिए उपयोग किया जाता है कि उपयोगकर्ता द्वारा इंटरेक्ट किए गए आइटमों को नया उपयोगकर्ता वेक्टर क्या है (लगभग)। यह सिर्फ कुछ रैखिक बीजगणित है और आपके द्वारा दिए गए समीकरण से अनुसरण करता है।

मैंने एक पुरानी स्लाइड खोली जो मदद कर सकती है:

ALS फोल्ड-इन

"Cu" वास्तव में अलग नहीं है। मैंने नकारात्मक इनपुट के मामले को संभालने के लिए एक 'एक्सटेंशन' जोड़ा, लेकिन यह सकारात्मक इनपुट के लिए समान है।

यहाँ फोल्ड-इन का कार्यान्वयन है, हालांकि मुझे लगता है कि यह बहुत अधिक मूल्य का होने वाला है।

https://github.com/OryxProject/oryx/blob/2c01d496f93f2825a076eb7fe492aa39a5290aa6/app/oryx-app-common/src/main/java/com/cloudera/oryx/app/als/ALSUtils.java#L74

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

आशा है कि सही दिशा में एक धक्का है।

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