2013-05-09 8 views
13

का उपयोग कर डेट वैरिएबल के साथ रिग्रेशन मेरे पास date कॉलम (उदाहरण: 2013-04-01) के साथके साथ एक पांडस डेटाफ्रेम है। जब मैं X_train में उस कॉलम को शामिल करता हूं और रिग्रेशन मॉडल को फिट करने का प्रयास करता हूं, तो मुझे त्रुटि float() argument must be a string or a number मिलती है। date कॉलम को हटाने से इस त्रुटि से परहेज किया गया।साइकिट-सीखने

date को रिग्रेशन मॉडल में खाते में लेने का उचित तरीका क्या है?

कोड

data = sql.read_frame(...) 
X_train = data.drop('y', axis=1) 
y_train = data.y 

rf = RandomForestRegressor().fit(X_train, y_train) 

त्रुटि

TypeError         Traceback (most recent call last) 
<ipython-input-35-8bf6fc450402> in <module>() 
----> 2 rf = RandomForestRegressor().fit(X_train, y_train) 

C:\Python27\lib\site-packages\sklearn\ensemble\forest.pyc in fit(self, X, y, sample_weight) 
    292     X.ndim != 2 or 
    293     not X.flags.fortran): 
--> 294    X = array2d(X, dtype=DTYPE, order="F") 
    295 
    296   n_samples, self.n_features_ = X.shape 

C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in array2d(X, dtype, order, copy) 
    78   raise TypeError('A sparse matrix was passed, but dense data ' 
    79       'is required. Use X.toarray() to convert to dense.') 
---> 80  X_2d = np.asarray(np.atleast_2d(X), dtype=dtype, order=order) 
    81  _assert_all_finite(X_2d) 
    82  if X is X_2d and copy: 

C:\Python27\lib\site-packages\numpy\core\numeric.pyc in asarray(a, dtype, order) 
    318 
    319  """ 
--> 320  return array(a, dtype, copy=False, order=order) 
    321 
    322 def asanyarray(a, dtype=None, order=None): 

TypeError: float() argument must be a string or a number 

उत्तर

5

आपके पास दो विकल्प। आप तिथि को एक ऑर्डिनल में परिवर्तित कर सकते हैं यानी 1 दिन से दिन की संख्या का प्रतिनिधित्व करने वाला एक पूर्णांक 1. आप इसे datetime.date के toordinal फ़ंक्शन द्वारा कर सकते हैं।

वैकल्पिक रूप से, आप sklearn के OneHotEncoder का उपयोग करके दिनांकों को स्पष्ट चर में बदल सकते हैं। यह क्या करता है प्रत्येक विशिष्ट तिथि के लिए एक नया चर बनाते हैं। इसलिए date जैसे मान ['2013-04-01', '2013-05-01'] के साथ कॉलम के साथ [1, 0] और date_2013_05_01 मूल्यों के साथ [0, 1] के साथ कुछ कॉलम, date_2013_04_01 होगा।

यदि आपके पास कई अलग-अलग तिथियां हैं, और एक गर्म एन्कोडर है तो अलग-अलग तिथियों की संख्या छोटी है (मान लें कि आपके डेटा के आकार और किस प्रकार के अनुसार, 10 - 100 तक कहें, मैं toordinal दृष्टिकोण का उपयोग करने की सलाह दूंगा। संबंध के साथ आउटपुट चर के साथ है)।

19

सबसे अच्छा तरीका 1-के-एन्कोडिंग (उदाहरण के अनुसार DictVectorizer द्वारा किया गया) का उपयोग करके बूलियन फॉर्म में एन्कोड किए गए स्पष्ट विशेषताओं के सेट में विस्फोट करना है।

  • दिन के घंटे (24 बूलियन सुविधाओं) सप्ताह के
  • दिन (7 बूलियन सुविधाओं) महीने के
  • दिन (अप करने के लिए 31: यहाँ कुछ विशेषताएं है कि एक तारीख से निकाला जा सकता हैं बूलियन सुविधाओं)
  • साल के महीने (12 बूलियन सुविधाओं)
  • वर्ष (कई बूलियन सुविधाओं के रूप में के रूप में वे अपने डेटासेट में विभिन्न वर्ष) रहे हैं ...

यह सामान्य मानव जीवन चक्रों पर आवधिक घटनाओं पर रैखिक निर्भरताओं की पहचान करना संभव बनाना चाहिए।

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

+0

मुझे विज्ञान के साथ सीधा समाधान नहीं मिल रहा है-तिथि (स्ट्रिंग प्रारूप) को कई विशेषताओं में कनवर्ट करना सीखें, इसलिए मैंने इसे मैन्युअल रूप से date_object = datetime.strptime ('2016-25-05', '% Y /% डी /% एम ') प्रिंट' सप्ताह का दिन ', date_object.strftime ('% w ') – Spl2nky

+1

आपका उत्तर बहुत अच्छा है। लेकिन, मुझे लगता है कि कुछ मामलों में आदेश बनाए रखना महत्वपूर्ण है, उदाहरण के लिए: दिनों का आदेश, या सप्ताह के दिनों में। मुझे लगता है कि यह समस्या पर निर्भर करता है और विभिन्न तरीकों से प्रयास करता है। – Barto

0

@ogrisel द्वारा सुझाए गए 1-के-के एन्कोडिंग का उपयोग करके बूलियन एन्कोडिंग करने से पहले, आप अपने डेटा को समृद्ध करने और डेटाटाइम-प्रकार, यानी सप्ताह के दिन, दिन से निकालने वाली सुविधाओं की संख्या के साथ खेल सकते हैं। महीने का, वर्ष का दिन, वर्ष का सप्ताह, तिमाही, आदि उदाहरण के लिए देखें https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.weekofyear.html और अन्य कार्यों के लिंक।

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

  • कोई संबंधित समस्या नहीं^_^