동전에 이어 이번에는 나무...? Random Forest Model 은 뭘까

2023. 7. 31. 11:40광고차단 머신러닝

728x90

2023.06.28 - [산학협력프로젝트] - 산학협력 프로젝트, 광고 차단 오토로 돌리기 (졸업 하고 싶어요ㅠ)

 

산학협력 프로젝트, 광고 차단 오토로 돌리기 (졸업 하고 싶어요ㅠ)

1. 오늘의 주제 이번에 진행한 프로젝트는 산학협력 프로젝트입니다! 주제는 '기계 학습을 통한 광고 사이트 자동 차단 프로그램' 입니다. 이미 광고 사이트 차단해주는 프로그램 있지 않아요? Ad

xpmxf4.tistory.com

2023.07.27 - [산학협력프로젝트] - ??? : 토크나이저...? 토큰...? 동전...?, 기술 선택의 이유와 근거 (2)

 

??? : 토크나이저...? 토큰...? 동전...?, 기술 선택의 이유와 근거 (2)

2023.07.24 - [산학협력프로젝트] - ??? : "하... 뭐 고르지?", 기술 선택의 이유와 근거 (1) ??? : "하... 뭐 고르지?", 기술 선택의 이유와 근거 (1) 뭐 먹을까요? 깔깔깔 산학협력 프로젝트, 광고 차단 오

xpmxf4.tistory.com

위 글을 읽고 오시면 좋습니다!


오늘의 주제

저번 글에서 말했듯이

광고 사이트처럼 '생긴' 사이트를 구분하는 모델을 개발중이고 이는

<body> 안 자연어 - BERT 와

<body> 안 태그 구조 - Random Forest 

로 생김새를 Fine Tuning 한다고 얘기를 했었습니다.

 

오늘은 이 Random Forest Model 에 대해 간략하게 알아본 다음 

구체적으로 어떤 방식을 채택해 프로젝트에 적용했는 지 알아보겠습니다!

Random Forest Model 이란?

앙상블 학습(Ensemble Learning)은 여러 개의 분류기를 생성하고,
그 예측을 결합함으로써 보다 정확한 예측을 도출하는 기법을 말합니다.
강력한 하나의 모델을 사용하는대신 보다 약한 모델 여러 개를 조합하여 더 정확한 예측에 도움을 주는 방식입니다.

현실세계로 예를 들면, 어려운 문제를 해결하는데 한 명의 전문가보다
여러 명의 집단지성을 이용하여 문제를 해결하는 방식을 앙상블 기법이라 할 수 있습니다.

전 세계의 머신러닝 개발자들의 기량을 겨루는 오픈 플랫폼 캐글(Kaggle)에서
XGBoost, LightGBM과 같은 앙상블 알고리즘이 머신러닝의 선도 알고리즘으로 인기를 모으고 있다는 점에서
앙상블 학습의 강력함을 확인할 수 있습니다.

[출처] : http://www.dinnopartners.com/__trashed-4/

쉽게 얘기하면 랜덤 하게 피처와 data를 선택,

여러 개의 Decision Trees(=분류기)를 만들어 조합하여 만든 모델입니다!

그렇다면 Decision Tree 란?

 

음식 고르기 Decision Tree

Decision Tree니, 분류기라고 하면 뭔가 되게 어렵다고 느껴지지만

사실 이미 일상에서 우리는 위 사진처럼 음식 고르기 Decision Tree, 즉 알고리즘이 존재해요.

의사결정나무(decision tree)는 여러 가지 규칙을 순차적으로 적용하면서 독립 변수 공간을 분할하는 분류 모형이다. 

[출처] : https://colab.research.google.com/github/datascienceschool/book/blob/master/ds/03%20machine%20learning/12.01%20%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95%EB%82%98%EB%AC%B4.ipynb#scrollTo=0RfvEyVImO41

즉, Decision Tree 란 tree 구조를 가지는 알고리즘이고,

각 분기점(node) 에서 특정 기준에 따라 데이터를 분류하며, 최종 결정을 내리게 된다.

'Random' Forest Model 이라고 불리나?

쉽게 얘기하면 랜덤 하게 피처와 data를 선택,
여러 개의 Decision Trees(=분류기)를 만들어 조합하여 만든 앙상블 모델입니다!

위에서 말했듯이 'Random'하게 여러 Decision Tree를 만들어 하나의 Forest를 형성하는,

즉 여러 모델을 합쳐 더 나은 결과를 도출하는 모델을 만들게 되는 모델입니다!

여러 트리가 모여 숲이 되듯이!

Random 하게 뽑는다는 건?

Random 이 대체 무슨 의미인지 '식당'이라는 예시를 통해 알아보자.

가족, 연인끼리 식당을 간다고 하면 우리는 '좋은 식당'을 가고 싶을 거예요.

좋은 식당을 찾기 위해 블로그 후기 등을 찾아보게 되죠.

 

이때 우리는 여러 기준을 통해 각자가 생각하는 기준을 통해 판단하게 되죠.

  1. 위치
  2. 가격
  3. 메뉴의 다양성
  4. 평점

등등...

 

우리는 이 모든 기준을 통해 종합적인 판단을 할 수도 있겠지만

Random Forest Model(이하 RF)는 이러한 여러 기준 중 

