python TypeError: sklearn.feature_extraction.FeatureHasher में एक फ्लोट की आवश्यकता है




scikit-learn feature-extraction (3)

यह अब समर्थित है, क्योंकि स्केलेर्न देव टीम ने इस मुद्दे को https://github.com/scikit-learn/scikit-learn/pull/6173 में संबोधित किया

FeatureHasher को संस्करण 0.18 के रूप में स्ट्रिंग डिक्शनरी मानों को ठीक से FeatureHasher करना चाहिए।

ध्यान रखें कि FeatureHasher और DictVectorizer बीच अभी भी अंतर है। अर्थात्, DictVectorizer अभी भी None मूल्य None संभालता है (हालांकि मैं कैसे उत्सुक हूँ), जबकि FeatureHasher स्पष्ट रूप से इसके बारे में ओपी अनुभवी अनुभवी त्रुटि के बारे में शिकायत करता है।

यदि आप स्केलैर्न संस्करण> = 0.18 के साथ अभी भी "प्रकार त्रुटि: एक फ्लोट की आवश्यकता है" अनुभव कर रहे हैं, शायद यह इस समस्या के कारण है, और आपके पास कोई None मान None

इस को डिबग करने का कोई आसान तरीका नहीं है, और मैंने टाइप ईर अपवाद को पकड़ने के लिए स्केलेन कोड को संशोधित करना समाप्त किया और प्रदान की गई अंतिम वस्तु को प्रिंट किया। मैंने sklearn/feature_extraction/hashing.py के शीर्ष पर _iteritems() फ़ंक्शन को संपादित कर किया है

मैं sklearn संस्करण 0.16.1 का उपयोग कर रहा हूँ। ऐसा लगता है कि फ़ीचरहाशर तारों का समर्थन नहीं करता (जैसा कि DictVectorizer करता है) उदाहरण के लिए:

values = [
          {'city': 'Dubai', 'temperature': 33.},
          {'city': 'London', 'temperature': 12.},
          {'city': 'San Fransisco', 'temperature': 18.}
          ]

print("Starting FeatureHasher ...")
hasher = FeatureHasher(n_features=2)
X = hasher.transform(values).toarray()
print X

लेकिन निम्नलिखित त्रुटि प्राप्त हुई है:

    _hashing.transform(raw_X, self.n_features, self.dtype)
  File "_hashing.pyx", line 46, in sklearn.feature_extraction._hashing.transform (sklearn\feature_extraction\_hashing.c:1762)
TypeError: a float is required

मैं अपने डेटासेट बहुत बड़ा है और सुविधाओं के उच्च कार्डिनल के साथ हैं, इसलिए मैं एक MemoryError मिल के बाद से DictVectorizer का उपयोग नहीं कर सकते। कोई सुझाव?

अपडेट (अक्टूबर 2016):

जैसा कि नाइरज ने टिप्पणी की, यह अब समर्थित है, क्योंकि स्केलेर्न देव टीम ने इस मुद्दे को https://github.com/scikit-learn/scikit-learn/pull/6173 में संबोधित किया

फ़ीचरहाशर को संस्करण 0.18 के रूप में स्ट्रिंग डिक्शनरी मानों को ठीक से व्यवस्थित करना चाहिए।


गैर-संख्यात्मक सुविधाओं के लिए आपकी सबसे अच्छी शर्त कुंजी को स्वयं बदलना है, जैसा कि DictVectorizer करता है।

values = [
      {'city_Dubai':1., 'temperature': 33.},
      {'city_London':1., 'temperature': 12.},
      {'city_San Fransisco':1., 'temperature': 18.}
      ]

आप ऐसा अजगर फ़ंक्शन के साथ कर सकते हैं।

def transform_features(orig_dict):
    transformed_dict = dict()
    for name, value in orig_dict.iteritems():
        if isinstance(value , str):
            name = "%s_%s" % (name,value)
            value = 1.
        transformed_dict[name] = value
    return transformed_dict

उदाहरण उपयोग:

transform_features({'city_Dubai':1., 'temperature': 33.})
# Returns {'city_Dubai': 1.0, 'temperature': 33.0}

यह एक ज्ञात स्केलेर्न समस्या है: फ़ीचरहाशर वर्तमान में अपने डायट इनपुट प्रारूप के लिए स्ट्रिंग मानों का समर्थन नहीं करता है

https://github.com/scikit-learn/scikit-learn/issues/4878





feature-extraction