인프런 커뮤니티 질문&답변

박희상님의 프로필 이미지
박희상

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

배깅(Bagging)과 랜덤 포레스트(Random Forest)의 이해

"Bagging의 이해와 Random Forest 소개" 강의에 대한 질문

작성

·

315

1

안녕하십니까?

1. RandomForest방식에 대해 강의 첫 부분에는 데이터를 Sampling하는 부분을 설명하셨는데요
   설명하신 jupyter Notebook의 RandomForest 부분 소스코드에는 'Sampling'하는 부분이 없는 것 같습니다.

   이 부분이 중요한 것 같은데요, RandomForestClassifier의 parameter에도 없는 것 같습니다.

   train_test_split에서 층화추출을 한다든지 하는 방법으로 추출방식을 지정하는 것처럼 
   부트스트랩에서 train dataset에 대해 sampling하는 방식 지정은 어떻게 하며 어떤 것들이 가능한 것인지요?

2. 딥러닝에서 overfitting을 해결하는 방법의 하나로 Data Augmentation을 쓴다고 알고 있습니다.

   "배깅의 이해와 Random Forest 소개" 강의 2번 슬라이드의 서브세트를 추출하는 부분 설명에서 생각난 것인데,
   여러 번 "sampling"하는 "추출 횟수"를 늘리면 정규분포를 따를 것이므로
   Data가 (특히 일반 현업에서는 더더욱) 적은 환경에서는 앙상블 기법을 써서 모델을 훈련시킬 수도 있는 것인지요?

   - 이렇게 머신/딥러닝을 배워 실무에 적용해 보려고 해도, 데이터가 적어서 문제가 될 것 같습니다.  [질문 취지]
   - 컴퓨터 비전쪽으로는 Augmentation이 가능한 것 같은데, 텍스트나 시계열에는 이러한 방법도 못 쓸 것 같은데...
      컴퓨터 비전 외의 분야(Text, 시계열)에 Augmentation 방법이 있다면 간략한 소개 부탁드립니다.  [추가 질문]

3. 머신러닝이나 딥러닝에서 미분을 설명하거나 경사하강법을 설명할 때 계곡에서 공을 굴리는 것에 비유하여
     설명하는 것을 종종 보았습니다. local이 아닌 global minimum을 찾는 것이 목적으로 이해되는데,
     같은 비유에서 질문드리자면, Data를 여러 영역으로 구분하여 공을 여러 개 굴리는 방법은 없는지요?
     이렇게 해서 각각의 영역에서 찾은 Local Minima를 비교하여 global minimum을 찾을 수도 있지 않나 싶습니다.
     이번에 배운 GridSearchCV나 Ensemble에서 Data를 나눠 처리하는 것을 보면 가능할 것도 같아 질문드립니다.

     - https://tensorflow.blog/케라스-딥러닝/2-4-신경망의-엔진-그래디언트-기반-최적화     
     - https://developers.google.com/machine-learning/crash-course/reducing-loss/gradient-descent?hl=ko
     - https://ruder.io/optimizing-gradient-descent/
     - https://github.com/Jaewan-Yun/optimizer-visualization

4. GridSearchCV에서 parameter 값들을 list를 사용하여 복수의 특정한 값을 지정하고 실행하는데요,
   이러한 값들을 범위값으로 지정하는 방법은 없는지요?

   질문의 취지는 어떠한 parameter를 [5, 10, 15, 20]으로 했는데, 실제 최적 parameter가 12였다면
   아예 최적화 대상 paramter 값을 예를 들어 "start=5, step=20, step=1"과 같이 지정하여 최적화 탐색을 한다면
   12를 더 쉽게 찾을 수 있지 않을까 하는 점입니다.

감사합니다. 수고하세요.

답변 3

2

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

1. random forest는 부트스트래핑 기반에서 random 하게 샘플링을 합니다. random 방식외에는 없습니다.

2. 딥러닝의 Augmentation에 매핑되는 대표적인 머신러닝 기법은 SMOTE(Synthetic Minority Over-sampling Technique)가 있습니다. 주로 imbalanced dataset에서 상대적으로 작은 타겟 값을 가지는 피처 데이터 세트를 증가시키는데 사용됩니다.

하지만 SMOTE를 적용하더라도 성능이 Deep learning의 augmentation을 적용하는 만큼 좋아지지 않는 경우가 대부분입니다. 이는 이미지 데이터와 정형 데이터가 가지는 본질적인 차이가 있기 때문입니다. 이미지 데이터의 경우 회전, Bright조절, Flip 등의 다양한 가공을 하여도 그 이미지의 target값이 영향을 받지 않는 경우가 대부분입니다. 하지만 정형 데이터의 특정값, 예를 들어 나이, 성별, 몸무게 등을 특정 범위이상 가공해 버리면 target 값이 크게 영향을 받습니다. target 값이 크게 영향을 받지 않으려면 피처들을 기존 데이터와 거의 비슷하게 만들어야 하는데, 이러면 새로운 데이터를 학습하는 의미가 없어지게 됩니다.

데이터를 가공한다는 보다 넓은 의미에서는 Feature Engineering도 Augmentation의 한 부분일수 있습니다(제 개인적인 생각입니다. )

3. 제가 질문을 제대로 이해하지 못했습니다. 일단 데이터를 나누어서 처리하는 방식의 효율성을 질의하신 걸로 가정하고 답변하겠습니다. 데이터를 나누어서 처리하는 것은 득보다 실이 많습니다. 머신러닝의 가장 중요한 성능 향상 요소는 데이터 입니다. 적은 데이터 보다 많은 데이터가(많고 다양한 데이터) 일반적으로 높은 성능을 보장합니다.  1/10 개의 데이터로 10개의 모델을 앙상블 하는 것보다 원래 데이터로 1개의 모델이 더 높은 성능을 보일 가능성이 높습니다.

4. GridSearchCV의 가장 큰 문제는 최적 파라미터를 찾는데 너무 오랜 시간이 소모 된다는 것입니다. 파라미터가 3개 , 그리고 각각의 파라미터가 값을 5개 가지고 있다고 한다면 15X CV갯수만큼 반복해야 합니다. 때문에 GridSearchCV를 구현 모듈은 입력 인자로 연속값이 아닌 이산값만을 받아들이는게 보통입니다. 말씀하신 "start=5, step=20, step=1" 는 역시 이산값이며 GridSearchCV 구현 모듈이 이러한 방식을 유연하게 받아 들일 수 있도록 모듈 설계를 하는 것도 좋아 보입니다. 하지만 너무 광범위하게 입력 값을 넣는 방식을 허용하면 오랜 수행 시간 때문에 사용에 불편함이 느껴질 수도 있을 거 같습니다(개인적인 의견입니다 ^^;;)

"start=5, step=20, step=1"과 같은 방식을 원하시면 parameter_values = [value for value in range(5, 20, 1)] 와 같이 list comprehension 값으로 변경하여 입력하셔도 될 것 같습니다

감사합니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

아닙니다, 모두 다 좋은 질문들이었습니다. 감사합니다.

0

박희상님의 프로필 이미지
박희상
질문자

수강 중 문뜩 떠오른 정제되지 않은 거친 생각에서 나온 질문에 대해 친절하고 신속하게 답변해 주신 점 감사드립니다.
답변해 주신 내용은 학습하면서 참조하도록 하겠습니다.

박희상님의 프로필 이미지
박희상

작성한 질문수

질문하기