Во время процесса НЛП я преобразую совокупность текстов, используя 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]]
Поэтому у меня два вопроса:
- Действительно ли ошибка исходит из этого преобразования
int32
в int64
?
- Есть ли более питонный способ преобразования типа индекса? (
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