2016-05-22 2 views
0

Ich versuche, UnbalancedDataset zu verwenden, um meine Daten zu überexampeln. Nach der Sklearn-Konvention habe ich X, y als Feature-Matrix und Zielvektor. Diese sind vom Typ pandas.core.frame.DataFrame mit einer Form von (200000, 17) bzw. (200000,).KeyError während der Verwendung des Pakets "UnbalancedDataset" zum Übersampeln eines Datasets (in pandas.index.IndexEngine.get_loc)

Zuerst teile ich die Daten mit dem Sklean train_test_split. Dann angewandt, um die Smote Methode über probieren Sie die Trainingsdatenmenge, die in dem folgenden Fehler in Folge:

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
C:\Users\...\Anaconda3\lib\site-packages\pandas\indexes\base.py in get_loc(self, key, method, tolerance) 
    1944    try: 
-> 1945     return self._engine.get_loc(key) 
    1946    except KeyError: 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4154)() 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4018)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12368)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)() 

KeyError: 1143 

During handling of the above exception, another exception occurred: 

KeyError         Traceback (most recent call last) 
<ipython-input-99-1c5830417b3f> in <module>() 
     6 # 'SMOTE' 
     7 SM = SMOTE(ratio=ratio, verbose=verbose, kind='regular') 
----> 8 smx, smy = SM.fit_transform(Xtrain, ytrain) 

C:\Users\...\Anaconda3\lib\site-packages\unbalanceddataset-0.1-py3.5.egg\unbalanced_dataset\unbalanced_dataset.py in fit_transform(self, x, y) 
    274    return self.out_x, self.out_y, self.out_idx 
    275   else: 
--> 276    self.out_x, self.out_y = self.resample() 
    277 
    278    return self.out_x, self.out_y 

C:\Users\...\Anaconda3\lib\site-packages\unbalanceddataset-0.1-py3.5.egg\unbalanced_dataset\over_sampling.py in resample(self) 
    358          step_size=1.0, 
    359          random_state=self.rs, 
--> 360          verbose=self.verbose) 
    361 
    362    if self.verbose: 

C:\Users\...\Anaconda3\lib\site-packages\unbalanceddataset-0.1-py3.5.egg\unbalanced_dataset\unbalanced_dataset.py in make_samples(x, nn_data, y_type, nn_num, n_samples, step_size, random_state, verbose) 
    388 
    389    # Construct synthetic sample 
--> 390    new[i] = x[row] - step * (x[row] - nn_data[nn_num[row, col]]) 
    391 
    392   # The returned target vector is simply a repetition of the 

C:\Users\...\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key) 
    1995    return self._getitem_multilevel(key) 
    1996   else: 
-> 1997    return self._getitem_column(key) 
    1998 
    1999  def _getitem_column(self, key): 

C:\Users\...\Anaconda3\lib\site-packages\pandas\core\frame.py in _getitem_column(self, key) 
    2002   # get column 
    2003   if self.columns.is_unique: 
-> 2004    return self._get_item_cache(key) 
    2005 
    2006   # duplicate columns & possible reduce dimensionality 

C:\Users\...\Anaconda3\lib\site-packages\pandas\core\generic.py in _get_item_cache(self, item) 
    1348   res = cache.get(item) 
    1349   if res is None: 
-> 1350    values = self._data.get(item) 
    1351    res = self._box_item_values(item, values) 
    1352    cache[item] = res 

C:\Users\...\Anaconda3\lib\site-packages\pandas\core\internals.py in get(self, item, fastpath) 
    3288 
    3289    if not isnull(item): 
-> 3290     loc = self.items.get_loc(item) 
    3291    else: 
    3292     indexer = np.arange(len(self.items))[isnull(self.items)] 

C:\Users\...\Anaconda3\lib\site-packages\pandas\indexes\base.py in get_loc(self, key, method, tolerance) 
    1945     return self._engine.get_loc(key) 
    1946    except KeyError: 
-> 1947     return self._engine.get_loc(self._maybe_cast_indexer(key)) 
    1948 
    1949   indexer = self.get_indexer([key], method=method, tolerance=tolerance) 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4154)() 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4018)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12368)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)() 

KeyError: 1143 

Ich habe diesen Fehler während all Undersampling-Verfahren der UnbalancedDataset auf den gleichen Daten hat gut funktioniert. Irgendwelche Vorschläge, um das Problem mit Oversampling zu behandeln?

UPDATE:

Wie glemaitre erwähnt, das Problem zu lösen, muss der Pandas Datenrahmen zu Numpy Arrays umgewandelt werden. So würde die folgende Umwandlung das Problem lösen:

Xc = Xtrain.as_matrix() 

Antwort

1

Das UnbalancedDataset erwartet numpy Array. Versuchen Sie, das in die Funktion zu stecken und zu sehen, ob das funktioniert.

Prost

+0

gleimaitres Antwort ist eigentlich richtig. Ich habe es einen Tag nach dem Stellen der Frage herausgefunden. Ich hätte es auch hier erwähnen sollen. Ich werde meine Frage bearbeiten und weitere Informationen hinzufügen, um das Problem zu beheben. – MhFarahani

Verwandte Themen