다음과 같이 시험점수를 예측하는데 세 개의 변수를 사용해보자.

변수가 여러 개일 때는 가설이 아래와 같이 각 변수에 가중치가 곱해지고,
비용함수는 동일하게 만들어진다.

일일이 n개의 항을 나열해서 쓰는 것은 번거롭기 때문에 아래와 같이 행렬을 이용해서 간편하게 가설을 나타낼 수 있다.
행렬로 나타내면 피처가 몇개가 되던 동일한 표현 방식으로 심플하게 나타낼 수 있다.

주의할 점은 이론적으로 우리가 가설식을 쓸 때 가중치를 먼저 쓰지만(wx)
텐서플로에서 가설을 나타낼 때는 데이터 값을 먼저 쓴다.(XW)

계산을 단순하게 하기 위해서 bias가 없는 Hypothesis를 가정하면 비용함수는 아래와 같다.
(W가 매트릭스가 되면 bias도 W안에 포함되어 있다.)

이 단순한 가설에서 W에 따른 cost를 계산하면 아래와 같이 나온다.

조밀한 그래프로 그리면 이와 같이 나오는데, 이 그래프에서 cost가 최소값이 되는 지점을 찾는 것이 목표이다.
그래프를 직접 눈으로 보면 직관적으로 알 수 있지만, 컴퓨터가 최저점을 하려면 알고리즘이 필요하다.

Gradient Descent Algorithm

이를 위한 방법 중 하나가 Gradient Descent Algorithm(경사하강법)이다.
비용함수 cost(W,b) 에서는 비용이 최소화되는 W와 b를 찾게 된다.

작동방식

(1) 최초의 임의의 추정값을 통해서 W와 b값을 정한다.
(2) cost(W,b)가 줄어들도록 W와 b를 계속 변화시키며 Gradient(기울기, 미분값)를 구한다.
(3) local minumum에 도달할 때까지 반복한다.

Cost function의 미분(Gradient 구하기)

우선 미분 이후 식을 간편하게 보기 위해 Cost 함수를 약간 수정한다.
(몇으로 나누는 Cost의 특성에 크게 영향을 주지 않는다.)

경사하강법에서는 W를 비용함수의 미분값과 학습률(ɑ, learning rate)의 곱을 차감하며 계속 업데이트 한다.
W가 얼마나 빠르게 업데이트 되는지는 학습률(ɑ)의 값에 따라 달라진다.

아래 그림은 W와 b의 값에 따른 비용함수를 3차원으로 나타낸 것이다.
이런 형태의 비용함수에서는 경사하강법에서 어떤 지점에서 경사하강법을 사용하느냐에 따라
최소값을 찾지 못할 수 있다. (Local Mimimum에 빠질 수 있다.)

1. Regression

  • 의미 : Regression toward the mean
    → 데이터들은 전체의 평균으로 되돌아가려는 특징이 있다는 의미

2. Linear Regression

데이터(아래의 파란색 점)를 가장 잘 대변하는 직선의 방정식을 찾는 것(기울기와 절편을 찾는 것)

3. Hypothesis

데이터를 대변하는 것으로 생각되는 직선의 식(가설)을 H(x) = Wx + b 라고 한다.
이 때의 W를 Weight, b를 bias라고 한다.


위 그래프의 파란 세점을 나타내는 세 개의 선이 있다고 하자.
이 경우에는 파란색 점선이 가장 이 점들을 잘 나타내는 것으로 보인다.
이 때의 W와 b를 어떻게 정의할 수 있을까?

4. Cost


H(x) = Wx + b의 W와 b값을 찾기 위해 Cost라는 개념을 도입하게 된다.
위의 그래프에서 가설의 그래프가 실제 데이터(점)과의 거리, H(x)-y를 Error 혹은 Cost라고 한다.
이 Cost가 작을수록 점선(가설)이 데이터를 잘 대변한다고 볼 수 있다.


그런데 이 때, 단순히 합을 최소화하고자 할 때, 데이터에 따라 Cost 값이 양수일수도 음수일수도 있다.
실제 데이터와 차이가 많이 나더라도, 양수와 음수 값이 서로 상쇄해서 Cost가 적은 것처럼 보일 수 있다.
이 점을 보완하기 위해서 각 Error의 제곱을 합산해서 이 값의 최소값을 구하는 방식이 많이 사용된다.

가설의 비용함수(Cost function)을 아래와 같이 나타낼 수 있다.


이 때 W와 b의 함수인 비용함수를 최소화하는 것이 선형회귀에서의 우리의 목표라 할 수 있다.

산탄데르 고객만족 예측

https://www.kaggle.com/c/santander-customer-satisfaction

370개의 피처로 이루어진 데이터 세트 기반에서 고객만족 여부를 예측하는 것
피처이름은 모두 익명화되어 있어 어떤 속성인지는 알 수 없습니다.

클래스 레이블명은 TARGET이며 1이면 불만, 0이면 만족한 고객입니다.

모델의 성능평가는 ROC-AUC로 평가합니다.
대부분이 만족이고, 불만족인 데이터는 일부이기 때문에 단순 정확도 수치보다 ROU-AUC가 더 적합합니다.

