기계학습

2018. 1. 2. 23:12ML(머신러닝)/BASIC

데이터 과학의 핵심 : 비즈니스 문제를 데이터 문제로 변환시킨 뒤 관련 데이터를 수집하고 이해하고 전처리하고 형식을 바꾸는 것


기계학습은 이러한 과정 이후에 생각해야 하는 것


# 모델링


모델이란 ? -> 모델은 다양한 변수 간의 수학적 관계를 표현한 것


ex >  요리책 , 먹는 사람의 수, 배고픈 정도와 같은 변수를 통해서 재료의 양을 결정하는 모델을 사용

비즈니스 모델에서 요리책 모델은 시행착오를 기반으로 누군가 직접 다양한 재료의 조합으료 요리 시도해 보고 가장 마음에 드는 조합을 찾았을 것

## 요즘 보니 요리하는 로봇을 만들어 쉐프의 데이터를 입력하면 비슷하게 만들어주는 머신까지도 발명했다고 하더라구요..


# 기계학습


데이터를 통해 모델을 만들고 사용하는 것 -> 모델링 or 데이터마이닝 


# 신용카드 사기 예측 / 스팸 예측 / 미식 축구팀 우승활 팀 예측

# 기법 

주어진것 : 데이터 , 답 -> 데이터 -> 답 예측  = 지도학습

주어진것 : 데이터 -> 모델링 -> 데이터 = 비지도학습


## 오버피팅과 언더피팅


# 오버피팅 이란 학습된 데이터에서는 좋지만 새로운 데이터에서는 좋지 않은 경우

# 언더피팅 학습된 데이터에서도 성능이 좋지 않은 경우 -> 새로운 모델을 찾아봐야 한다.


모델 너무 복잡 -> 오버 피팅 


기본적인 해결 방법

# 2/3 로 모델을 학습시키고 1/3 성능평가

평가 데이터에서 성능이 좋은 모델은 오버피팅이 되지 않았다고 볼 수 있다.


# 하지만 문제점 존재

# 1 학습데이터와 평가 데이터에 동일한 패턴 존재한다면 더 큰 데이터에서 모델의 일반적인 성능이 좋지 않음

# ex) 각 사용자 주간 활동 내역 데이터 -> 이 경우 학습데이터 평가데이터 모두 나타날 것이고

# 모델은 속석간의 관계보다는 사용자 분류를 할 수도 있다.


# 2 더 큰 문제 

# 학습데이터와 평가 데이터로 하나의 모델을 평가 할 때가 아니라 여러 모델 중에서 하나의 모델을 선택할 떄 발생한다.

# 각각의 모델에서는 오버피팅이 되지 않겠지만 평가 데이터에서는 성능이 제일 좋은 모델 선택한다면 ,

# 평가 데이터를 일종의 두 번째 학습 데이터로 사용하는 메타학습의 문제가 발생

# 해결법 -> 데이터를 3종류로 나누기 -> 학습데이터 / 검증 데이터 / 평가 데이터

# 학습데이터로 모델 만들고 검증 데이터를 통해 학습 된 여러 모델 중 하나를 선택하고

# 평가 데이터로 최종 모델의 성능평가하기 


# 정확도 / 정밀도(precision) 재현율(recall)

모델의 성능 평가를 할 때는 정밀도와 재현율을 사용한다.

정밀도는 양성으로 예측된 결과의 정확도를 의미한다.

재현율은 실제 양성 중 모델이 정확하게 양성을 예측할 비율 



 참고: https://www.slideshare.net/RickyPark3/5model-evaluation-and-improvement


모델 선택시 정밀도와 재현율의 trade-off를 고려해야 한다.

특정 데이터가 조금이라도 양성일 것 같을 때 모델이 데이터를 양성이라 판단한다면 재현율은 높겠지만, 정밀도는 낮을 것인다

반면 모델이 데이터가 확실히 양성일 때만 해당 데이터를 양성이라고 판단하면 재현율은 낮겠지만 정밀도는 높을 것이다.

다르게 생각하면 FP(false positive) 와 FN(false negative) 의 트레이드 오프라고 할 수 있다.

예를 들어 백혈병 유발 하는 10가지 위험요소가 존재 -> 더 많은 위험요소 보유할수록 발병 확률 급증 

# 이런 경우 적어도 한개의 1개 -> 발병 여부  적어도 2개 -> 발병 여부 판단

# 위험요수 증가 할수록 발병확률 증가 -> 판독의 정밀도는 증가

# 하지만 위험 요소 개수가 증가하면 점점 더 적은 수 환자의 양성으로 판정 -> 재현율 감소 