랜덤 하게 몇 개만 뽑아 여러 Decision Tree를 형성하게 됩니다.

  1. 위치+가격
  2. 메뉴 다양성+평점
  3. 가격+평점

등등

 

1,2,3.. etc 기준들을 통한 판단을 하게 된다면

우리는 식당을 다양한 기준, 어느 한쪽에 치우치지 않은 판단을 할 수 있게 됩니다.

그렇다면 어떻게 Decision Tree 기준을 실제로 어떻게 뽑을까?

이제 일반적인 경우에서 데이터를 어떻게 뽑는지 알아보겠습니다.

  1. 부트스트랩 샘플링(Bootstrap Sampling)
    - 같은 데이터 셋에서 랜덤 하게 중복을 허용하여 데이터를 뽑는다.
    - 이렇게 만들어진 새로운 데이터셋을 이용해 각 트리를 학습시킨다.
    ex) 원본 : [A B C D E] -> [B D D A C], [A C C C E],... etc
  2. 피쳐 랜덤 선택
    - 각 트리는 전체 피처 중 일부만 랜덤 하게 선택하여 사용한다.
    - 이는 트리들이 서로 다른 피처에 초점을 맞추게 하여 과적합을 방지
    ex) 원본 : [가 나 다 라] -> [가 나 다], [나 라 마], [가 다 마],... etc

보통의 Random Forest Model 은 위 2가지 방법을 통해

여러 DataSet을 만들어 각 트리를 '다양화' 시키게 됩니다.

 

이런 다양화는 학습하고자 하는 오브젝트의 여러 측면을 학습해

강력하고 견고한 모델을 만들어내게 됩니다.

나는 무슨 방식을 채택했나?

이번 프로젝트에서 저는 2 가지의 방식을 전부 채택하게 되었습니다.

# 학습 데이터와 테스트 데이터 분리
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

# 랜덤 포레스트 모델 학습
rf = RandomForestClassifier(n_estimators=100, random_state=42) # 기본적으로 부트스트랩, 피쳐랜덤선택 방식 사용한다!
rf.fit(X_train, Y_train)

주석에서 나와 있듯이, 위처럼 RandomForestClassifier를 호출하게 된다면

기본값으로 부트스트랩 샘플링과 피쳐 랜덤 선택 방식을 채택하게 되어 있습니다.

def __init__(
        self,
        n_estimators=100,
        *,
        criterion="gini",
        max_depth=None,
        min_samples_split=2,
        min_samples_leaf=1,
        min_weight_fraction_leaf=0.0,
        max_features="sqrt",			# "auto", "sqrt" 로 입력시 랜덤으로 적용이 됩니다!
        max_leaf_nodes=None,
        min_impurity_decrease=0.0,
        bootstrap=True,					# 부트스트랩 샘플링을 기본적으로 사용
        oob_score=False,
        n_jobs=None,
        random_state=None,
        verbose=0,
        warm_start=False,
        class_weight=None,
        ccp_alpha=0.0,
        max_samples=None,
    )

여러 파라미터 중에서 주석처리 된 두 부분 때문에 제 코드처럼 호출하게 된다면

기본적으로 부트스트랩 샘플링과 피쳐 랜덤 선택 방식을 채택하게 됩니다!

엥? 2 가지 방식을 다 채택할 수가 있어?

하나는 중복을 허용해서 뽑고,
다른 하나는 중복을 허용하지 않는 다면서?
가능해?

라는 질문을 하실 수 있습니다!
(사실 제가 함)

 

하지만 조금만 달리 생각해 보면 가능한 일임을 알 수 있습니다.

예시를 통해 볼까요?

간략히만 표현했습니다!

현재 저의 엑셀 파일을 간단히 표현하면 위처럼 되어 있습니다.

이때 먼저 각 행에 존재하는 HTM1L 코드는 텍스트 상태에서는

Random Forest 모델 학습에 사용을 할 수 없습니다.

 

즉, 모델이 학습을 할 수 있도록 '피처 엔지니어링'을 통해

수치/범주 형 데이터로 변환을 해야 하고, 이를 '벡터화'라고 합니다.

# 피처 벡터화
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(parsed_html_features)

CountVectorizer를 사용해서 HTML 코드에 등장하는 각각의 태그를 개별 피처로 인식,

p, div, a 등의 태그들을 각각의 피처(특징)로 인식해

모델이 이해할 수 있는 형태로 바뀌게 됩니다!

 

즉 벡터화 이후 기계가 바라보는 저의 엑셀 형식은 다음과 같습니다.

이해를 위한 예시입니다, 실제로는 이렇게 안 생겼어요!

벡터화 후 각 행에는 여러 열이 존재하게 되는 형태입니다.

그래서 이제 아까 얘기한 2가지 방법이 가능하게 되는 겁니다.

  1. 부트스트랩 : [1 2 3 4 5] 중 [1 2 2 4 5], [1 1 1 1 5] 등등
  2. 피쳐 랜덤 : [div p], [a span], [p a], 등등

어떤 행을 중복을 허용해 뽑을 건지는  부트스트랩 샘플링,

어떤 열을 중복을 허용하지 않으면서 뽑을지는 피쳐 랜덤 선택.

 

결론

오늘은 저번 글에 이어

Random Forest Model을 왜 선택하고, 이것이 무엇인지,

그리고 저는 실제로 어떻게 적용했는지에 대해 알아봤습니다!

728x90