본문 바로가기
프로그래밍/Python

[Python] 리스트(튜플, 배열)에서 비복원(without replacement) 추출과 복원(with replacement) 추출하기

by 부자 꽁냥이 2022. 5. 7.

머신러닝을 구현함에 있어서 학습 데이터를 재추출(Resampling)할 필요가 있었는데 파이썬에서 재추출하는 방법이 있어서 적어두려고 한다. 내가 필요했던 것은 복원(with replacement) 추출이었는데 정리하는 김에 비복원 추출 방법도 적어둬야겠다. 나중에 필요할 수도 있으니까.

 

1. 비복원(without replacement) 추출

2. 복원(with replacement) 추출 


   1. 비복원(without replacement) 추출

비복원 추출(without replacement) 방법은 내장 모듈인 random과 외장모듈인 numpy를 이용한 방법 2가지가 있다. 각각에 대해서 알아보자.

1) random.sample을 이용하는 방법

random.sample을 이용하면 리스트(또는 튜플)에서 비복원 추출할 수 있다. 사용법은 첫 번째 인자에 리스트(또는 튜플 등)와 두 번째 인자에 추출할 샘플 수를 지정하면 된다. 참고로 random.sample은 가중치를 지정할 수 없다는 단점이 있다.

 

random.seed(100)
population = ['a','b','c','d','e','f']

## choose 3 elements without replacement
print(random.sample(population, k=3))

 

random.sample 을 이용한 비복원 추출 결과

 

비복원 추출(without replacement) 이므로 두 번째 인자(k)는 리스트 원소 개수보다 크면 안 된다.

 

random.sample 두 번째 인자는 리스트 원소 개수보다 크면 안된다.


2) numpy.random.choice를 이용하는 방법

numpy.random.choice를 통해서도 비복원 추출을 수행할 수 있다. 사용법은 첫 번째 인자에 리스트(또는 튜플, 배열 등), size인자에 추출할 샘플 개수, replace인자를 False로 바꾸면 된다.

 

np.random.seed(10)
population = ['a','b','c','d','e','f']
print(np.random.choice(population, size=3, replace=False))

 

numpy.random.choice 비복원 추출 결과

random.sample과는 달리 numpy.random.choice는 가중치(p)를 지정하여 비복원 추출(without replacement) 할 수도 있다. 단, 가중치의 합이 1이 되도록 맞춰야 한다.

 

np.random.seed(10)
population = ['a','b','c','d','e','f']
prob = np.array([2,3,3,4,1,7])
prob = prob/np.sum(prob) # 가중치합을 1로 맞춤

print(np.random.choice(population, size=3, replace=False, p=prob))

 

numpy.random.choice 비복원 추출 결과


   2. 복원(with replacement) 추출

복원 추출(with replacement)도 random 모듈과 numpy 모듈을 이용하여 수행할 수 있다.

1) random.choices를 이용하는 방법

random.choices를 이용하면 복원 추출(with replacement)할 수 있다. 사용법은 첫 번째 인자에 리스트(또는 튜플 등), k인자에 추출할 샘플 수를 넣으면 된다.

 

random.seed(100)
population = ['a','b','c']

## choose 5 elements with replacement
print(random.choices(population, k=5))

 

random.choices 복원 추출 결과

random.choices는 weights인자에 가중치를 지정하여 복원 추출(with replacement)할 수도 있다. 이때 좋은 점은 가중치 합을 1로 맞추지 않아도 된다는 것이다.

 

random.seed(100)
population = ['a','b','c']

## choose 5 elements with replacement and weights
print(random.choices(population, k=5, weights=[3, 10, 1]))

 

random.choices 가중치 복원 추출 결과

2) numpy.random.choice를 이용하는 방법

numpy.random.choice를 이용해서도 복원 추출(with replacement)을 수행할 수 있다. 앞에서 살펴보았던 replace 인자를 True로 바꾸어 주면 된다.

 

np.random.seed(10)
population = ['a','b','c']

## choose 5 elements with replacement
print(np.random.choice(population, size=5, replace=True))

 

numpy.random.choice 복원 추출

물론 가중치를 적용한 복원 추출(with replacement)도 가능하다.

 

np.random.seed(10)
population = ['a','b','c']
prob = np.array([3, 10, 1])
prob = prob/np.sum(prob)
## choose 5 elements with replacement and weights
print(np.random.choice(population, size=5, replace=True, p=prob))

numpy.random.choice 가중치 복원 추출


이번 포스팅에서는 복원 추출과 비복원 추출을 파이썬(Python)으로 하는 방법을 알아보았다. 이게 종종 쓰이는데 은근히 까먹어서 이번 기회에 확실하게 알 수 있었다.

 


댓글


맨 위로