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()
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