रिप्रज़ेंटेशन: फ़ीचर इंजीनियरिंग

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

रॉ डेटा को सुविधाओं के साथ मैप करना

इमेज 1 की बाईं ओर, इनपुट डेटा सोर्स का रॉ डेटा दिखाया गया है. दाईं ओर फ़ीचर वेक्टर को दिखाता है, जो आपके डेटा सेट के उदाहरणों वाले फ़्लोट-पॉइंट वैल्यू का सेट होता है. फ़ीचर इंजीनियरिंग का मतलब है रॉ डेटा को फ़ीचर वेक्टर में बदलना. फ़ीचर इंजीनियरिंग पर काम करने में बहुत समय लगता है.

कई मशीन लर्निंग मॉडल को सुविधाओं को, असली संख्या वाले वेक्टर के तौर पर दिखाना चाहिए, क्योंकि सुविधा की वैल्यू को मॉडल के वज़न से गुणा करना होगा.

रॉ डेटा को फ़ीचर इंजीनियरिंग नाम की प्रोसेस के ज़रिए, फ़ीचर वेक्टर से मैप किया जाता है.

पहली इमेज. फ़ीचर इंजीनियरिंग, मशीन लर्निंग की सुविधाओं में रॉ डेटा को मैप करती है.

संख्या वाली वैल्यू को मैप करना

पूर्णांक और फ़्लोटिंग-पॉइंट डेटा को कोड में बदलने के लिए किसी खास तरह की ज़रूरत नहीं होती, क्योंकि उन्हें किसी संख्या के वज़न से गुणा किया जा सकता है. जैसा कि इमेज 2 में बताया गया है, रॉ पूर्णांक 6 को सुविधा की वैल्यू 6.0 में बदलना बहुत आसान है:

ऐसी सुविधा का उदाहरण जिसे रॉ डेटा से सीधे कॉपी किया जा सकता है

दूसरा डायग्राम. पूर्णांक वैल्यू को फ़्लोटिंग-पॉइंट वैल्यू पर मैप करना.

कैटगरी से जुड़ी वैल्यू को मैप करना

कैटगरिकल सुविधाओं में संभावित वैल्यू का एक अलग सेट होता है. उदाहरण के लिए, street_name नाम की एक सुविधा हो सकती है, जिसमें ये विकल्प हो सकते हैं:

{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}

मॉडल, स्ट्रिंग को सीखे गए भार से गुणा नहीं कर सकते, इसलिए हम स्ट्रिंग को न्यूमेरिक वैल्यू में बदलने के लिए फ़ीचर इंजीनियरिंग का इस्तेमाल करते हैं.

हम सुविधा की वैल्यू की मदद से मैपिंग तय करके ऐसा कर सकते हैं. इसे हम इंटीजर को संभावित वैल्यू की शब्दावली के रूप में कहेंगे. हमारे डेटासेट में दुनिया की हर सड़क नहीं दिखेगी. इसलिए, हम दूसरी सभी सड़कों को कैच-ऑल "अन्य" कैटगरी में डाल सकते हैं. इस कैटगरी को OOV (शब्दावली से बाहर) बकेट कहा जाता है.

इस तरीके का इस्तेमाल करके, हम यहां बताए गए तरीके से अपनी सड़कों के नामों को नंबर से मैप कर सकते हैं:

  • चार्ल्सटन रोड को 0 से मैप करो
  • नॉर्थ शोरलाइन बुलेवार्ड को 1 से मैप करो
  • शोरबर्ड वे 2 को मैप करो
  • रॉन्गस्टाफ़ एवेन्यू को 3 से मैप करो
  • बाकी सब कुछ (OOV) को 4 पर मैप करो

