서포트 벡터 머신


서포트 벡터 머신(이하 SVM)은 머신러닝의 지도학습에서 분류를 위해 사용하는 알고리즘 모델로, 결정 경계(Decision Boundary)를 찾기 위해 사용된다. 

 

 

결정 경계란 위 그림에서 원과 별을 분류하기 위한 빨간 실선이며, 양 옆의 검은 실선은 Margin이라 한다.  SVM의 주 목적은 두 Margin의 거리를 최대화 시킬 수 있는 즉, GAP을 최대화 시킬 수 있는 지점을 찾는 것이다. 

 

만약 feature가 두 개만 존재할 경우 다음과 같이 Dicision Boundary는 아래와 같이 간단한 실선 형태가 될 것이다.

 

하지만 feature가 3개로 늘어난다면 다음과 같이 3차원으로 나타내야 한다(아래는 실제로 feature가 3개가 아님)

이 때 결정 경계는 선이 아니라 위와 같이 평면으로 변하게 된다. 하지만 만약 feature가 3개가 아니라 4개, 5개 늘어나서 무한개의 feature를 분류해야하는 상황에 마주하면 어떻게 될까? 인간은 3차원까지 인식할 수 있기 때문에 시각화하여 나타낼 수 없다. 따라서 이러한 부분은 방사 기저 함수(RBF: Radical Bias Function)로 해결할 수 있는데 추후 아래에서 설명할 것이다.

 

SVM 모델 장점

Suppor Vector는 결정 경계와 가장 가까이 있는 클래스의 데이터 포인트를 의미한다. SVM에서는 결정 경계를 찾는 것이 결국 Support Vector이기 때문에 데이터 포인트 중에서 Support Vector만 잘골라낸다면 나머지 쓸 데 없는 수 많은 데이터 포인트들을 무시할 수 있다. 따라서 매우 빠르다.

 

 

이상치(Outlier) 허용


분류하고자 하는 데이터 포인트의 분포가 늘 고르게 있는 것이 아니기 때문에 아래와 같은 경우가 있을 수 있다. 이러한 Outlier를 허용 여부에 따라 Hard margin과 Soft Margin으로 나뉠 수 있다.

Hard Margin의 경우 이상치 데이터를 허용하지 않는 것을 의미하며 이렇게 될 경우 Support Vector와 Dicision Boundary간의 거리가 좁아 진다. 이렇게 될 경우 개별적인 데이터를 학습하여 분류의 정확도를 올리려다가 오히려 아래의 예시와 같이 오버피팅 문제가 발생할 수 있다.

 

모든 데이터를 학습하여 분류의 정확도는 올라갔으나 이후에 있을 데이터에 대해서는 조금만 벗어나도 예측에 어려움이 있다.

 

Soft Margin의 경우 이상치 데이터를 어느정도 허용하는 것을 의미하며 이렇게 될 경우 어느정도 오버피팅 문제를 완화시켜줄 수 있다. 하지만 여기에도 데이터 학습을 제대로 하지 못하는 언더피팅 문제가 발생할 수 있기 때문에 적절한 margin 파라미터를 찾는 것이 중요하며, sikit-learn에서는 C 라는 파라미터를 사용하여 margin을 결정한다.

 

classifier = SVC(C = 0.01)

 

위의 C 값이 클수록 Hard Margin에 가깝고, 작을수록 Soft Margin에 가깝다. 기본 값은 1이다. C의 값은 데이터에 따라 다르기 때문에 최적의 C 값을 찾는 과정이 필요하다.

 

커널 (Kernel)


위의 예시들에서는 모두 선형으로 Dicison Boundary를 그을 수 있는 형태였으나 만약 아래와 같은 선형으로 분리할 수 없는 경우에는 어떨까?

이러한 경우 다항식(Polynomial) 커널을 사용하여 해결할 수 있으며, 이는 2차원의 점을 3차원으로 계산함으로써 가능하다.  계산은 다음과 같은 식에 따라 3차원으로 표시한다.

 

$(x,y) → (\sqrt 2xy, x^2, y^2)$

 

예컨데 [1,2] 점이 있다고 할 경우 다음과 같이 3차원으로 계산한다.

 

$(1, 2) → (2\sqrt 2, 1, 4)$

 

이후 다항식 커널로 계산한 데이터 포인트들을 3차원으로 시각화하면 다음과 같은 모양이 나타난다.

방사 기저 함수


방사 기저 함수(RBF: Radical Bias Function)이란 RBF 커널 또는 가우시안 커널이라 부르기도 하며, 이 함수가 앞서 언급한 3차원을 넘는(feature가 3개가 넘는) 데이터에 대해 분류를 하기 위해 사용된다. 

 

방사 기저 함수를 사용하기 위해서는 scikit-learn에서 다음과 같이 사용할 수 있으며 이는 kernel로 사용할 linear, poly, sigmod 등을 입력하지 않을 경우 디폴트 값으로 rbf가 지정된다.

 

from sklearn.svm import SVC
classifier = SVC(kernel='rbf')

 

이러한 방사 기저 함수에는 gamma라고 하는 파라미터가 있어 Dicison Boundary를 얼마나 유연하게 그을 것인지에 대해 설정하는 것으로 파라미터 C와 유사하게 볼 수 있다.

 

classifier = SVC(kernel = "rbf", C = 2, gamma = 0.5)

 

Reference


[1] http://hleecaster.com/ml-svm-concept/

[2] https://ratsgo.github.io/machine%20learning/2017/05/23/SVM/

[3] http://jaejunyoo.blogspot.com/2018/01/support-vector-machine-1.html

 

 

최적화 문제

최적화 문제(Optimization Probelm)란 어떤 목적 함수(Objective Function)의 결과 값을 최적화(최대화 또는 최소화)시키는 파라미터(변수)의 조합을 찾는 문제를 의미한다.

 

