TIL_50 : 정규화

72523 단어 TILmachine learningTIL

🙄 편향 & 분산


➡ 편향

  • 모델이 너무 간단해서 데이터의 관계를 잘 학습하지 못하는 경우
    모델의 편향, bias가 높다고 함
  • 높은 차항의 회귀를 사용해서 training 데이터에 거의 완벽한 곡선을 보이는 모델
  • 모델의 복잡도를 늘려서 training 데이터의 관계를 잘 학습
  • 편향이 낮은 모델이라고 함
  • 편향이 높은 머신 러닝 모델은 너무 간단해서 데이터의 관계를 잘 학습하지 못함
  • 편향이 낮은 모델은 주어진 데이터의 관계를 아주 잘 학습

training 데이터의 관계를 완벽하게 나타내는, 편향이 낮은 모델이 무조건 좋은 것은 아님


➡ 분산

  • 데이터 셋 별로 모델이 얼마나 일관된 성능을 보여주는지를 분산, variance 이라고 함
  • training set을 사용했을 때랑, test set을 사용했을 때
    성능에 큰 차이를 보이면 모델의 분산이 크다라고 함

➡ 편향-분산 트레이드오프 (Bias-Variance Tradeoff)

  • 일반적으로 편향과 분산은 하나가 줄어들수록 다른 하나는 늘어나는 관계
  • 둘 중 하나를 줄이기 위해서는 다른 하나를 포기해야 됨
  • 이 관계를 편향-분산 트레이드오프 라고 부름

과소적합

  • 단순한 모델은 복잡도가 너무 떨어져 곡선 관계를 학습할 수 없음
  • 대신 모델이 간단하기 때문에 어떤 데이터가 주어지든 일관된 성능을 보임
  • 위 모델은 편향이 높고, 분산이 낮은 모델
  • 모델이 과소적합, underfit 됐다고 함

과적합

  • 복잡한 모델은 training 데이터에 너무 잘 맞는게 문제
  • training 데이터의 패턴을 학습한 것이 아닌 데이터 자체를 외워버리기 때문에
    training 데이터에 대한 성능은 아주 높지만, test 데이터에 대한 성능은 떨어짐
  • 편향이 낮고, 분산이 높은 모델
  • 모델이 과적합, overfit 됐다고 함

편향-분산 트레이드오프 문제는 머신 러닝 프로그램들의 성능과 밀접한 관계가 있어
편향과 분산, 다르게는 과소적합과 과적합의 적당한 밸런스를 찾아내는 게 중요


➡ scikit-learn으로 과적합 문제 직접 보기

  • 과소적합을 막는 방법은 아주 간단함
  • 충분히 복잡한 모델을 쓰면 된다
    = 선형 회귀 보다는 높은 차원의 다항 회귀를 쓰면 된다



🙄 정규화


➡ 정규화 (Regularization)

  • 모델 과적합 현상을 방지해 주는 방법 중 하나
  • 가설 함수의 θ\theta 값들이 너무 커지는 걸 방지해서 과적합을 예방
  • 과적합된 함수는 보통 위아래로 굴곡이 큰 특징이 있음
  • 많은 굴곡을 이용해서 training 데이터를 최대한 많이 통과하도록 하기 위함
  • 함수가 급격하게 변화한다는 것은 함수의 계수, 가설 함수는 θ\theta 값들이 굉장히 크다는 뜻
  • 정규화는 모델을 학습시킬 때 θ\theta 값들이 너무 커지는 것을 방지
  • training 데이터에 대한 오차는 조금 커지더라도 가설 함수를 좀 더 완만하게 만듦
  • 여러 데이터 셋에 대해 더 일관된 성능을 보이기 때문에 과적합을 방지할 수 있음

➡ L1, L2 정규화

  • 그동안 좋은 가설 함수의 기준training 데이터에 대한 오차가 작은 함수
  • training 데이터에 대한 오차도 작고 θ\theta 값들도 작아야 한다로 바꿔주자