हालांकि, अगर हम इन इंडेक्स नंबर को सीधे अपने मॉडल में शामिल करते हैं, तो इससे कुछ पाबंदियां लग सकती हैं. हालांकि, इनसे समस्या हो सकती है:

  • हम सभी सड़कों पर लागू होने वाले एक ही वज़न के बारे में जानेंगे. उदाहरण के लिए, अगर हम street_name के लिए 6 का भार मापते हैं, तो हम इसे चार्ल्सटन रोड के लिए 0 से गुणा करेंगे. ऐसे मॉडल पर ध्यान दें जो street_name को सुविधा के तौर पर इस्तेमाल करके, घर की कीमतों का अनुमान लगाता है. सड़क के नाम के हिसाब से कीमत में बदलाव की संभावना नहीं है. इसके अलावा, इससे यह भी माना जाएगा कि आपने सड़कों को उनके घर की औसत कीमत के आधार पर ऑर्डर किया है. हमारे मॉडल को ज़रूरत है कि वह हर सड़क के लिए, अलग-अलग महत्व को सीख सके. इन्हें अन्य सुविधाओं का इस्तेमाल करके, अनुमानित कीमत में जोड़ा जाएगा.

  • हम उन मामलों को शामिल नहीं करते हैं जहां street_name एक से ज़्यादा वैल्यू ले सकता है. उदाहरण के लिए, कई घर दो सड़कों के किनारे होते हैं. अगर उस जानकारी में एक ही इंडेक्स है, तो उसे street_name वैल्यू में कोड में बदलने का कोई तरीका नहीं है.

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

  • उदाहरण पर लागू होने वाली वैल्यू के लिए, संबंधित वेक्टर एलिमेंट को 1 पर सेट करें.
  • अन्य सभी एलिमेंट को 0 पर सेट करें.

इस वेक्टर की लंबाई, शब्दावली में मौजूद एलिमेंट की संख्या के बराबर है. जब कोई वैल्यू 1 होती है, तो इसे वन-हॉट एन्कोडिंग कहा जाता है. जब कई वैल्यू 1 होती हैं, तो मल्टी-हॉट एन्कोडिंग को कहा जाता है.

तीसरी इमेज में किसी सड़क की वन-हॉट एन्कोडिंग दिखाई गई है: शोरबर्ड वे. शोरबर्ड वे के बाइनरी वेक्टर में एलिमेंट की वैल्यू 1 है, जबकि दूसरी सभी सड़कों के एलिमेंट की वैल्यू 0 है.

किसी स्ट्रिंग मान की मैपिंग करना (

तीसरी इमेज. वन-हॉट एन्कोडिंग के ज़रिए, मोहल्ले का पता मैप करना.

यह तरीका, हर सुविधा की वैल्यू (जैसे कि सड़क का नाम) के लिए, असरदार तरीके से एक बूलियन वैरिएबल बनाता है. यहां, अगर कोई घर शोरबर्ड वे पर है, तो उसकी बाइनरी वैल्यू 1 होगी. इसलिए, यह मॉडल सिर्फ़ शोरबर्ड वे के वज़न का इस्तेमाल करता है.

इसी तरह, अगर कोई घर दो सड़कों के कोने पर है, तो दो बाइनरी वैल्यू 1 पर सेट होंगी. साथ ही, मॉडल अपने-अपने वज़न का इस्तेमाल करेगा.

कम जानकारी दिखाना

मान लें कि आपके डेटा सेट में 10,00,000 अलग-अलग सड़कों के नाम थे, जिन्हें आपको street_name की वैल्यू के तौर पर शामिल करना था. 10,00,000 एलिमेंट का साफ़ तौर पर बाइनरी वेक्टर बनाना, जिसमें सिर्फ़ एक या दो एलिमेंट सही हों. यह इन वेक्टर को प्रोसेस करने के दौरान स्टोरेज और कंप्यूटेशन समय, दोनों के हिसाब से बहुत ही बुरे तरीके से दिखाया जाता है. इस स्थिति में, एक सामान्य तरीका यह है कि पार्स प्रज़ेंटेशन का इस्तेमाल किया जाए. इसमें सिर्फ़ नॉन-ज़ीरो वैल्यू को स्टोर किया जाता है. जैसा कि ऊपर बताया गया है, सीमित उदाहरण में हर सुविधा की वैल्यू के लिए अब भी एक स्वतंत्र मॉडल वेट तय किया जाता है.