최적화 문제는 보통 영상 처리와 같은 Computer Vision 분야에 있어 마주하는 많은 문제들이 최적화 문제로 귀결되는 경우가 많다.

 

목적 함수

목적 함수의 최적화 문제는 크게 4가지로 이루어지며 다음과 같다.

 

일변수 함수의 최적화 문제

  • 목적 함수가 $f(x) = 5x + 21$과 같이 하나의 파라미터(변수)로 구성되어 있는 경우.

다변수 함수 최적화 문제

  • 목적 함수가 $f(x,y) = 2x - 4xy + 6$과 같이 여러 개의 파라미터(변수)로 구성되어 있는 경우.

선형 최적화 문제

  • 목적 함수가 $f(x_1, x_2, ..., x_m) = b + a_1 x_1 + a_2 x_2 + ... + a_m x_m$과 같이 모든 파라미터(변수)에 대해 일차 이하의 다항식으로 구성되어 있는 경우.

비선형 최적화 문제

  • 목적 함수가 $f(x,y) = y cosx + x$ 또는 $f(x,y) = x^2 + y$ 등과 같이 구성되어 있는 경우.

 

그리고 목적 함수 외에 파라미터가 만족해야할 별도의 조건이 있는 경우 Constrained Optimization 문제, 별도의 제약조건이 없는 경우를 Unconstrained Optimization 문제라고 한다.

 

최적화 원리

Cost Function을 3차원으로 나타냄 (세타0 = W, 세타1 = b)

 

최적화 문제의 본질은 파라미터를 어느 방향으로 얼만큼 움직여서 함수 값을 최적화 시킬 수 있을 것인지에 대한 것이다. 조금씩 조금씩 파라미터의 값과 위치를 변경해가며 더 이상 변경할 수 없는 지점에 도달할 수 있는 파라미터를 찾는 것이며 더 이상 최적화 시킬 수 없는 지점을 Local minima라고 한다.

 

이러한 최적화를 위해 사용하는 최적화 기법들은 Gradient Decent, Levenberg-Marquardt 방법, 뉴턴 방법 등이 있지만 이러한 기법들의 차이는 결국 이동할 방향과 이동할 크기를 어떤 방식으로 결정하느냐에 대한 차이이다.

 

이러한 이동할 방향과 크기를 결정하기 위해 기본적으로 사용되는 수학적 원리는 일차미분(기울기)과 이차미분(곡률)의 개념이다.

 

 

일차 미분과 이차 미분

  • 일차 미분

 

일차 미분에 사용되는 식은 다음과 같다.

$x_{k+1} = x_k - \lambda f'(x_k)$

 

$\lambda$의 경우 한번에 얼마나 이동할지 조절하는 step size 파라미터로서 일단은 고정된 상수($\lambda > 0$)로 가정, 아래의 그래프의 함수가 $f(x) = x^4$라 가정, step size 파라미터를 0.01로 설정하면 다음과 같다.

 

위의 그래프에서 알 수 있는 부분은 일차 미분의 단점으로 극소점 근처에서는 수렴 속도가 현저히 떨어진다는 점이며 그 이유는 극소점에 다가갈수록 $f'(x)$ 값이 0에 가까워져 step size 또한 함께 줄어들기 때문이다.

 

일차 미분의 이러한 단점을 해결하기 위해서는 step size를 조절하는 것으로 어느 정도 해결할 수 있다.

만약 step size를 0.03(기존의 3배)과 0.13(기존의 13배)와 같이 주게 되면 아래와 같아 진다.

step size를 키우면 위의 왼쪽 그림과 같이 수렴 속도가 증가하긴하나 극소점 근처에서 그 차이가 크지 않다는 점이고, 또한 위의 우측 그림에서 볼 수 있다시피 수렴 속도를 많이 키우게 되면 발산해버리는 문제가 발생하게 된다. 따라서 목적 함수에 마다 값을 최적화 시킬 수 있는 step size 파라미터가 달라질 수 있다. 

 

이러한 일차 미분의 특성을 이용하여 최적화 문제를 해결하는 방법을 Gradient Decent라 한다.

 

 

  • 이차 미분

 

위의 일차 미분을 이용한 최적화 기법의 문제를 해결하기 위해서는 일차 미분과 함께 이차 미분을 사용하는 것이다.

 

