ValueError: не удалось преобразовать целочисленный скаляр в индексацию scipy - PullRequest
0 голосов
/ 27 августа 2018

Во время процесса НЛП я преобразую совокупность текстов, используя TF-IDF, что дает scipy.sparse.csr.csr_matrix.

Затем я разбил эти данные на учебный и испытательный корпус и повторно отобрал свой составный состав для решения проблемы дисбаланса в классе.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую индекс пересэмплирования (из метки типа pandas.Series) для повторной выборки разреженной матрицы следующим образом:

tfs[Ytr_resample.index]

Это занимает много времени и выдает ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-dd1413907d77> in <module>()
----> 1 tfs[Ytr_cat_resample.index]

/usr/local/lib/python3.5/dist-packages/scipy/sparse/csr.py in __getitem__(self, key)
    348         csr_sample_values(self.shape[0], self.shape[1],
    349                           self.indptr, self.indices, self.data,
--> 350                           num_samples, row.ravel(), col.ravel(), val)
    351         if row.ndim == 1:
    352             # row and col are 1d

ValueError: could not convert integer scalar

После этой темы Я проверил, что самый большой элемент в индексе не будет больше, чем число строк в моей разреженной матрице.

Проблема, похоже, связана с тем, что индекс закодирован в np.int64, а не в np.int32. Действительно следующие работы:

Xtr_resample = tfs[[np.int32(ind) for ind in Ytr_resample.index]]

Поэтому у меня два вопроса:

  1. Действительно ли ошибка исходит из этого преобразования int32 в int64?
  2. Есть ли более питонный способ преобразования типа индекса? (Ytr_resample.index.astype(np.int32), кажется, по какой-то причине не меняет тип)

EDIT:

Ytr_resample.index относится к типу pandas.core.indexes.numeric.Int64Index:

Int64Index([1484,  753, 1587, 1494,  357, 1484,   84,  823,  424,  424,
        ...
        1558, 1619, 1317, 1635,  537, 1206, 1152, 1635, 1206,  131],
       dtype='int64', length=4840)

Я создал Ytr_resample путем повторной выборки Ytr (то есть pandas.Series), чтобы каждая категория, представленная в Ytr, имела одинаковое количество элементов (путем избыточной выборки):

n_samples = Ytr.value_counts(dropna = False).max()
Ytr_resample = pd.DataFrame(Ytr).groupby('cat').apply(\
                                lambda x: x.sample(n_samples,replace = True,random_state=42)).cat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...