L1 정규화

  • L1 정규화를 사용하는 회귀 모델을 Lasso 회귀 모델, Lasso 모델이라고 함
  • J(θ)=J(\theta)=12mi=1m(hθ(x(i))y(i))2+i=1nθi\frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2+\sum_{i=1}^n|\theta_i|
  • θ0\theta_0
  • i=1nθi\sum_{i=1}^n|\theta_i|

ex) 아래와 같은 5차항 함수 2개가 있다면 :
g(x)=5+10x+2x2+5x4+3x5g(x)=5+10x+2x^2+5x^4+3x^5

평균 제곱 오차 항정규화 항손실
g(x)g(x)52025
h(x)h(x)1180181
  • 가설 함수 gg는 데이터에 대한 평균 제곱 오차는 hh보다 크지만
    θ\theta값들이 훨씬 작기 때문에 더 좋은 가설 함수라고 평가

상수 λ\lambda

  • J(θ)=J(\theta)=12mi=1m(hθ(x(i))y(i))2+λi=1nθi\frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{i=1}^n|\theta_i|
  • λ\lambdaθ\theta값들이 커지는 것에 대해 얼마나 많은 페널티를 줄 건지 결정
  • 오차와 θ\theta값 중 어떤 것을 줄이는 게 중요한지는 상수 λ\lambda에 따라 결정
    λ\lambda값이 크면 θ\theta값을 줄이는 게 중요
    λ\lambda값이 작으면 평균 제곱 오차를 줄이는 게 중요

L2 정규화

  • L1 정규화와 같은 개념
  • 더해주는 정규화 항이 다름
  • L2 정규화를 사용하는 회귀 모델은 Ridge 회귀 모델, Ridge 모델이라고 함
  • J(θ)=J(\theta)=12mi=1m(hθ(x(i))y(i))2+λi=1nθi2\frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{i=1}^n\theta_i^2

➡ scikit-learn으로 과적합 문제 해결



🙄 L1, L2 정규화 일반화


  • 위에는 모두 다항 회귀 모델을 예시로 사용
  • 정규화는 모델의 파라미터에 대한 손실 함수를 최소화 하는 모든 알고리즘에 적용 가능
  • 손실 함수에 정규화 항 λi=1nθi\lambda\sum_{i=1}^n|\theta_i|
  • 그러나 로지스틱 회귀 모델은 자동으로 L2 정규화를 적용
  • penalty 라는 옵셔널 파라미터로 정규화 기법을 정해 줄 수 있음
LogisticRegression(penalty='none')	# 정규화 사용 안함
LogisticRegression(penalty='l1')	# L1 정규화 사용
LogisticRegression(penalty='l2')	# L2 정규화 사용
LogisticRegression()			# 위와 같음: L2 정규화 사용



🙄 L1, L2 정규화 차이점


L1

  • J(θ)=J(\theta)=12mi=1m(hθ(x(i))y(i))2+λi=1nθi\frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{i=1}^n|\theta_i|

L2

  • J(θ)=J(\theta)=12mi=1m(hθ(x(i))y(i))2+λi=1nθi2\frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{i=1}^n\theta_i^2

차이점

  • L1 정규화는 여러 θ\theta값들을 0으로 만듦
  • 모델에 중요하지 않다고 생각되는 속성들을 아예 없애버림
  • 속성 20개를 사용해 2차 다중 다항 회귀 모델을 만든다면 속성은 총 230개
  • 모델을 학습시킬 때 많은 자원(RAM, 시간) 소모
  • L1 정규화를 사용하면 속성의 개수를 많이 줄일 수 있음
  • L2 정규화는 θ\theta값들을 0으로 만들기보다는 조금씩 줄임
  • 모델에 사용되는 속성들을 L1처럼 없애지 않음
  • 딱히 속성의 개수를 줄일 필요가 없다고 생각되면 L2 정규화 사용

좋은 웹페이지 즐겨찾기