Deep learning

Imbalanced data

비비이잉 2021. 7. 23. 15:41
반응형

https://mjdeeplearning.tistory.com/77

 

기본 데이터셋에서 실험할 데이터크기에 따라 Imbalance 한 데이터셋을 만들어야한다. 데이터가 중복되지 않도록 만드는 것이 중요하다. 데이터의 크기가 많으면 그렇게 중요하지 않을수 있지만 소수의 데이터에서 실험하고자하는 데이터에서 각 클래스별로 데이터수가 다르고 이러한 데이터셋이 딥러닝 학습에 영향을 주는지 확인을 해야하기 때문에 중요한 사항이 된다.

 

data크기만큼 정확한 학습을 하기 위해서는 배치 단위 학습시에 배치의 크기로 데이터의 크기를 나눴을때 나머지가 0이되도록 해서 데이터 전체가 학습에 사용되도록 해야한다.

 

ex ) len(imbalance_data) / batchsize ==0

/ 나누기 % 나머지

 

배치사이즈와 트레이닝 데이터 사이즈가 맞지 않으면 학습시에 데이터가 잘리는 현상이 발생하게 되기 때문에 이 부분이 중요하다. 데이터의 feature map 이나 어떠한 작업을 추후에 할 경우 기존에 생성한 train data 수가 맞지 않는 문제가 발생, 즉 생성한 데이터의 수와 실제로 사용된 데이터의 수가 차이나기 때문에 정확한 실험이 불가능하다.

 

 

 

✔️ deep learning 학습 시 배치 사이즈를 4 8 16 32 64 128 이런식의 배치를 많이 따르게 된다. 왜냐하면 배치사이즈와 트레이닝 데이터의 사이즈가 딱 맞아 떨어지지 않기 때문에 학습시에 데이터가 잘리는 현상이 생기기 때문이다.

 

✔️ 또한 데이터의 피쳐맵이나 추후에 다른 작업시, 기존에 생성한 train data 수와는 맞지 않는 문제가 발생한다. 즉 생성한 데이터의 수와 실제로 사용된 데이터의 수가 차이나기 때문에 정확한 실험이 불가능

 

 

<Method>

  1. 데이터를 생성
  1. 셔플함수를 통해서 데이터 인덱스를 무작위로 섞음
  1. start_index와 finish_index 를 batch_size 만큼 해당 index의 데이터를 뽑아옴
  1. start_index와 finish_index 를 batch_size 만큼 더해줘 index의 위치를 변경해줌
  1. 3,4를 반복해서 데이터를 학습시킴

 

Code

def data_shuffle(data_x, data_y):

    print('train data shuffle')

    idx = np.arange(0, len(data_x))
#데이터 크기만큼의 배열이 생성됨 
#arange 는 연속된 값이 들어가있는 numpy array를 생성한다. 1,2,3,4,5 와 같이 연속된 숫자가 들어가있는 것 
#파라미터 1개만 쓰면 numpy.arange(6)하면 0,1,2,3,4,5 를 나타냄 
#파라미터 2개쓰면 numpy.arange(1,9)하면 1,2,3,4,5,6,7,8 를 나타냄 
    np.random.shuffle(idx)
#arr = np.arange(10)
#np.random.shuffle(arr)
#arr
#[1 7 5 2 9 4 3 6 0 8] # random
#이렇게 무작위로 섞는다. 

    idx = idx[:len(data_x)]



    data_shuffle = [data_x[i] for i in idx]

    labels_shuffle = [data_y[i] for i in idx]



    return np.asarray(data_shuffle), np.asarray(labels_shuffle)



def next_batch(start_index, finish_index, data_x, data_y):

    data_shuffle = data_x[start_index:finish_index]

    labels_shuffle = data_y[start_index:finish_index]



    return np.asarray(data_shuffle), np.asarray(labels_shuffle)



train_x, train_y, test_x, test_y , vali_x, vali_y = mnist_function.data_set(count)



train_x, train_y = mnist_function.data_shuffle(train_x, train_y)



start_index = 0

finish_index = batch_size

    for i in range(total_batch):

        batch = mnist_function.next_batch(start_index, finish_index, train_x, train_y)



        start_index += batch_size

        finish_index += batch_size

 

  1. Given the proportions as 0.3% to 99.7%, this is a very highly skewed data set. You hardly have 3 samples of positive classes for every 1000 samples. I would say you should look at balancing the data set by getting more positive classes. Go and get as many positive samples as you can. Then, you can use a more balanced dataset. For example, you could get 1000 positive samples and then pick a random set of 1000 negative samples and build the classifier. Now, it should be able to learn both the classes.

 

1000개 중에 3개밖에 없는 것 (positive)

 

2. Use a

weighted error measure

when updating the weights after a mini-batch. The weights are updated in proportions to the number of samples of the positive and negative classes during any mini-batch. Now, in the current situation given the proportions as 3:1000, even this trick may not work. So you may try getting the proportions to something like 300:1000 by getting 297 more positive samples and combining them with 1000 negative samples. Then with 300:1000 ratio you should weight the error during mini-batches based on number of samples in each of the classes. This should work.

 

over-sampling minority class - 작은 클래스에 있는 애들을 여러번 샘플링하거나

under-sampling majority class - 큰 클래스에 있는 애들은 적게 샘플링 하거나 두가지의 방법이 존재한다.

 

 

 

 

 

반응형

'Deep learning' 카테고리의 다른 글

SMOTE for imbalanced image dataset  (0) 2021.08.13
GAN(Generative Adversarial Network)  (0) 2021.08.06
Model Performance Measure  (0) 2021.07.23
Transfer Learning  (0) 2021.07.23
Learning rate scheduler  (0) 2021.07.01