5

मैं sk-learn में लेबल एन्कोडिंग के लिए अज्ञात मानों को कैसे संभाल सकता हूं? लेबल एन्कोडर केवल अपवाद के साथ उड़ाएगा कि नए लेबल का पता चला था।लेबल एन्कोडिंग के लिए अज्ञात मानों को संभालना

मैं क्या चाहता हूँ एक गर्म -encoder के माध्यम से स्पष्ट चर की एन्कोडिंग है। हालांकि, sk-learn इसके लिए स्ट्रिंग का समर्थन नहीं करता है। इसलिए मैंने प्रत्येक कॉलम पर एक लेबल एन्कोडर का उपयोग किया।

मेरी समस्या यह है कि पाइपलाइन के मेरे क्रॉस-सत्यापन चरण में अज्ञात लेबल दिखाई देते हैं। मूल एक-हॉट-एन्कोडर के पास ऐसे मामलों को अनदेखा करने का विकल्प होगा। एक apriori pandas.getDummies /cat.codes पर्याप्त नहीं है क्योंकि पाइपलाइन को वास्तविक जीवन, ताजा आने वाले डेटा के साथ काम करना चाहिए जिसमें अज्ञात लेबल भी हो सकते हैं।

क्या इस उद्देश्य के लिए CountVectorizer का उपयोग करना संभव होगा?

+2

क्या आपके पास इस उद्देश्य के लिए नमूना चित्रण है? –

+0

क्या आप अपवाद पकड़ सकते हैं, इसे लॉग (या जो कुछ भी), फिर आगे बढ़ें? या बस उन्हें अनदेखा करें? – wwii

+0

यदि एक अनुमानित मॉडल को एपीआई के रूप में तैनात किया गया है तो यह बहुत संभावना है कि इसे सुविधाओं के अभी तक अज्ञात लेबलों का सामना करना पड़ेगा। मैं स्केलेर्न में उससे कैसे निपट सकता हूं? क्या आप एपीआई में त्रुटि फैलाने का सुझाव देंगे? –

उत्तर

4

ऐसे कई जवाब हैं जो pandas.get_dummies का उल्लेख इस विधि के रूप में करते हैं, लेकिन मुझे लगता है कि labelEncoder दृष्टिकोण मॉडल को लागू करने के लिए क्लीनर है। अन्य समान उत्तरों के लिए DictVectorizer का उपयोग करके उल्लेख किया गया है, लेकिन फिर पूरे DataFrame को dict में परिवर्तित करने के लिए शायद एक अच्छा विचार नहीं है।

की समस्या पैदा करने वाले कॉलम निम्नलिखित मान लेते हैं:

from sklearn import preprocessing 
import numpy as np 
import pandas as pd 

train = {'city': ['Buenos Aires', 'New York', 'Istambul', 'Buenos Aires', 'Paris', 'Paris'], 
     'letters': ['a', 'b', 'c', 'd', 'a', 'b']} 
train = pd.DataFrame(train) 

test = {'city': ['Buenos Aires', 'New York', 'Istambul', 'Buenos Aires', 'Paris', 'Utila'], 
     'letters': ['a', 'b', 'c', 'a', 'b', 'b']} 
test = pd.DataFrame(test) 

Utila एक दुर्लभ शहर है, और यह है कि हम निष्कर्ष समय नए डेटा पर विचार कर सकते हैं, प्रशिक्षण डेटा में लेकिन परीक्षण सेट में मौजूद नहीं है।

चाल इस मान को "अन्य" में परिवर्तित कर रही है और लेबल एन्कोडर ऑब्जेक्ट में भी शामिल है। फिर हम इसे उत्पादन में पुन: उपयोग कर सकते हैं।

c = 'city' 
le = preprocessing.LabelEncoder() 
train[c] = le.fit_transform(train[c]) 
test[c] = test[c].map(lambda s: 'other' if s not in le.classes_ else s) 
le_classes = le.classes_.tolist() 
bisect.insort_left(le_classes, 'other') 
le.classes_ = le_classes 
test[c] = le.transform(test[c]) 
test 

    city letters 
0 1 a 
1 3 b 
2 2 c 
3 1 a 
4 4 b 
5 0 b 

नए डेटा करने के लिए इसे लागू करने के लिए हम सभी की जरूरत है प्रत्येक स्तंभ है जो आसानी से अचार के साथ किया जा सकता है के लिए एक le वस्तु को बचाने के लिए है।

यह उत्तर इस question पर आधारित है जो मुझे लगता है कि मुझे पूरी तरह स्पष्ट नहीं है, इसलिए इस उदाहरण को जोड़ा गया।

+0

आपका मतलब है कि अंतर यह है कि आपके समाधान में स्मृति में केवल एक कॉलम की आवश्यकता होती है जबकि मेरे समाधान को स्मृति में सभी कॉलम की आवश्यकता होती है? –

+0

सेहर क्या आप अन्य या शून्य सुझाएंगे? मुझे लगता है कि नल भी अच्छा है क्योंकि प्रीप्रोकैसिंग कोड इसे लेबल एन्कोडर से पहले बुलाएगा। –

+0

मुझे लगता है कि यह 'get_dummies' या' DictVectorizer' की तुलना में एक सुरक्षित समाधान है। मैं लेबल एन्कोडर के बाद एक-के एन्कोडिंग का उपयोग करने पर सोच रहा हूं, इसलिए जो भी मूल्य होगा। – marbel

संबंधित मुद्दे