데이터 전처리

클래스 값 컬럼을 포함하면 총 371개의 피처가 존재합니다.
피처들의 타입과 Null값을 더 살펴보겠습니다.

111개의 피처가 float형, 260개의 피처가 int형이며 NULL 값은 존재하지 않습니다.
다음으로 레이블인 TARGET의 분포를 살펴보겠습니다.

데이터프레임의 describe() 메소드를 사용해 각 피처의 값 분포를 간단히 확인해보겠습니다.

var3의 경우 최소값이 -999999로 나왔는데 1, 2, 3분위 수나 최댓값으로 미루어 보았을 때 결측치로 보입니다.

-999999의 값은 116개로 전체 데이터에 대해 비중이 적으므로 가장 값이 많은 2로 대체하겠습니다.
그리고 ID는 단순 식별자이므로 피처에서 드롭하겠습니다.
그 후에 피처들과 레이블 데이터를 분리해서 별도로 저장하겠습니다.

이후 성능평가를 위해서 현재 데이터 세트를 학습과 테스트 데이터 세트로 분리하겠습니다.
비대칭 데이터 세트이기 때문에 레이블의 분포가 원 데이터와 유사하게 추출되었는지 확인해보겠습니다.

데이터 세트 분할 결과 원 데이터셋과 유사하게 unsatisfied의 비율이 4%에 근접하는 수준이 되었습니다.

XGBoost 모델 학습과 하이퍼 파라미터 튜닝

XGBoost로 기본 세팅을 아래와 설정하고, 예측결과를 ROC-AUC로 평가해보겠습니다.

n_estimators = 500

early_stopping_rounds = 100

eval_metric = 'auc'

평가 데이터세트는 앞에서 분리한 테스트 데이터 세트를 이용하겠습니다.
테스트 데이터 세트를 XGBoost의 평가 데이터 세트로 사용하면 과적합이 될 우려가 있지만, 일단 진행하겠습니다.

eval_set = [(X_train, y_train), (X_test, y_test)]

테스트 데이터 세트로 예측시 ROU AUC는 약 0.8419가 나왔습니다.
다음으론 XGBoost의 하이퍼 파라미터 튜닝을 수행해보겠습니다.
컬럼의 수가 많아 과적합 가능성을 가정하고, max_depth, min_child_weight, colsample_bytree만
일차적으로 튜닝하겠습니다.
학습시간이 많이 필요한 ML모델의 경우 2~ 3개 정도의 파라미터를 결합해 최적파라미터를 찾아낸 뒤
이 파라미터를 기반으로 1~2개의 파라미터를 결합해 파라미터 튜닝을 수행하는 것입니다.

뒤의 예제 코드에서는 수행시간이 오래 걸리므로
n_estimators = 100, early_stopping_rounds = 30으로 줄여서 테스트하겠습니다.

파라미터가 위와 같을 때, 처음실행한 0.8419에서 0.8438로 성능이 소폭 좋아졌습니다.
이를 기반으로 n_estimator를 1000으로 증가시키고, learning_rate = 0.02로 감소시켰습니다.
그리고 reg_alpha = 0.03을 추가했습니다.

ROC AUC가 0.8441로 이전보다 조금 더 향상되었습니다.
튜닝된 모델에서 피처 중요도를 그래프로 나타내보겠습니다.

1. LightGBM의 장단점

LightGBM의 장점

(1) XGBoost 대비 더 빠른 학습과 예측 수행 시간
(2) 더 작은 메무리 사용량
(3) 카테고리형 피처의 자동 변환과 최적 분할
: 원-핫인코딩 등을 사용하지 않고도 카테고리형 피처를 최적으로 변환하고 이에 따른 노드분할 수행

LightGBM의 단점

적은 데이터 세트에 적용할 경우 과적합이 발생하기 쉽습니다.
(공식 문서상 대략 10,000건 이하의 데이터 세트)

기존 GBM과의 차이점

일반적인 균형트리분할 (Level Wise) 방식과 달리 리프중심 트리분할(Leaf Wise) 방식을 사용합니다.

  • 균형트리분할은 최대한 균형 잡힌 트리를 유지하며 분할하여 트리의 깊이를 최소화하여
    오버피팅에 강한구조이지만 균형을 맞추기 위한 시간이 필요합니다.
  • 리프중심 트리분할의 경우 최대 손실 값을 가지는 리프노드를 지속적으로 분할하면서
    트리가 깊어지고 비대칭적으로 생성합니다. 이로써 예측 오류 손실을 최소화하고자 합니다.

 

2. LightGBM의 하이퍼 파라미터

하이퍼 파라미터 튜닝방안

num_leaves의 개수를 중심으로 min_child_sampes(min_data_in_leaf), max_depth를
함께 조절하면서 모델의 복잡도를 줄이는 것이 기본 튜닝 방안입니다.

  • num_leaves를 늘리면 정확도가 높아지지만 트리가 깊어지고 과접합되기 쉬움
  • min_child_samples(min_data_in_leaf)를 크게 설정하면 트리가 깊어지는 것을 방지
  • max_depth는 명시적으로 깊이를 제한. 위의 두 파라미터와 함꼐 과적합을 개선하는데 사용

