1
votes

rééchantillonnage des données - en utilisant SMOTE de imblearn avec des tableaux numpy 3D

Je souhaite rééchantillonner mon ensemble de données. Cela consiste en des données transformées catégoriques avec des étiquettes de 3 classes. Le nombre d'échantillons par classe est:

  • comptes de la classe A: 6945
  • compte de la classe B: 650
  • comptes de la classe C: 9066
  • Échantillons TOTAl: 16661

La forme des données sans étiquettes est (16661, 1000, 256). Cela signifie 16661 échantillons de (1000,256). Ce que je voudrais, c'est sur-échantillonner les données jusqu'au nombre d'échantillons de la classe majoritaire, c'est-à-dire la classe A -> (6945)

Cependant, lors de l'appel:

from imblearn.over_sampling import SMOTE
print(categorical_vector.shape)
sm = SMOTE(random_state=2)
X_train_res, y_labels_res = sm.fit_sample(categorical_vector, labels.ravel())

Il ne cesse de dire ValueError: Tableau trouvé avec dim 3. Estimateur attendu

Comment puis-je aplatir les données de manière à ce que l'estimateur puisse les ajuster et que cela a du sens aussi? De plus, comment puis-je annuler l'aplatissement (avec une dimension 3D) après avoir obtenu X_train_res?


2 commentaires

il est possible de convertir un tableau 3D en tableau 2D, puis de nouveau en 3D. Mais vous devez connaître la forme du tableau 2d (votre forme requise pour le tableau 2d), alors cela pourrait continuer.


Comment puis je faire ça? @AbdurRehman


3 Réponses :


3
votes

Je considère un tableau factice 3d et je suppose une taille de tableau 2d par moi-même,

arr = np.reshape(arr, orig_shape))
print(arr.shape)

Résultat: ( 160, 10, 25)

arr = np.reshape(arr, (arr.shape[0], arr.shape[1]))
print(arr.shape)

Sortie: (4000, 10)

arr = np.random.rand(160, 10, 25)
orig_shape = arr.shape
print(orig_shape)


1 commentaires

@sanchezjAI, vous pouvez appliquer ce code à votre propre situation. Faites-moi savoir si cela a fonctionné.



1
votes
oversample.fit_resample(X[:,:,0], y)
Xo = X[oversample.sample_indices_]
yo = y[oversample.sample_indices_]

Xo:
[[[ 1  1][ 2  1][ 3  1]]
 [[ 2  1][ 3  1][ 4  1]]
 [[ 5  1][ 6  1][ 7  1]]
 [[ 8  1][ 9  1][10  1]]
 [[11  1][12  1][13  1]]
 [[ 2  1][ 3  1][ 4  1]]]
yo:
[1 0 1 1 0 0]

0 commentaires

0
votes

Je vais créer chaque point pour un tableau à 2 dimensions, puis le remodeler en un tableau à 3 dimensions. J'ai fourni mes scripts. En cas de confusion, commentez; veuillez répondre.

x_train, y_train = zip(*train_dataset)
x_test, y_test = zip(*test_dataset)

dim_1 = np.array(x_train).shape[0]
dim_2 = np.array(x_train).shape[1]
dim_3 = np.array(x_train).shape[2]

new_dim = dim_1 * dim_2

new_x_train = np.array(x_train).reshape(new_dim, dim_3)


new_y_train = []
for i in range(len(y_train)):
    # print(y_train[i])
    new_y_train.extend([y_train[i]]*dim_2)

new_y_train = np.array(new_y_train)

# transform the dataset
oversample = SMOTE()
X_Train, Y_Train = oversample.fit_sample(new_x_train, new_y_train)
# summarize the new class distribution
counter = Counter(Y_Train)
print('The number of samples in TRAIN: ', counter)



x_train_SMOTE = X_Train.reshape(int(X_Train.shape[0]/dim_2), dim_2, dim_3)

y_train_SMOTE = []
for i in range(int(X_Train.shape[0]/dim_2)):
    # print(i)
    value_list = list(Y_Train.reshape(int(X_Train.shape[0]/dim_2), dim_2)[i])
    # print(list(set(value_list)))
    y_train_SMOTE.extend(list(set(value_list)))
    ## Check: if there is any different value in a list 
    if len(set(value_list)) != 1:
        print('\n\n********* STOP: THERE IS SOMETHING WRONG IN TRAIN ******\n\n')
    


dim_1 = np.array(x_test).shape[0]
dim_2 = np.array(x_test).shape[1]
dim_3 = np.array(x_test).shape[2]

new_dim = dim_1 * dim_2

new_x_test = np.array(x_test).reshape(new_dim, dim_3)


new_y_test = []
for i in range(len(y_test)):
    # print(y_train[i])
    new_y_test.extend([y_test[i]]*dim_2)

new_y_test = np.array(new_y_test)

# transform the dataset
oversample = SMOTE()
X_Test, Y_Test = oversample.fit_sample(new_x_test, new_y_test)
# summarize the new class distribution
counter = Counter(Y_Test)
print('The number of samples in TEST: ', counter)



x_test_SMOTE = X_Test.reshape(int(X_Test.shape[0]/dim_2), dim_2, dim_3)

y_test_SMOTE = []
for i in range(int(X_Test.shape[0]/dim_2)):
    # print(i)
    value_list = list(Y_Test.reshape(int(X_Test.shape[0]/dim_2), dim_2)[i])
    # print(list(set(value_list)))
    y_test_SMOTE.extend(list(set(value_list)))
    ## Check: if there is any different value in a list 
    if len(set(value_list)) != 1:
        print('\n\n********* STOP: THERE IS SOMETHING WRONG IN TEST ******\n\n')


0 commentaires