[Coursera] Supervised Machine Learning: Regression and Classification(2)

홍건하·2025년 4월 27일

저번 포스트에서 우리는 Machine Learning의 근간에 대해서 알아보았다.

이번에는 좀 더 깊게 알아보도록 하자.

Multiple Features

먼저, 우리는 이전에 x의 값을 하나로 생각하고 식을 전개하였는데,

현실에서 feature가 하나일 일은 거의 존재하지 않는다.(Ex. 눈, 코, 입, 귀 등을 살펴봐서 얼굴을 파악할 수 있음)

우리는 이제 하나 이상의 feature을 갖는 데이터에 대해서 생각해보자.

기호 부터 다시 재정립하자면,

  • xjx_j: j번째 feature
  • n: 전체 feature의 개수(전체 데이터의 개수가 아님)
  • x(i)\vec x^{(i)}: i번째 training data의 모든 feature들('->'는 x가 벡터임을 의미)
  • xj(i)\vec x^{(i)}_j: i번째 학습 데이터의 j번째 feature

고로, 만약 feature의 개수가 4개라고 한다면,

  • fw,b(x)=w1x1+w2x2+w3x3+w4x4+bf_{w,b}(x)=w_1x_1+w_2x_2+w_3x_3+w_4x_4+b => 각 feature들에 다른 weight(가중치)값을 곱해줌.
  • fw,b(x)=w1x1+w2x2+...+wnxn+bf_{w,b}(x)=w_1x_1+w_2x_2+...+w_nx_n+b => n개의 feature에 대해서.
  • w=[w1,w2,...,wn]\vec w = [w_1,w_2,...,w_n], b: a number, x=[x1,x2,...,xn]\vec x=[x_1,x_2,...,x_n]

그래서 우리는 저걸 다 풀어쓰지 않고 이걸 벡터의 내적으로 표현할 수 있다.

  • fw,b(x)=wx+bf_{w,b}(\vec x)=\vec w\cdot \vec x +b

우리는 지금 이걸 하나의 training example에 대해서만 생각하여 vector형태로 나오지만, m개의 training example을 생각하면 행렬의 곱으로 나오게된다.

그리고 그걸 Vectorization이라고 한다.

vectorization: 코드상에서 행렬 곱의 구현은 원래 차원에 따라 그만큼에 반복문의 수가 필요하지만, 이걸 행렬의 곱 형태로 한번에 표현하는 것

그럼 이제 이 multiple feature들에 대해서는 gradient descent를 어떻게 하는 지 알아보자.

Gradient Descent for Multiple Regression

  • w=[w1,w2,...,wn]\vec w = [w_1,w_2,...,w_n], b: a number
  • fw,b(x)=wx+bf_{w,b}(\vec x)=\vec w\cdot \vec x +b

위에서 이 두 식을 보고 우리는 이제 손실함수 J를 이런 식으로 표현할 수 있다.

  • J(w1,...,wn,b)J(w_1,...,w_n,b)

그리하여, 이제 n개의 가중치를 모두 업데이트 해야하므로

  • w1=w1α1mi=1m(fw,b(x(i))y(i))x1(i)w_1=w_1-\alpha \frac{1}{m}\sum^m_{i=1}(f_{\vec w, b}(\vec x^{(i)})-y^{(i)})x_1^{(i)}
    .
    .
    .
  • wn=wnα1mi=1m(fw,b(x(i))y(i))xn(i)w_n=w_n-\alpha \frac{1}{m}\sum^m_{i=1}(f_{\vec w, b}(\vec x^{(i)})-y^{(i)})x_n^{(i)}

=> 하지만, 이런 식으로 n개의 연산을 다 하는게 아니라, 행렬 곱으로 n길이의 Vector W를 출력으로 주는데, 각 자리에 맞는 w값이 들어가 있는 vector이다.

Feature scaling

다양한 feature들이 있을 것이다.(ex. 방의 개수, 방의 크기)
하지만 feature들이 다같은 범위의 값을 갖는 건 당연하다.

예를 들어, 방의 크기는 10,000m일 수가 있는데(사실 잘 모름), 방의 개수는 4개인 경우 둘의 값의 차이가 너무 크다.

이런 경우, 학습에 있어 방의 크기가 주는 영향이 상대적으로 너무 작아서 거의 없는 것과 다르지 않을 수 있다.

이런 현상을 방지하기위해 우리는 feature scaling이라는 방법을 사용해주는 것이다.

naive하게 생각하면, feature이 가질 수 있는 최대 값으로 다른 training example의 같은 feature들을 나눠주면 0~1값 사이로 나오게 된다.

Mean Normalization

또한, 많이 사용하는 방법으로는 Mean Normalization이 있다.

  • x1=x1μ1maxminx_1 = \frac{x_1-\mu_1}{max-min}

이렇게 해주면 모든 feature값들의 중심이 0으로 맞춰지고 -1과 1사이의 값으로 나온다.

Z-score Normalization

이 방법은 표준편차로 나눠준다.

  • x1=x1μ1σ1x_1 = \frac{x_1-\mu_1}{\sigma_1}

이렇게 구할 수 있다.

어떤 경우 우리는 feature scaling을 해줘야할까?
-> 하나의 feature이 다른 애들에 비해 너무 크거나, feature의 값의 범위가 너무 넓을 때 해주면 된다.

Checking Gradient descent for convergence

우리는 cost function(비용함수) J를 최소화시키는게 목적인데, 과연 J의 값이 변화하지 않는데 더이상 작업을 진행하는게 의미가 있을까?

우리는 그런 지점을 설정해주어서 불필요한 작업들을 줄여준다.

  • J(w,b)ϵJ(\vec w, b) \leq \epsilon(ϵ=103)\epsilon=10^{-3}) => 이런 경우 수렴했다고 보고 학습을 그만한다.

Choosing the learning rate

=> 우리는 최적의 learning rate를 찾기위해 0.001부터 3씩 곱해서 실험해보고 최적의 learning rate를 찾는다.

Feature Engineering

이전에 봤던 것 처럼 feature을 scaling하여 크기를 조정하는 것 뿐만 아니라,

feature들을 합쳐서 새로운 feature을 만드는 방법도 있다.

예를 들어, feature 중에 방의 바닥의 넓이와 방의 높이라는 2개의 feature이 존재하면 이 2개를 사용해서 방의 부피라는 feature을 새로 만들어서 모델의 성능을 올릴 수도 있다.

Polynomial Regression

feature engineering에서 만약 하나의 feature을 제곱하여 새로운 feature을 만들어낸다면 어떨까? => 곡선으로 데이터를 fitting할 수 있게될 것이다.

그리고 이러한 형태를 Polynomial Regression이라고 부르는 것이다.

  • fw,b(x)=w1x+w2x2+w3x3+bf_{\vec w, b}(x)=w_1x+w_2x^2+w_3x^3+b

그리고 당연하게도 이런 경우에는 feature scaling이 더 중요하게 되는 것이다.

새로 생겨난 제곱 항 feature은 훨씬 큰 값을 가질 것이기 때문이다.

profile
아무것도 모르는 사람

0개의 댓글