2014-12-23 18 views
5

Tôi đang cố chuyển đổi một khung dữ liệu Pandas thành mảng NumPy để tạo mô hình với Sklearn. Tôi sẽ đơn giản hóa vấn đề ở đây.Pandas OneHotEncoder.fit (dataframe) trả về ValueError: chữ không hợp lệ cho dài() với cơ số 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' 

Thông báo IdVisita là chỉ số ở đây và con số có thể không phải tất cả liên tiếp.

Bất kỳ manh mối nào?

+0

Bạn chỉ có một cột duy nhất được gọi là 'cat1'? hãy thử làm như sau: 'enc.fit (mydf.cat1.values)' – EdChum

+0

Xin lỗi, không may mắn. : -/ – dukebody

+0

Từ [tài liệu] (http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html) OneHotEncoder mã hóa một mảng ints, bạn đang cố gắng chỉ để mã hóa cột IdVista chỉ có? Vấn đề ở đây là đây là chỉ mục của bạn, bạn chỉ có một cột duy nhất được gọi là 'cat1' là một chuỗi, bạn có thể làm rõ – EdChum

Trả lời

3

lỗi của bạn ở đây là bạn đang gọi OneHotEncoder đó từ các tài liệu

The input to this transformer should be a matrix of integers

nhưng df của bạn có một cột duy nhất 'cat1' mà là của dtype object mà thực chất là một String.

Bạn nên sử dụng 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) 

Lưu ý tôi phải thả hàng NaN vì điều này sẽ giới thiệu một dtype hỗn hợp mà không thể được sử dụng để đặt hàng ví dụ float> str sẽ không hoạt động

+0

Có thể LabelEncoder lấy thứ tự, hoặc chỉ các danh sách? – ionox0

+0

Tuy nhiên, đây là vấn đề khi dữ liệu phân loại của bạn không có thứ tự. Bằng cách sử dụng LabelEncoder, bạn xác định một thứ tự có thể gây ra các kết quả mô hình hóa tối ưu. –

2

Cách tiếp cận đơn giản hơn là sử dụng DictVectorizer, chuyển đổi thành số nguyên cũng như OneHotEncoding ở cùng một bước.

Sử dụng đối số DictVectorizer(sparse=False) cho phép nhận được DataFrame sau fit_transform để tiếp tục làm việc với gấu trúc.

Các vấn đề liên quan