또한, learning_rate을 줄이면서 n_estimator를 크게하는 것은 부스팅에서의 기본적인 튜닝 방안

 

3. LightGBM 적용 - 위스콘신 유방암 예측

LightGBM에서도 위스콘신 유방암 데이터 세트를 이용해 예측을 해보겠습니다.

feature importance 시각화

LightGBM도 plot_importance() 를 통해 시각화 가능

1. Estimator API

Estimaotor API는 앞서 학습한 텐서플로의 API에서 상위 레벨의 한 부분이다.

Estimator API를 사용하면 매번 코드를 일일이 입력하지 않고도,
위의 도표에 있는 다양한 이점을 활용할 수 있다.

텐서플로는 직접 바로 실행해볼 수 있는 pre-made estimator들을 활용할 수 있다.

2. Pre-made Estimators

예시를 들어 부동산의 가격을 예측을 하려고 하자.
이 때 우리는 먼저 피처를 선택해야 한다.
이번 예시에서는 집의 면적과 종류를 피처로 사용.

먼저 피처를 정하기 위해 feature_column API를 사용할 수 있다.
이번 예시에서는 numeric column과 categorical column이 하나씩 사용되었다.

그 후에는 모델을 선택하는데 이번 예시에서는 linear regressor가 선택되었다.

선형회귀모델은 데이터의 벡터를 인풋으로 받아들이고, 이 인풋들에 대한 가중치를 조절해나가면서
아웃풋으로 예측 숫자(부동산 가격)을 예측한다.

이번 예시에서는 numeric과 categorical 만을 사용했지만 embedding, crossed 등 더 다양한 형태의 컬럼이 API로 존재한다.

그 후에는 모델에 input 데이터를 넣어, 모델을 학습시킨다.
이번 예제에서는 데이터셋에 대해 100번 반복해서 학습을 한다.

이 후에는 인풋 데이터와는 다른 데이터를 집어넣어 결과를 예측한다.

다른 pre-made estimator를 사용하려면 위와 같이
클래스을 변경하고 그에 따른 적절한 파라미터만 적용해주면 된다.

아래는 위의 예시를 반복해서 실행해본 내용

3. Checkpoint

체크포인트는 위와 같이 학습의 지속, 실패로부터의 재개, 학습된 모델로부터의 예측 등을 위해 유용하게 사용된다.

위와 같이 모델을 정의할 때 어디에 체크포인트를 저장할지 경로를 지정해주면 된다.

그 후에는 위와 같이 다시 불러와서 저장된 학습된 모델을 가지고 예측을 수행할 수 있다.

그리고 위와 같이 학습된 데이터를 불러와서 학습을 마저 재개할 수도 있다.
만약 다시 처음부터 다시 학습을 재개하고 싶다면 이 폴더를 삭제하면 된다.
최근의 체크포인트로부터 시작하는 것이 디폴트이기 때문에 학습을 처음부터 다시 수행시키고 싶다면
체크포인트를 반드시 삭제해야한다.

4. Training on in-memory datasets

데이터셋이 numpy array이거나 pandas 이면 Estimator API는
데이터를 입력하는데 편리한 함수를 가지고 있다.
estimator.inputs.numpy_input_fn(),estimator.inputs.numpy_input_fn()
위의 예시처럼 피처가 될 x와 레이블이 될 y를 지정해주면 된다.

이 함수들은 뉴럴 네트워크모델 학습에 키가 되는 몇몇 기능들을 가지고 있다.
먼저 배치 사이즈를 조절할 수 있다.
→) 전체 데이터셋을 한번에 학습하는 것보다 데이터의 미니 배치를 단계별로 학습하는 것이 통상 좋다.
그리고 데이터 셋을 몇번 반복할 것인지 에포크 숫자를 조절함으로써 세팅할 수 있다.
데이터를 무작위로 섞기도 가능하며, 복제된 데이터셋의 크기 또한 조절이 가능하다.

기본적으로 학습은 데이터가 소진되거나 정의한 n 에포크에 도달할 때까지 진행된다.
그리고 학습 함수를 호출할 때, step수를 지정해줌으로써 더 진행할 수도 있다.
위의 예시에서는 마지막 체크포인트에서부터 1000번의 학습스텝을 더 진행한다.
그리고 max_steps에서 지정한 수에 도달하면 학습을 멈추게 할 수도 있다.
(하지만 체크포인트가 이미 그 지점까지 와있다면 별 영향이 없다.)

'구글 머신러닝 스터디잼(중급) > Introduction to TensorFlow' 카테고리의 다른 글

Debugging TensorFlow Programs  (0) 2019.10.29
TensorFlow 실습 1  (0) 2019.10.28
Tensor and Variable  (0) 2019.10.25
Graph and Session  (0) 2019.10.25
TensorFlow API Hierarchy  (0) 2019.10.25

+ Recent posts