$x_{k+1} = {x_k - f'(x_k) \over f''(x_k)}$

 

앞서 $f(x) = x^4$ 예시에 위의 식을 적용하면, 200번의 반복을 진행한 일차 미분의 결과와 달리, 20번의 반복(iteration)만으로 다음과 같은 수렴 결과를 확인할 수 있다.

 

일차 미분보다 더 빠른 속도로 0에 수렴할 수 있는 것을 확인할 수 있고, 일차 미분과 달리 $f''(x)$를 이용하여 step size를 조절하기 때문에 일차 미분에서 사용된 $\lambda$ 파라미터 또한 필요로 하지 않는다.

 

하지만 이러한 이차미분에도 단점이 존재하는데, 이는 변곡점에 있어서 불안정한 형태를 띤다는 것이다. 가령 이차 미분 값이 0이 되면 식이 정의가 되지 않는 문제점이 생길 수 있고, 또한 변곡점 근처에서는 이차 미분 값이 0에 가까운 값을 가지기 때문에 step size가 커져서 엉뚱한 곳으로 발산해버릴 수 있다는 점이다.

 

더불어 이차미분은 이동할 방향을 정할 때 극대와 극소를 구분하지 않는다는 점도 있다. 예컨데 다음과 같다.

가령 $f(x) = x^3 -2x + 1$에서 $x_0 = 0.5$라 할경우 이차미분에서는 극대점을 향해 수렴하는 반면, 일차미분에서는 극소점을 향해 수렴하게 된다.

 

이를 정리하자면 결국 일차미분에서는 항상 옳은 방향을 향하지만 step size를 설정하는데 있어 어려움이 있고, 이차미분을 이용한 방법으로는 보다 빠르게 해를 도출할 수 있으나 변곡점(f''=0) 근처에서 문제의 소지가 있으며 극대, 극소를 구분하지 못한다는 단점이 있다. 

 

그동안 연구된 다양한 최적화 기법은 이러한 일차미분, 이차미분의 단점을 극복하기 위한 여러 노력의 결과로 볼수 있다.

 

 

일차 미분의 단점을 극복 하기 위해서는 Line Search를 사용하며, 이차미분의 단점을 극복하기 위해서는 Trust Region을 사용한다.

 

Line Search에도 여러 종류가 있지만 일반적으로 아래와 같은 방법이 있다.

- backtracking line search

- golden section search

 

 


 

Trust Region 방법은 근사 함수에 대한 신뢰 영역을 정의한 후 이동할 목적지에 대한 탐색 범위를 해당 영역 내부로만 제한하는 방법을 의미하며 아래와 같다.

 

 

 

Reference

[1] https://darkpgmr.tistory.com/149

 

 

 

 

 

 

1. 데이터 이해(탐색적 데이터 분석 EDA)

  • 데이터를 다운로드 받고, 직접 데이터 탐색
  • 데이터에 대한 기초 통계를 뽑아보고, 막대그래프와 같은 단일 변수 시각화, 산점도와 같은 변수 간 관계를 시각화

 

 

2. 평가 척도 이해

  • 경진대회의 평가 척도 확인(= 문제 출제 의도 확인)
  • 어떤 예측값이 페널티를 크게 받고, 어떤 예측값이 페널티를 덜 받는지 이해

 

 

3. 교차 검증 기법 선정

  • 경진대회서 안정적인 성적을 위해선 신뢰할 수 있는 교차 검증 기법 구축이 중요. 주어진 데이터와 문제에 맞는 교차 검증 기법이 무엇인가 고민
  • 훈련/검증 데이터 분리 비율은 데이터가 매우 클 경우 5:5, 데이터가 적을 경우 9:1임 (일반적으로 5:5 ~ 9:1)
  • 데이터 분리에는 재현성을 위해 random_seed(random_state) 값을 지정.
  • 데이터 분리에는 임의 분리, 계층별 분리가 존재함(정답 레이블 비율 유지 여부 차이)
  • 시계열 데이터일 경우 항상 훈련 데이터를 검증 데이터보다 과거로 설정

 

 

4. 피처 엔지니어링

  • 변수값 스케일링, 이상값 제거, 결측값 대체, 범주형 데이터 변환, 변수 선정, 파생 변수 생성 등 주어진 데이터를 머신러닝 모델이 학습하기 쉽게 만듦
    • 피처 엔지니어링은 Tabular 데이터 기반 경진대회의 랭킹을 가르는 가장 중요한 요인이며, 딥러닝 기반 경진대회에서는 모델 엔지니이어링이 핵심. (Tabluar Data는 테이블 기반의 데이터를 의미)

 

 

5. 모델 튜닝

  • 머신러닝 모델의 최적 파라미터를 찾는다. 신뢰할 수 있는 교차 검증 기법이 구축되면, 교차 검증 점수가 좋은 파라미터가 최적의 파라미터이다.
  • 중간 결과를 항상 저장해야 함

 

 

6. 앙상블

  • 서로 다른 유형의 모델을 앙상블 하는 것이 가장 좋은 앙상블 효과를 보임
  • 다수 계층의 모델을 학습하는 스태킹 기법도 캐글 경진대회에서 자주 사용되는 앙상블 기법임

 

Reference


[1] http://www.yes24.com/Product/Goods/63830327

 

 

분류 내용
피처드 (Featured) 외부 기업과 캐글이 연계해서 진행되는 상금과 캐글 포인트가 할당되는 일반적인 경진대회
입문자용 (Getting Started) 머신러닝 입문자를 위한 예제 기반 학습용 경진대회. 상금과 캐글 포인트는 할당되지 않는다.
연구 (Research) 연구 목적으로 진행되는 경진대회. 피처드 대비 적은 양의 상금이 할당된다.
놀이터 (Playground) 캐글이 직접 주최하는 경진대회. 상금이 할당되는 경우도 있다.
채용 (Recruitment) 채용을 목적으로 진행되는 경진대회. 상금 대시 채용 면접권을 얻을 수 있으며, 캐글 포인트도 할당된다.

 

캐글의 경우 수 많은 온라인 머신러닝 경진대회 플랫폼 중 하나이며, 2017년 3월 구글에 인수되었다.

 

현재 가장 영향력 있는 경진대회 플랫폼으로 거듭났지만 DrivenData, CrowdAnalytics, CodaLab, KDD 등 다양한 경진대회 플랫폼도 존재한다.

 

국내 플랫폼은 존재하지 않으나 한국정보화진흥원과 한국빅데이터협회가 매년 주최하는 빅콘테스트가 있다.

 

Reference


[1] http://www.yes24.com/Product/Goods/63830327

 

 

딥러닝 라이브러리 목록


이브러리

제작자 소스코드 인터페이스
토치 Ronan Collobert, Koray Kavukcuoglu, Clement Farabet C, 루아 루아, 루아JIT, C, C++
카페 Berkeley Vision and Learning Center C++ 파이썬, 매트랩
테아노 University of Montreal 파이썬 파이썬
카페2 Facebook C++, 파이썬 파이썬, 매트랩
케라스 Francois Chollet (구글 소속) 파이썬 파이썬, R
CNTK Microsoft Research C++ 파이썬, C++
MXNet Apache Software Foundation C++ C++, 파이썬, 줄리아, 매트랩, 자바스크립트, Go, R, 스칼라, 펄
파이토치 Facebook Artificial Intelligence Research 파이썬, C, CUDA 파이썬
텐서플로 Google Brain C++, 파이썬 파이썬, C/C++, Java, Go, R
패들패들 바이두 C++, Go C/C++, 파이썬

대표적인 1세대, 2세대 딥러닝 라이브러리 목록

 

이외에도 아래에 다양한 딥러닝 라이브러리가 존재

https://en.wikipedia.org/wiki/Comparison_of_deep-learning_software

 

Reference


[1] http://www.yes24.com/Product/Goods/63830327

차원 축소란?

차원축소는 매우 많은 피처로 구성된 다차원 데이터 세트의 차원을 축소해 새로운 차원의 데이터 세트를 생성하는 것이다. 일반적으로 차원이 증가할수록 데이터 포인트 간의 거리가 기하급수적으로 멀어지게 되고, 희소(sparse)한 구조를 가지게 된다. 수백 개 이상의 피처로 구성된 데이터 세트의 경우 상대적으로 적은 차원에서 학습된 모델보다 예측 신뢰도가 떨어진다. 또한 피처가 많을 경우 개별 피처간에 상관관계가 높을 가능성이 크다. 선형 회귀와 같은 선형모델에서는 입력 변수 간의 상관관계가 높을 경우 이로 인한 다중 공선성 문제로 모델의 예측 성능이 저하된다.

 

다차원의 피처를 차원 축소해 피처 수를 줄이면 더 직관적으로 데이터를 해석할 수 있다. 가령 수십 개 이상의 피처가 있는 데이터의 경우 이를 시각적으로 표현해 데이터의 특성을 파악하기는 불가능하다. 이 경우 3차원 이하의 차원 축소를 통해서 시각적으로 데이터를 압축해서 표현할 수 있다. 또한 차원 축소를 할 경우 학습 데이터의 크기가 줄어들어서 학습에 필요한 처리 능력도 줄일 수 있다.

 

일반적으로 차원 축소는 피처 선택(feature selection)과 피처 추출(feature extraction)로 나눌 수 있다. 피처 선택, 즉 특성 선택은 말 그대로 특정 피처에 종속성이 강한 불필요한 피처는 아예 제거하고, 데이터의 특징을 잘 나타내는 주요 피처만 선택하는 것이다. 피처 추출은 기존 피처를 저차원의 중요 피처로 압축해서 추출하는 것이다. 이렇게 새롭게 추출된 중요 특성은 기존의 피처가 압축된 것이므로 기존의 피처와는 완전히 다른 값이 된다.

 

피처 추출은 기존 피처를 단순 압축이 아닌, 피처를 함축적으로 더 잘 설명할 수 있는 또 다른 공간으로 매핑해 추출하는 것이다. 가령 학생을 평가하는 다양한 요소로서 모의고사 성적, 종합 내신성적, 수능성적, 봉사활동, 대외활동, 학교 내외 수상경력 등과 관련된 여러 가지 피처로 돼 있는 데이터 세트라면 이를 학업 성취도, 커뮤니케이션 능력, 문제 해결력과 같은 더 함축적인 요약 특성으로 추출할 수 있다. 이러한 함축적인 특성 추출은 기존 피처가 전혀 인지하기 어려웠던 잠재적인 요소(Learning Factor)를 추출하는 것을 의미한다. (위의 학생 평가 요소는 함축적 의미를 인지하기 어려운 것은 아니나, 함축성의 예시를 든 것이다)

 

차원 축소는 단순히 데이터의 압축을 의미하는 것이 아니다. 더 중요한 의미는 차원 축소를 통해 좀 더 데이터를 잘 설명할 수 있는 잠재적인 요소를 추출하는 데에 있다. PCA, SVD, NMF는 이처럼 잠재적인 요소를 찾는 대표적인 차원 축소 알고리즘이다. 매우 많은 차원을 가지고 있는 이미지나 텍스트에서 차원 축소를 통해 잠재적인 의미를 찾아 주는 데 이 알고리즘이 잘 활용된다.

 

차원 축소 알고리즘은 매우 많은 픽셀로 이뤄진 이미지 데이터에서 잠재된 특성을 피처로 도출해 함축적 형태의 이미지 변환과 압축을 수행할 수 있다. 이렇게 변환된 이미지는 원본 이미지보다 훨씬 적은 차원이기 때문에 이미지 분류 등의 분류 수행 시에 과적합 영향력이 작아져서 오히려 원본 데이터로 예측하는 것보다 예측 성능을 더 끌어 올릴 수 있다. 이미지 자체가 가지고 있는 차원의 수가 너무 크기 때문에 비슷한 이미지라도 적은 픽셀의 차이가 잘못된 예측으로 이어질 수 있기 때문이다. 이 경우 함축적으로 차원을 축소하는 것이 예측 성능이 훨씬 도움이 된다.

 

차원 축소 알고리즘이 자주 사용되는 또 다른 영역은 텍스트 문서의 숨겨진 의미를 추출하는 것이다. 문서는 많은 단어로 구성돼 있다. 일반적으로 사람의 경우 문서를 읽으면서 이 문서가 어떤 의미나 의도를 가지고 작성됐는지 쉽게 인지할 수 있다. 차원 축소 알고리즘은 문서 내 단어들의 구성에서 숨겨져 있는 시맨틱(Semantic) 의미는 토픽(Topic)을 잠재 요소로 간주하고 이를 찾아낼 수 있다. SVD와 NMF는 이러한 시맨틱 토픽(Semantic Topic) 모델링을 위한 기반 알고리즘으로 사용된다.

 

PCA

PCA (Principal Component Analysis)는 가장 대표적인 차원 축소 기법이다. PCA는 여러 변수 간에 존재하는 상관관계를 이용해 이를 대표하는 주성분(Principal Component)을 추출해 차원을 축소하는 기법이다. PCA로 차원을 축소할 때는 기존 데이터의 정보 유실이 최소화되는 것이 당연하다. 이를 위해 PCA는 가장 높은 분산을 가지는 데이터의 축을 찾아 이 축으로 차원을 축소하는데, 이것이 PCA의 주성분이 된다(즉, 분산이 데이터의 특성을 가장 잘 나타내는 것으로 간주한다) 키와 몸무게 2개의 피처를 가지고 있는 데이터가 세트가 있다고 가정하면 아래와 같은 방식으로 축소를 진행한다.

 

위와 같이 키와 몸무게라는 피처가 2개 있을 때 1개의 주성분을 가진 데이터 세트로 차원 축소를 한다. 데이터 변동성이 가장 큰 방향으로 축을 생성하고, 새롭게 생성된 축으로 데이터를 투영하는 방식이다. PCA는 제일 먼저 가장 큰 변동성(Variacne)을 기반으로 첫 번째 벡터 축을 생성하고, 두 번째 축은 이 벡터 축에 직각이 되는 벡터(직교 벡터)를 축으로 한다. 세 번째 축은 다시 두 번째 축과 직각이 되는 벡터를 설정하는 방식으로 축을 생성한다. 이렇게 생성된 벡터 축에 원본 데이터를 투영하면 벡터 축의 개수만큼의 차원으로 원본 데이터가 차원 축소된다. (긴 벡터가 첫 번째  PCA 축, 짧은 벡터가 두번째 PCA 축)

 

PCA, 즉 주성분 분석은 이처럼 원본 데이터에 피처 개수에 비해 매우 작은 주성분으로 원본 데이터의 총 변동성을 대부분 설명할 수 있는 분석법이다.

 

PCA를 선형대수 관점에서 해석해 보면, 입력 데이터의 공분산 행렬(Covariance Matrix)을 고유값 분해하고, 이렇게 구한 고유벡터에 입력 데이터를 선형 변환하는 것이다. 이 고유벡터가 PCA의 주성분 벡터로서 입력 데이터의 분산이 큰 방향을 나타낸다. 고유값(eigenvalue)은 바로 이 고유벡터의 크기를 나타내며, 동시에 입력 데이터의 분산을 나타낸다. 

 

일반적으로 선형 변환은 특정 벡터에 행렬 A를 곱해 새로운 벡터로 변환하는 것을 의미한다. 이를 특정 벡터를 하나의 공간에서 다른 공간으로 투영하는 개념으로도 볼 수 있고, 이 경우 이 행렬을 바로 공간으로 가정하는 것이다.

 

보통 분산은 한 개의 특정한 변수의 데이터 변동을 의미하나, 공분산은 두 변수 간의 변동을 의미한다. 즉, 사람 키 변수를 X, 몸무게 변수를 Y라고 하면 공분산 Cov(X, Y) > 0은 X(키)가 증가할 때 Y(몸무게)도 증가한다는 의미다. 공분산 행렬은 여러 변수와 관련된 공분산을 포함하는 정방형 행렬이다.

 

  X Y Z
X 3.0 -0.71 -0.24
Y -0.71 4.5 0.28
Z -0.24 0.28 0.91

위 표에서 보면 공분산 행렬에서 대각선 원소는 각 변수(X, Y, Z)의 분산을 의미하며, 대각선 이외의 원소는 가능한 모든 변수 쌍 간의 공분산을 의미한다. X, Y, Z의 분산은 각각 3.0, 4.5, 0.91이다. X와 Y의 공분산은 -0.71, X와 Z의 공분산은 -0.24, Y와 Z의 공분산은 0.28이다. (덧붙여 공분산이 0이라면 두 변수 간에는 아무런 선형 관계가 없으며 두 변수는 서로 독립적인 관계에 있다. 그러나 두 변수가 독립적이라면 공분산은 0이 되지만, 공분산이 0이라고 해서 항상 독립적이라할 수 없다.)

 

고유벡터는 행렬 A를 곱하더라도 방향이 변하지 않고 그 크기만 변하는 벡터를 지칭한다. 즉, Ax = ax(A는 행렬, x는 고유벡터, a는 스칼라값)이다. 이 고유벡터는 여러 개가 존재하며, 정방 행렬은 최대 그 차원 수만큼의 고유벡터를 가질 수 있다. 예를 들어 2x2 행렬은 두 개의 고유벡터를, 3x3 행렬은 3개의 고유벡터를 가질 수 있다. 이렇게 고유벡터는 행렬이 작용하는 힘의 방향과 관계가 있어서 행렬을 분해하는 데 사용된다.

 

공분산 행렬은 정방행렬(Diagonal Matrix)이며 대칭행렬(Symmetric Matrix)이다. 정방행렬은 열과 행이 같은 행렬을 지칭하는데, 정방행렬 중에서 대각 원소를 중심으로 원소 값이 대칭되는 행렬, 즉 $A^T = A$인 행렬을 대칭행렬이라 부른다. 공분산 행렬은 개별 분산값을 대각 원소로 하는 대칭행렬이다. 이 대칭행렬은 고유값 분해와 관련해 매우 좋은 특성이 있다. 대칭행렬은 항상 고유벡터를 직교행렬(orthogonal matrix)로, 고유값을 정방 행렬로 대각화할 수 있다는 것이다.

 

입력 데이터의 공분산 행렬 C라고 하면 공분산 행렬의 특성으로 인해 다음과 같이 분해할 수 있다.

 

$C = P \sum P^T$

 

이때 $P$는 n x n의 직교행렬이며, $\sum$은 n x n 정방행렬, $P^T$는 행렬 $P$의 전치 행렬이다. 위 식은 고유벡터 행렬과 고유값 행렬로 다음과 같이 대응된다.

 

$C = \begin{bmatrix} e_1 \dots e_n \end{bmatrix} \begin{bmatrix} \lambda_1 & \dots & 0 \\ \dots & \dots & \dots \\ 0 & \dots & \lambda_n \end{bmatrix} \begin{bmatrix} e{_1}^t \\ \dots \\ e{_n}^t \end{bmatrix}$

 

즉, 공분산 C는 고유벡터 직교 행렬 * 고유값 정방 행렬 * 고유벡터 직교 행렬의 전치 행렬로 분해된다. $e_i$는 $i$번째 고유벡터를, $\lambda_i$는 $i$번째 고유벡터의 크기를 의미한다. $e_1$는 가장 분산이 큰 방향을 가진 고유벡터이며, $e_2$는 $e_1$에 수직이면서 다음으로 가장 분산이 큰 방향을 가진 고유벡터이다.

 

선형대수식까지 써가면서 강조하고 싶었던 것은 입력 데이터의 공분산 행렬이 고유벡터와 고유값으로 분해될 수 있으며, 이렇게 분해된 고유벡터를 이용해 입력 데이터를 선형 변환하는 방식이 PCA라는 것이다. 보통 PCA는 다음과 같은 단계로 수행된다.

 

  1. 입력 데이터 세트의 공분산 행렬을 생성
  2. 공분산 행렬의 고유벡터와 고유값을 계산
  3. 고유값이 가장 큰 순으로 K개(PCA 변환 차수만큼)만큼 고유벡터를 추출
  4. 고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 변환

 

Reference

[1] 파이썬 머신러닝 완벽가이드

[2] https://csleoss.etri.re.kr/images/contents/manual_1.0/operator/4.1.1.23.PCA_manual.html

[3] https://ko.wikipedia.org/wiki/주성분_분석

선형 회귀의 경우 회귀 계수의 관계를 모두 선형으로 가정하는 방식이다. 일반적으로 선형 회귀는 회귀 계수를 선형으로 결합하는 회귀 함수를 구해, 여기에 독립변수를 입력해 결과값을 예측하는 것이다. 비선형 회귀 역시 비선형 회귀 함수를 통해 결과값을 예측한다. 다만 비선형 회귀는 회귀 계수의 결합이 비선형일 뿐이다. 머신러닝 기반의 회귀는 회귀 계수를 기반으로 하는 최적 회귀 함수를 도출하는 것이 주요 목표이다.

 

회귀 트리는 회귀 함수를 기반으로 하지 않고 결정 트리와 같이 트리기반으로 한다. 즉, 회귀를 위한 트리를 생성하고 이를 기반으로 회귀 예측을 하는 것이다. 회귀 트리의 경우 분류 트리와 크게 다르지 않다. 다만 리프 노드에서 예측 결정값을 만드는 과정에 차이가 있다. 분류 트리가 특정 클래스 레이블을 결정하는 것과는 달리 회귀 트리는 리프 노드에 속한 데이터 값의 평균값을 구해 회귀 예측값을 계산한다.

 

결정 트리, 랜덤 포레스트, GBM, XGBoost, LightGBM 등의 앞 4장의 분류에서 소개한 모든 트리 기반의 알고리즘은 분류뿐만 아니라 회귀도 가능하다. 트리 생성이 CART 알고리즘에 기반하고 있기 때문이다. CART(Classification And Regression Trees)는 이름에서도 알 수 있듯 분류뿐만 아니라 회귀도 가능하게 해주는 트리 생성 알고리즘이다.

 

사이킷런에서는 결정 트리, 랜덤 포레스트, GBM에서 CART 기반의 회귀 수행을 할 수 있는 Estimator 클래스를 제공한다. 또한 XGBoost, LightGBM도 사이킷런 래퍼 클래스를 통해 이를 제공한다. 다음은 사이킷런의 트리 기반 회귀와 분류의 Estimator 클래스를 표로 나타낸 것이다.

 

알고리즘 회귀 Estimator 클래스 분류 Estimator 클래스
Decision Tree DecisionTreeRegressor DecisionTreeClassifier
Gradient Boosting GradientBoostingRegressor GradientBoostingClassifier
XGBoost XGBRegressor XGBClassifier
LightGBM LGBMRegressor LGBMClassifier

* 사이킷런의 회귀 트리 Regressor의 하이퍼 파라미터는 분류 트리 Classifier의 하이퍼 파라미터와 거의 동일하다

 

Reference


[1] 파이썬 머신러닝 완벽가이드

로지스틱 회귀


로지스틱 회귀는 선형 회귀 방식을 분류에 적용한 알고리즘이다. 즉, 로지스틱 회귀는 분류에 사용된다. 로지스틱 회귀 역시 선형 회귀 계열이다. 회귀가 선형인가 비선형인가는 독립변수가 아닌 가중치 변수가 선형인지 아닌지를 따른다. 로지스틱 회귀가 선형 회귀와 다른 점은 학습을 통해 선형 함수의 회귀 최적선을 찾는 것이 아니라 시그모이드(Sigmoid) 함수 최적선을 찾고 이 시그모이드 함수의 반환 값을 확률로 간주해 확률에 따라 분류를 결정한다는 것이다.

 

<로지스틱 회귀의 시그모이드 함수>

많은 자연, 사회 현상에서 특정 변수의 확률 값은 선형이 아니라 위의 시그모이드 함수와 같이 S자 커브 형태를 가진다. 시그모이드 함수의 정의는 $y = {1 \over 1 + e^-x}$이다. 위의 그림과 식에서 알 수 있듯이 시그모이드 함수는 x 값이 +, -로 아무리 커지거나 작아져도 y 값은 항상 0과 1 사이 값을 반환한다. x 값이 커지면 1에 근사하며 x 값이 작아지면 0에 근사한다. 그리고 x가 0일 때는 0.5이다.

 

주로 부동산 가격과 같은 연속형 값을 구하는 데 회귀를 사용했다. 이번에는 회귀 문제를 약간 비틀어서 분류 문제에 적용하려 한다. 가령 악성 종양을 탐지하기 위해 악성 종양의 크기를 X축, 악성 종양 여부를 Y축에 표시할 때 데이터 분포가 다음과 같이 될 수 있다.

 

선형 회귀를 적용하게 되면 데이터가 모여 있는 곳으로 선형 회귀 선을 그릴 수 있다. 하지만 이 회귀 라인은 0과 1을 제대로 분류하지 못하고 있는 것을 확인할 수 있다. (분류를 못하는 것은 아니지만 정확도가 떨어진다) 하지만 오른쪽 로지스틱 회귀와 같이 S자 커브 형태의 시그모이드 함수를 이용하면 조금 더 정확하게 0과 1에 대해 분류를 할 수 있음을 알 수 있다. 로지스틱 회귀는 이처럼 선형 회귀 방식을 기반으로 하되 시그모이드 함수를 이용해 분류를 수행하는 회귀이다.

 

LogisticRegression in sklearn


선형 회귀 계열의 로지스틱 회귀는 데이터의 정규 분포도에 따라 예측 성능 영향을 받을 수 있으므로 데이터에 먼저 정규 분포 형태의 표준 스케일링을 적용한 뒤에 train_test_split()을 이용하여 데이터 셋을 분리할 수 있다.

 

사이킷런 LogisticRegression 클래스의 주요 하이퍼 파라미터로 penalty와 C가 있다. penalty는 규제의 유형을 설정하며 'l2'로 설정 시 L2 규제를, 'l1'으로 설정 시 L1 규제를 뜻한다. 기본은 'l2'이다. C는 규제 강도를 조절하는 alpha 값의 역수이다. 즉 $C = {1 \over alpha}$다. C 값이 작을 수록 규제 강도가 크다. 

 

Reference


[1] 파이썬 머신러닝 완벽가이드

 

선형 회귀 모델과 같은 선형 모델은 일반적으로 피처와 타겟 간에 선형의 관계가 있다 가정하고, 이러한 최적의 선형함수를 찾아내 결과를 예측한다. 또한 선형 회귀 모델은 피처값과 타겟값의 분포가 정규 분포(즉 평균을 중심으로 종 모양으로 데이터 값이 분포된 형태) 형태를 매우 선호한다. 특히 타겟값의 경우 정규 분포 형태가 아니라 특정값의 분포가 치우친 왜곡된 형태의 분포도일 경우 예측 성능에 부정적인 영향을 미칠 가능성이 높다. 피처값 역시 결정값보다는 덜하지만 왜곡된 분포도로 인해 예측 성능에 부정적인 영향을 미칠 수 있다.

 

따라서 선형 회귀 모델을 적용하기전에 먼저 데이터에 대한 스케일링/정규화 작업을 수행하는 것이 일반적이다. 하지만 이러한 스케일링/정규화 작업을 선행한다고 해서 무조건 예측 성능이 향상되는 것은 아니다. 일반적으로 중요한 피처들이나 타겟값의 분포도가 심하게 왜곡됐을 경우에 이러한 변환 작업을 수행한다. 일반적으로 피처 데이터 셋과 타겟 데이터 셋에 이러한 스케일링/정규화 작업을 수행하는 방법이 조금은 다르다. 사이킷런을 이용한 피처 데이터 셋에 적용하는 변환 작업은 다음과 같은 방법이 있을 수 있다.

 

  1. StandardScaler 클래스를 이용해 평균이 0, 분산이 1인 표준 정규 분포를 가진 데이터 셋으로 변환하거나 MinMaxScaler 클래스를 이용해 최소값이 0이고 최대값이 1인 값으로 정규화를 수행한다.
  2. 스케일링/정규화를 수행한 데이터 셋에 다시 다항 특성을 적용하여 변환하는 방법이다. 보통 1번 방법을 통해 예측 성능에 향상이 없을 경우 이와 같은 방법을 적용한다.
  3. 원래 값에 log 함수를 적용하면 보다 정규 분포에 가까운 형태로 값이 분포된다. 이러한 변환을 로그 변환이라 부른다. 로그 변환은 매우 유용한 변환이며, 실제로 선형 회귀에서는 앞서 소개한 1,2번 방법보다 로그 변환이 훨씬 많이 사용되는 변환 방법이다. 그 이유는 1번 방법의 경우 예측 성능 향상을 크게 기대하기 어려운 경우가 많으며, 2번 방법의 경우 피처의 개수가 매우 많을 경우에는 다항 변환으로 생성되는 피처의 개수가 기하급수로 늘어나서 과적합의 이슈가 발생할 수 있기 때문이다.

타겟값의 경우 일반적으로 로그 변환을 적용한다. 결정값을 정규 분포나 다른 정규값으로 변환하면 변환된 값을 다시 원본 타겟값으로 원복하기 어려울 수 있다. 무엇보다도, 왜곡된 분포도 형태의 타겟값을 로그 변환하여 예측 성능 향상이 된 경우가 많은 사례에서 검증되었기 때문에 타겟값의 경우는 로그 변환을 적용한다.

 

Reference


[1] 파이썬 머신러닝 완벽가이드

 

회귀 모델은 적절히 데이터에 적합하면서도 회귀 계수가 기하급수적으로 커지는 것을 제어할 수 있어야 한다. 이전까지 선형 모델의 비용 함수는 RSS를 최소화하는, 즉 실제값과 예측값의 차이를 최소화하는 것만 고려했다. 단편적으로 고려하다보니 학습 데이터에 지나치게 맞추게 되고, 회귀 게수가 쉽게 커졌다. 이렇게 될 경우 변동성이 오히려 심해져서 테스트 데이터 셋에서는 예측 성능이 저하되기 쉽다. 이를 반영해 비용 함수는 학습 데이터의 잔차 오류 값을 최소로 하는 RSS 최소화 방법과 과적합을 방지하기 위해 회귀 계수 값이 커지지 않도록 하는 방법이 서로 균형을 이뤄야 한다.

 

회귀 계수의 크기를 제어해 과적합을 개선하려면 비용(Cost) 함수의 목표가 다음과 같이 $RSS(W) + alpha * ||W||_2^2$를 최소화하는 것으로 변경될 수 있다.

 

비용 함수 목표 = $Min(RSS(W) + alpha * ||W||_2^2)$

 

alpha는 학습 데이터 적합 정도와 회귀 계수 값을 크기 제어를 수행하는 튜닝 파라미터이다. 위 비용 함수 목표가 해당 식의 값을 최소화하는 W 벡터를 찾는 것일 때 alpha가 0 또는 매우 작은 값이라면 비용 함수 식은 기존과 동일한 $Min(RSS(W) + 0)$이 될 것이다. 반면에 alpha가 무한대 또는 매우 큰 값이라면 비용 함수 식은 $RSS(W)$에 비해 $alpha * ||W||_2^2$ 값이 너무 커지게 되므로 W 값을 0 또는 매우 작게 만들어야 Cost가 최소화되는 비용 함수 목표를 달성할 수 있다. 즉 alpha 값을 크게 하면 비용 함수는 회귀 계수 W의 값을 작게 해 과적합을 개선할 수 있으며 alpha 값을 작게 하면 회귀 계수 W의 값이 커져도 어느 정도 상쇄가 가능하므로 학습 데이터 적합을 더 개선할 수 있다.

 

즉, alpha를 0에서부터 지속적으로 값을 증가시키면 회귀 계수 값의 크기를 감소시킬 수 있다. 이처럼 비용 함수에 alpha 값으로 페널티를 부여해 회귀 계수 값의크기를 감소시켜 과적합을 개선하는 방식을 규제(Regularization)라고 부른다. 규제는 크게 L2 방식과 L1 방식으로 구분된다. L2 규제는 위에서 설명한 바와 같이 $alpha * ||W||_2^2$와 같이 W의 제곱에 대해 패널티를 부여하는 방식을 말한다. L2 규제를 적용한 회귀를 릿지(Ridge) 회귀라 한다. 라쏘(Lasso) 회귀는 L1 규제를 적용한 회귀이다. L1 규제는 $alpha * ||W||_1$와 같이 W의 절대값에 대해 패널티를 부여한다. L1 규제를 적용하면 영향력이 크지 않은 회귀 계수 값을 0으로 변환한다.

 

릿지 회귀 (Ridge Regression)


릿지 회귀의 경우 회귀 계수를 0으로 만들지는 않는다.

 

라쏘 회귀 (Lasso Regression)


회귀 계수가 0인 피처는 회귀 식에서 제외되면서 피처 선택의 효과를 얻을 수 있다.

 

엘라스틱넷 회귀 (ElasticNet Regression)


엘라스틱넷 회귀는 L2 규제와 L1 규제를 결합한 회귀이다. 엘라스틱넷 회귀 비용함수의 목표는 $RSS(W) + alpha2 * ||W||_2^2 + alpha1 * ||W||_1$ 식을 최소화하는 W를 찾는 것이다. 엘라스틱넷은 라쏘 회귀가 서로 상관관계가 높은 피처들의 경우에 이들 중에서 중요 피처만을 선택하고 다른 피처들은 모두 회귀 계수를 0으로 만드는 성향이 강하다. 특히 이러한 특징으로 인해 alpha 값에 따라 회귀 계수의 값이 급격히 변동할 수도 있는데, 엘라스틱넷 회귀는 이를 완화하기 위해  L2 규제를 라쏘 회귀에 추가한 것이다. 반대로 엘라스틱넷 회귀의 단점은 L1과 L2 규제가 결합된 규제로 인해 수행시간이 상대적으로 오래 걸린다는 것이다.

 

엘라스틱넷 회귀는 사이킷런 ElasticNet 클래스를 통해 구현할 수 있으며 해당 클래스의 주요 파라미터인 alpha와 l1_ratio중 alpha는 Ridge와 Lasso 클래스에서 사용되는 alpha 값과는 다르다. 엘라스틱넷 규제는 a * L1 + b * L2로 정의될 수 있으며, 이 때 a는 L1 규제의 alpha값, b는 L2 규제의 alpha 값이다. 따라서 ElasticNet 클래스의 alpha 파라미터 값은 a + b 값이다. ElasticNet 클래스의 l1_ratio 파라미터 값은 a / (a + b)이다. l1_ratio가 0이면 a가 0이므로 L2 규제와 동일하고, l1_ratio가 1이면 b가 0이므로 L1 규제와 동일하다.

 

정리


규제 선형 회귀의 가장 대표적인 기법인 릿지, 라쏘, 엘라스틱넷 회귀가 있고, 이들 중 어떤 것이 가장 좋은지는 상황에 따라 다르다. 각각의 알고리즘에서 하이퍼 파라미터를 변경해 가면서 최적의 예측 성능을 찾아내야 한다. 하지만 선형 회귀의 경우 최적의 하이퍼 파라미터를 찾아내는 것 못지않게 먼저 데이터 분포도의 정규화와 인코딩 방법이 매우 중요하다.

 

Reference


[1] 파이썬 머신러닝 완벽가이드

+ Recent posts