머신러닝을 구현함에 있어서 학습 데이터를 재추출(Resampling)할 필요가 있었는데 파이썬에서 재추출하는 방법이 있어서 적어두려고 한다. 내가 필요했던 것은 복원(with replacement) 추출이었는데 정리하는 김에 비복원 추출 방법도 적어둬야겠다. 나중에 필요할 수도 있으니까.
1. 비복원(without 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))
비복원 추출(without replacement) 이므로 두 번째 인자(k)는 리스트 원소 개수보다 크면 안 된다.
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))
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))
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는 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]))
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))
물론 가중치를 적용한 복원 추출(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))
이번 포스팅에서는 복원 추출과 비복원 추출을 파이썬(Python)으로 하는 방법을 알아보았다. 이게 종종 쓰이는데 은근히 까먹어서 이번 기회에 확실하게 알 수 있었다.
'프로그래밍 > Python' 카테고리의 다른 글
[Python] os와 shutil 모듈을 사용하여 파일 삭제(제거), 폴더 삭제(제거) 하기 (398) | 2022.05.07 |
---|---|
[Python] shutil을 이용한 파일 복사(File Copy), 폴더 복사(Folder Copy) 하기 (feat. distutils) (404) | 2022.05.07 |
[Python] 단어 집합(리스트, 튜플)에서 특정 단어와 가장 유사한 단어 찾기 difflib.get_close_matches (388) | 2022.05.01 |
[Python] difflib.SequenceMatcher 두 문자열(단어)의 유사도(Similarity) 계산하기 (422) | 2022.05.01 |
[Python] iter함수와 itertools를 이용하여 메모리를 절약하면서 배열을 순서대로 그룹화(Grouping)하기 (417) | 2022.04.23 |
댓글