개념을 빠르게 훑어보기 위한 글 2번째...
역시나 뒤죽박죽ㅎㅎ
차원 축소
차원 축소는 고차원 데이터를 저차원 데이터로 변환하는 과정을 말한다. 차원 축소에는 2가지 기법이 존재한다.
- feature selection은 주요 특성만 골라내는 것으로 불필요한 특성은 제거하고 데이터의 특징을 잘 나타내는 특성만 선택한다.
- feature extraction은 특성을 조합해서 데이터를 잘 표현할 수 있는 중요한 성분들을 가진 새로운 특성을 추출하는 것이다. 하지만, 기존 특성 값들과 완전히 다른 값을 갖게 되어 추출된 변수의 해석이 어렵다. PCA, t-SNE 등이 여기에 속한다.
차원의 저주 (Curse of Dimensionality)
차원의 저주는 차원이 증가할 수록 다양한 문제가 발생한다는 것인데, 차원이 증가하면 데이터를 표현해야하는 공간이 커지고 그 공간 안에 존재하는 모든 경우를 다 채우려면 더 많은 데이터가 필요해진다. 따라서, 차원이 증가함에 따라 모델을 제대로 학습하기 위해서는 필요한 데이터가 매우 늘어나는 현상을 의미한다고 볼 수 있다. (관측지 수보다 변수의 개수 (차원) 가 더 많을 때 발생한다고 한다.)
이를 해결하기 위해서는 많은 데이터를 확보하거나 PCA 같은 차원 축소 알고리즘을 통해 차원을 줄여 해결할 수 있다.
주성분분석 (Principal Component Analysis)
PCA라고 부르는 주성분분석은 원래 데이터의 분포를 최대한 보존하면서 고차원 공간의 데이터들을 저차원 공간으로 변환해준다. PCA는 공분산 행렬을 기반으로 고유벡터를 생성하고, 구한 고유벡터를 이용해서 입력 데이터를 projection 시켜 차원을 축소하는 방법이다. 고윳값이 큰 순서대로 고유 벡터를 정렬하면, 중요한 순서대로 주성분을 구하는 것이 되므로 고윳값이 큰 고유 벡터를 순서대로 선택해준다. (고윳값이 큰 순서대로 주성분 벡터를 추출하기 때문에 노이즈 제거 기법이라고도 불린다.)
주성분분석을 통해 선택된 주성분들은 데이터의 변동을 잘 설명해주는 성분들로, 고유벡터가 주성분이 되는데 이는 데이터의 분산이 최대가 되는 방향을 의미한다.
* 공분산 행렬은 데이터 구조를 설명해주며 특징 쌍들의 변동이 얼마나 닮았는가 (혹은 얼마나 같이 변하는가)를 행렬에 나타낸다. 고유벡터는 행렬 A가 존재할 때, 벡터 x에 A를 적용해서 projection해도 방향이 바뀌지 않는 벡터 ($Av = \lambda v$ 일 때, $v$는 고윳값 $\lambda$에 해당하는 고유벡터)로 더 자세한 설명은 이 글에서 확인할 수 있다.
평가 지표 (Metric)
평가 지표하면 가장 먼저 정확도(accuracy)를 떠올리지만, 정확도뿐만 아니라 precision, recall 등 다양한 평가 지표가 있다.
- precision (정밀도) 은 positive라고 예측한 값들 중 실제 positive를
- recall (재현율) 은 실제 positive 중 positive라고 예측한 것을 의미한다.
따라서 precision이 낮다는 것은 1종 오류가 높다는 것이고, recall이 낮다는 것은 2종 오류가 높다는 것이다. (1종 오류와 2종 오류가 뭔지 모르겠다면? 이 글에서 확인할 수 있다.) precision과 recall이 떠오르면 또 연달아서 떠오르는 것이 바로 f1 score. f1 score 수식은 아래와 같다.
$$F1 score = 2 * \frac{Precision *Recall}{Precision + Recall}$$
recall, precision, f1 score까지 봤으면, roc 커브도 한 번 보자! roc 커브는 아래 그림과 같으며 이상적인 모델일 수록 좌상단으로 커브가 휘게 된다. (이진 분류 모델의 성능을 나타낼 때 사용한다.)
어떻게 보면 위에서 언급한 metric들은 모두 분류 task를 위한 평가 지표라고 볼 수 있다. 그렇다면 회귀를 위한 metric에는 무엇이 있을까?!
- MAE (Mean Absoulte Error): 예측값과 정답값 사이의 (절댓값) 차이의 평균을 말한다. $$\frac{1}{N} \sum_{i=1}^{N}|y_i - y^{\prime}_i|$$
- MSE (Mean Squared Error): 예측값과 정답값 사이의 차이의 제곱 평균을 말하며 이상치에 민감하다. $$\frac{1}{N} \sum_{i=1}^{N}(y_i - y^{\prime}_i)^2$$
- RMSE (Root Mean Squared Error): MSE에 루트를 씌운 값
- RMSLE (Root Mean Squared Logarithmic Error): RMSE와 비슷하지만 예측값과 정답값에 각각 로그를 씌워 계산함. $$\sqrt{\frac{1}{N} \sum_{i=1}^N(log(y_i + 1) - log(y^{\prime}_i + 1))^2}$$
- 그 외에도 많지만...일단 여기까지만!
최적화 기법
최적화 기법에는 크게 2가지 종류가 있는데, first-order algorithm에 해당하는 gradient descent 방식과 second-order algorithm에 해당하는 Newton's method가 있다. first-order algorithm은 gradient (1차 미분)만 사용하고, second-order algorithm은 Hessian matrix (2차 미분) 까지도 사용한다. 즉 기울기만 사용하는지, 기울기와 오목성까지 사용하느냐이다.
Newton's Method
위의 그림에 나와 있듯이, objective function f(x)가 존재한다면 이를 Taylor series를 통해서 second-order approximation을 하고, 그 때의 최소값을 가지는 위치로 이동하게 된다.
이 방식의 장점은 하이퍼파라미터가 따로 필요 없다는 점이다. 하지만, second-order approximation을 구해야하기 때문에 계산량이 많다. 하지만, 만약 objective function이 볼록하다면, 한 번의 update 만에 최적값을 찾을 수 있다!
Gradient Descent
경사하강법이라고 불리는 gradient descent는 기본적으로 objective function f(x)의 gradient를 계산하고, 기울기의 반대 방향으로 조금씩 이동하면서 x 값을 업데이트 한다. Newton's method와는 다르게 learning rate / step size 같은 하이퍼파라미터가 필요하다. 이 방법은 global optima를 보장하지는 않는다. saddle point에 도착할 수도!
optimal point가 아닌데도 graident가 0인 위치에 도달하면 더 이상 학습이 진행되지 않는다. 또한 Poor conditioning of H와 같은 문제가 존재하는데, 이는 objective function의 볼록/오목성 때문에 gradient가 매우 진동하는 현상을 말한다. (아래 사진을 보면 바로 이해할 수 있을 것이다.)
gradient descent는 sgd 시리즈(sgd, minibatch-sgd , batch gradient descent 등) 뿐만 아니라 다양한 변형이 있지만 이는 나중에 글을 업로드해야겠다! (양이 너무 많다!)
정규화 (Regularization)
정규화는 모델의 과적합(overfitting)을 방지해주는 역할을 한다. 가장 대표적인 방식으로는 L1 regularization (lasso)와 L2 regularization (ridge)가 있다.
L1 Regularization (Lasso)
$$\sum_q |w_q|$$
L1 정규화는 convex하지만, 모든 부분에서 미분 가능한 것이 아니기 때문에 gradient descent 방식과 함께 사용할 때 주의해야한다. 또한, L1 loss의 특성상 L1 정규화는 특정 $w_q$가 0의 값을 갖게 되기 때문에 feature selection의 역할도 함께한다고 볼 수 있다. 우측 그림은, L1 loss의 loss surface를 그린 모습이다.
L2 Regularization (Ridge)
$$\sum_q w_q^2$$
L2 정규화는 convex하고, 미분 가능하다. L2 loss의 특성상 L2 정규화에서는 weight가 0의 값을 갖지는 않는다. 또한 L2 정규화는 weight decay 효과도 있는데 이는, gradient descent 방식을 생각하면 된다. 원래 loss와 더불어 L2 정규화를 추가한 후, gradient를 구해보면 다음과 같다.
$1-2\epsilon\frac{\lambda}{N}$이 1보다 작기 때문에 decay 효과가 있다고 볼 수 있다.
선형 회귀 vs. 로지스틱 회귀
나이와 키가 선형관계를 갖고 있다고 가정한다면, 나이와 키의 데이터는 좌측 그림처럼 찍힐 것이고 선형회귀를 통해 나이와 키의 상관관계를 잘 표현하는 추세선을 추정하고, 특정 나이일 때 키가 어느정도 될 것이라는 것을 알 수 있다. 반면에 나이와 암의 발병률을 알고 싶다면, 나이와 암의 데이터는 우측 그림과 같이 찍힐 것이고 선형회귀로는 표현이 불가능하다.
선형 회귀 (Linear Regression)
선형 회귀는 종속 변수 y와 한 개 이상의 독립 변수 X와의 선형 상관 관계를 모델링하는 기법이다. 이를 위해 가장 흔히 사용되는 기법은 최소제곱법 혹은 최대자승법이라고 불리는 Ordinary Least Square (OLS)이다.
OLS는 데이터들의 경향을 알기 위해서 최적의 추세선을 그리는 방법 중 하나로, 동일한 x값에 대해서 추세선의 y값과 실제 y값의 차이를 residual 이라고 보며, 이 residual의 제곱의 합을 최소화 하는 추세선을 찾는 방식이다. 따라서 아래 수식을 최소화 하는 추세선을 찾는 것이다.
$$\sum_q (y_i - \hat{y_i})^2$$
로지스틱 회귀 (Logistic Regression)
독립 변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는데 사용되는 통계 기법이다. 위에서도 언급했듯이 y값이 실수가 아닌 범주형 특히 여기에서는 2가지 범주 밖에 없을 때는 선형 회귀를 사용하기 어렵다. 실질적으로 이름에는 회귀 regression이 들어가 있지만, 실질적으로는 classification이라고 볼 수도 있다.
로지스틱 회귀에서 가장 중요한 것 중 하나가 sigmoid 함수라고 생각한다. sigmoid 함수는 s자 모양으로 생겨서 그런 이름이 붙었다고 한다. 그 중 가장 많이 사용되는 함수는 logistic 함수로 정의는 아래와 같다.
$$sigmoid(x) = \frac{1}{1+e^{-x}}$$
시그모이드 함수는 [-∞, ∞]인 인풋 x를 [0, 1] 범위로 매핑시키는 함수 이다. 로지스틱 회귀는 sigmoid 함수를 이용해서 모든 값은 0에서 1사이 값으로 매핑하며, 이 sigmoid 값을 이벤트가 발생할 확률 (혹은 1번 class에 속할 확률)이라고 바라보며 특정 값(threshold)보다 크면 이벤트가 발생한다(혹은 1번 class에 속한다)고 보고, 반대로 작다면 이벤트가 발생하지 않는다(혹은 0번 class에 속한다)고 보기도 한다.
정보량과 엔트로피
정보량은 "놀람의 정도"를 의미한다. 즉, 당연한 사실이면 가치가 낮을 것이며 당연하지 않은 예측이 어려울 수록 정보의 가치가 높을 것이다. 즉, 발생 확률이 낮을 수록 정보량이 높다고 볼 수 있다. 정보량은 [grey]$-log_2 p(x)$[/grey] 으로 정의된다.
평균적인 정보량은 엔트로피라고 할 수 있다. 엔트로피는 [grey]$-\sum_{i=1}^n p(x_i) log_2 p(x_i)$[/grey]로 계산할 수 있다. 물리학에서 엔트로피는 무질서 혹은 불안정한 정도를 의미하는데 정보학에서의 엔트로피는 평균 정보량, 평균 놀람의 정도를 의미한다. (앞서 언급했듯이 정보량은 예측 불가능한 사건일 수록 높다고 했으므로 불확실하다는 것과 같은 맥락에서 생각해도 된다.)
의사결정트리 (Decision Tree)
의사결정트리는 전체 데이터셋을 부분 데이터셋으로 나누어간다. A를 만족하면 왼쪽으로, 그렇지 않으면 오른쪽으로 이런식으로! 딱 봐도 분류에 사용될 것 같지만 regression에도 사용된다고는 한다. (인터넷에서 대부분의 예제는 분류에 해당함)
의사결정트리는 어떤 기준으로 데이터를 나눌까? 정보 이득이 가장 많은 기준으로 나눈다. 그렇다면 정보 이득은 무엇일까? 정보이득은 이전 엔트로피 값에서 현재 엔트로피 값을 뺀 것으로, 정보 이득이 있다면 엔트로피가 떨어진 것이고 이는 결국 불확실성이 떨어졌다는 의미라고 볼 수 있다. 이 링크에 예시와 함께 더 자세히 설명되어 있으니 한 번 확인해보면 좋을 것 같다.
의사결정트리는 모든 데이터를 나눌 때까지 확장되기 때문에 overfitting 된다. 따라서 pruning 같은 기법을 함께 적용해줘야 한다.
랜덤 포레스트 (Random Forest)
랜덤 포레스트는 DT의 변형 중 하나이다. 가장 간단하게 말하자면 여러 Decision-tree의 결과 값을 종합해서 최종 결정을 내리는 것이다. 하나의 데이터셋을 여러 subset으로 나누고, 각 decision tree를 각 subset에 학습시킨다. 그러면 각 트리는 서로 다른 모델을 만들게 될 것이고, 같은 input (test input)을 주더라도 서로 다른 결정을 내릴 것이다. 이 때, 이 결과들을 다 취합해서 최종 결정을 내리는 것이다. (가장 많은 트리가 내린 결정 등)
앙상블 (Ensemble)
앞서 소개한 랜덤 포레스트 처럼 좋은 성능을 얻기 위해 다수의 학습 알고리즘을 사용하고 그것을 합치는 것을 앙상블 학습이라고 한다. 랜덤 포레스트에 대해 소개하면서, 하나의 데이터셋으로 부터 여러 subset을 만든다고 했다. 이 때, 어떻게 여러 subset을 만드는지는 배깅 (bagging), 부스팅 (boosting), 스태킹 (stacking)이 있다. (랜덤포레스트는 배깅에 해당한다.)
이 링크에 설명이 아주 잘 되어 있으니 그림과 함께 참고하면 좋을 것 같다!
배깅 (Bagging)
배깅은 Bootstrap Aggregation의 약어인데 부트스트랩(bootstrap)은 통계에서 복원 랜덤 샘플링을 통해서 1개의 데이터셋을 여러 데이터셋을 가지고 있는 것과 같은 효과를 내기 위해 사용된다. 이와 같이 배깅은 각 모델을 학습시켜서 결과물을 집계하는 방식이다. 카테고리 데이터는 투표 방식으로, 연속형 데이터는 평균으로 집계한다. 학습데이터가 충분하지 않아도 높은 bias의 underfitting 문제나, 높은 variance로 인한 overfitting 문제를 해결하는데 도움이 된다.
부스팅 (Boosting)
부스팅은 이전 모델이 틀린 데이터의 가중치를 높게 부여하여 (즉, 다음 모델이 학습할 때 해당 데이터가 뽑힐 확률이 커지도록 함) 다음 모델을 학습하는 방식으로, 각 모델의 학습을 병렬적으로 할 수 있는 배깅과 달리 부스팅은 시퀀스하게 학습한다는 특징이 있다. 오답에 집중하기 때문에 정확도가 높지만, 틀렸던 부분을 다시 학습하기 때문에 오버피팅의 가능성이 있고, outlier에 취약하며 속도가 느리다. GBM, XGBoost, AdaBoost, GradientBoost 등이 존재한다고 한다. (얘네는 잘 모른다..ㅎㅎ)
스태킹 (Stacking)
여러 모델이 각각 예측한 결과값을 다시 학습 데이터셋으로 사용하여 모델을 학습하는 과정이다. 즉, 각 모델이 어떠한 예측을 할텐데, 그 예측값이 최종 모델의 x data (input) 가 되는 것이고, y data (정답 label)는 원래 데이터셋의 y data가 되는 것이다. 이는 결국 같은 데이터셋을 통해 예측한 결과를 기반으로 다시 학습하므로 오버피팅의 문제가 있다. 따라서, 스태킹에서는 cross validation 방식을 도입하여 오버피팅을 해결하려 한다.
정규화 vs. 표준화
정규화와 표준화 모두 데이터의 스케일을 조정해서, 데이터 feature 사이의 scale 차이를 줄여주는 역할을 한다. 개인적으로 이 글의 그림자료가 직관적이라 매우 좋았다ㅎㅎ.
정규화 (Normalization)
$$x = \frac{x - x_{min}}{x_{max} - x_{min}}$$
위의 수식은 min-max normalization을 나타낸다. 최솟값은 0, 최댓값은 1로 매핑되고 나머지 값들은 0과 1사이의 값으로 스케일링된다. 모든 feature들의 스케일이 동일하지만, 이상치(outlier)를 잘 처리하지 못 한다.
표준화 (Standardization)
$$x = \frac{x - \mu}{\sigma}$$
위의 수식은 standarization을 나타낸다. 정규분포 처럼 평균을 1, 표준편차를 0으로 만들어주는 역할을 한다. 앞서 소개한 min-max normalization과는 달리 데이터 범위가 제한되지 않는다. 하지만, 정규화에 비해서 이상치를 잘 처리한다.