# 위험 요소 개수를 적당하게 정하는 것이 중요함


Bias-Variance 트레이드 오프

오버피팅 문제는 bias(편향) 과 variance (분산)의 Trade-off 라고 할 수 있다.

두 수치는 모두 모델을 더 큰 모집단에서 추출한 다양한 학습 데이터로 모델을 다시 학습시키면 어떠한 변화가 발생하는지 설명한다.


더 큰 모집단에서 추출한 상수 함수는 모든 학습 데이터에서 큰 오류 범할 것이다. 즉 상수가 상당히 bias 하다는 것이지만 임의의 두 학습 데이터에서는

비슷한 모델이 만들어질 것이므로 variance는 낮다 bias는 높고 variance는 낮다면 언더피팅이다.


반대로 함수를 9차 함수로 만들면 학습데이터는 잘 통과해서 Bias는 낮지만  두 모델 학습 데이터에서 모델이 달라지기 때문에 variance는 높이진다

이때를 오버피팅이라고 한다.


해결책


언더피팅 -> 변수 추가를 통해 해결

오버피팅 -> 변수를 줄이거나 더많은 데이터를 학습시키기


모델이 복잡한대 -> 데이터를 더 많이 추가하면 -> 분산은 적어질 수 밖에 없다.

데이터 수 늘어도 -> bias 줄어들지 않는다


만약 변수가 엄청나게 많을경우

# 1_ 차원축소 -> 데이터 특성 나타낼 수 있다.

# 2_ regularization -> 변수의 개수 늘어날 수록 penalty 부과해서 모델을 불리하게 만드는 기법 사용 할 수 있다.



# regularization


한가지 예로 다중 회귀분석시 변수가 너무 많으면 다양한 문제 발생한다. 

만약 어떠한 현상을 설명하는 것이 목표라면 수백 개의 변수보다는 3개 정도의 작은 모델을 추천한다.

regularization은 beta가 커지면 커질수록 해당 모델에게 penalty를 주는 방법이다

그리고 error와 penalty를 동시에 최소화하는 최적의 모델을 만들 수 있다.

penalty를 강조 할 수록 큰 계수에 대한 제한이 더욱 커진다


ex) ridge regression (리지회귀) beta_i 를 제곱한 값의 합에 비례하는 패널티를 추가한다. 하지만 상수에 대한 패널티는 주지 않는다.

참고 : https://github.com/sungreong/data-science-from-scratch/blob/master/code-python3/multiple_regression.py


# alpha is a *hyperparameter* controlling how harsh the penalty is

# sometimes it's called "lambda" but that already means something in Python


def ridge_penalty(beta, alpha):

return alpha * dot(beta[1:], beta[1:])


def squared_error_ridge(x_i, y_i, beta, alpha):

"""beta를 사용할 때 오류와 패널티의 합을 추정"""

return error(x_i, y_i, beta) ** 2 + ridge_penalty(beta, alpha)


def ridge_penalty_gradient(beta, alpha):

"""패널티의 기울기"""

return [0] + [2 * alpha * beta_j for beta_j in beta[1:]]


def squared_error_ridge_gradient(x_i, y_i, beta, alpha):

"""i번째 오류 제곱 값과 패널티 합의 기울기"""

return vector_add(squared_error_gradient(x_i, y_i, beta),

ridge_penalty_gradient(beta, alpha))


def estimate_beta_ridge(x, y, alpha):

"""패널티가 alpha인 리지 회귀를 경사 하강법으로 학습"""

beta_initial = [random.random() for x_i in x[0]]

return minimize_stochastic(partial(squared_error_ridge, alpha=alpha),

partial(squared_error_ridge_gradient,

alpha=alpha),x, y,beta_initial, 0.001)


# 만약 alpha =0 이라면 패널티는 전혀 없으며 어진과 동일한 모델이 학습 된다.

def lasso_penalty(beta, alpha):

return alpha * sum(abs(beta_i) for beta_i in beta[1:])


# 리지 회귀의 패널티는 총 계수의 합을 줄여주지만

# 라쏘 회귀의 패널티는 모든 게수를 최대한 0으로 만들어 주며 보다 희소한(sparse) 모델을 학습하게 해준다.

# 라쏘 회귀는 경사 하강법으로 학습하는 것이 아니다. 


# 찾다보니 좋은 사이트 REGULARIZATION RIDGE 와 LASSO ELASTIC NET REGRESSION 기본설명이 되어 있는 사이트 

https://brunch.co.kr/@itschloe1/11



728x90