2014-12-23 1 views
5

Sto provando a convertire un dataframe di Pandas in un array NumPy per creare un modello con Sklearn. Semplificherò il problema qui.Pandas OneHotEncoder.fit (dataframe) restituisce ValueError: letterale non valido per long() con base 10

>>> mydf.head(10) 
IdVisita 
445         latam 
446         NaN 
447         grados 
448         grados 
449        eventos 
450        eventos 
451   Reescribe-medios-clases-online 
454        postgrados 
455        postgrados 
456        postgrados 
Name: cat1, dtype: object 

>>> from sklearn import preprocessing 
>>> enc = preprocessing.OneHotEncoder() 
>>> enc.fit(mydf) 

Traceback:

ValueError        Traceback (most recent call last) 
<ipython-input-74-f581ab15cbed> in <module>() 
     2 mydf.head(10) 
     3 enc = preprocessing.OneHotEncoder() 
----> 4 enc.fit(mydf) 

/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in fit(self, X, y) 
    996   self 
    997   """ 
--> 998   self.fit_transform(X) 
    999   return self 
    1000 

/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in fit_transform(self, X, y) 
    1052   """ 
    1053   return _transform_selected(X, self._fit_transform, 
-> 1054         self.categorical_features, copy=True) 
    1055 
    1056  def _transform(self, X): 

/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in _transform_selected(X, transform, selected, copy) 
    870  """ 
    871  if selected == "all": 
--> 872   return transform(X) 
    873 
    874  X = atleast2d_or_csc(X, copy=copy) 

/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in _fit_transform(self, X) 
    1001  def _fit_transform(self, X): 
    1002   """Assumes X contains only categorical features.""" 
-> 1003   X = check_arrays(X, sparse_format='dense', dtype=np.int)[0] 
    1004   if np.any(X < 0): 
    1005    raise ValueError("X needs to contain only non-negative integers.") 

/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/utils/validation.pyc in check_arrays(*arrays, **options) 
    279      array = np.ascontiguousarray(array, dtype=dtype) 
    280     else: 
--> 281      array = np.asarray(array, dtype=dtype) 
    282     if not allow_nans: 
    283      _assert_all_finite(array) 

/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/numpy/core/numeric.pyc in asarray(a, dtype, order) 
    460 
    461  """ 
--> 462  return array(a, dtype, copy=False, order=order) 
    463 
    464 def asanyarray(a, dtype=None, order=None): 

ValueError: invalid literal for long() with base 10: 'postgrados' 

Avviso IdVisita è l'indice qui e numeri potrebbe non essere tutto consecutivo.

Eventuali indizi?

+0

Hai solo una singola colonna chiamata "cat1"? per favore prova quanto segue: 'enc.fit (mydf.cat1.values)' – EdChum

+0

Scusa, non ho fortuna. : -/ – dukebody

+0

Da [docs] (http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html) OneHotEncoder codifica un array di ints, stai provando solo a codificare la colonna IdVista solo? Il problema qui è che questo è il tuo indice, hai solo una singola colonna chiamata 'cat1' che è una stringa, puoi chiarire – EdChum

risposta

3

Il tuo errore è che si sta chiamando OneHotEncoder che dalla documentazione

The input to this transformer should be a matrix of integers

ma il vostro df contiene una singola colonna 'cat1', che è di DTYPE object che è in realtà una stringa.

Si dovrebbe usare LabelEcnoder:

In [13]: 

le = preprocessing.LabelEncoder() 
le.fit(df.dropna().values) 
le.classes_ 
C:\WinPython-64bit-3.3.3.2\python-3.3.3.amd64\lib\site-packages\sklearn\preprocessing\label.py:108: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel(). 
    y = column_or_1d(y, warn=True) 
Out[13]: 
array(['Reescribe-medios-clases-online', 'eventos', 'grados', 'latam', 
     'postgrados'], dtype=object) 

Nota ho dovuto cadere la riga NaN come questo introdurrà un DTYPE mista che non può essere utilizzato per ordinare ad esempio float> str non funzionerà

+0

Can LabelEncoder accetta ndarrays o solo elenchi? – ionox0

+0

È tuttavia un problema quando i dati categoriali non hanno un ordine. Usando LabelEncoder, si determina un tale ordine che potrebbe causare risultati di modellazione subottimali. –

2

Un approccio più semplice è quello di utilizzare DictVectorizer, che esegue la conversione in numero intero e lo OneHotEncoding allo stesso passo.

L'utilizzo con l'argomento DictVectorizer(sparse=False) consente di ottenere un DataFrame dopo il per continuare a lavorare con Pandas.