Computer Science/Machine learning

[Machine learning] 5. Regression

  • -
728x90
반응형

Linear Regression

특성이 하나인 경우 어떤 직선을 학습하는 알고리즘이다.
KNN의 경우 새로운 샘플이 훈련 세트의 범위를 벗어나면 엉뚱한 값을 예측할 수 있었는데, Linear Regression의 경우 만족하는 직선을 학습하는 것이므로 해당 문제를 해결할 수 있다.

사용 방법은 다음과 같다.

from sklearn.linear_model import LinearRegression 

# Fitting 
lr = LinearRegression() 
lr.fit(train_input, train_target) 

# Model evaluation 
target_score = lr.score(train_input, train_target) 
test_score = lr.score(test_input, test_target)

Poly Regression

Linear Regression의 경우 직선을 학습하는 것인데, 직선이 아니라 다른 형태의 형태가 모델에 더 적합할 수 있다.
이러한 상황에서 Poly Regression을 사용해주면 된다. 새로운 Class를 활용하지 않고 PolynomialFeatures를 활용해서 Linear Regression을 진행해주면 된다.

 

그러나 특성의 개수를 늘릴수록 훈련 세트에 대해 거의 완벽하게 학습하게 되므로 Overfitting 문제가 발생할 수 있다.
따라서 무조건 특성의 개수가 높을수록 유리하지 않고, 적절한 규제를 통해 Overfitting 문제를 해결해야 한다.

Regularization

훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 역할을 수행하게 된다.
예를 들어 Linear Regression의 경우 특성에 곱해지는 계수(or 기울기)의 크기를 작게 만든다.

 

다만 이 작업을 잘 수행하기 위해서는 standardize를 거친 후 진행해야한다. 왜냐하면, 스케일이 차이나게 되면 영향받는 정도가 상이해지기 때문이다.

 

선형 회귀 모델에 규제를 추가한 모델은

  • 릿지(Ridge)
  • 라쏘(Lasso)

가 존재하는데 각각 계수를 제곱한 값계수의 절댓값을 기준으로 규제를 적용한다.

 

또한, Ridge와 Lasso는 규제의 양을 조절할 수 있다. 이는 모델 객체를 만들 때 alphaparameter를 통해 조절할 수 있는데, 해당 값이 크면 규제 강도가 커지므로 보다 훈련 모델에 과소적합 되도록 유도하게 된다.(KNN에서 n_neighbors 값을 키운 것과 비슷한 효과라고 이해하면 된다.)

$$모델의 복잡도 \propto {규제의 정도} \propto \frac{1}{훈련세트 피팅 정도}$$

Ridge

앞에 언급한 것처럼,계수를 제곱한 값을 기준으로 규제를 적용한다. 또한, 반드시 standardize를 진행해야한다는 것을 잊지 말아야 한다.
사용 방법은 다음과 같다.

from sklearn.linear_model import Ridge 

# Fitting 
ridge = Ridge()
ridge.fit(train_scaled, train_target) 

# Model evaluation 
target_score = ridge.score(train_scaled, train_target) 
test_score = ridge.score(test_scaled, test_target)

Lasso

계수의 절댓값을 기준으로 규제를 적용한다. Ridge와 마찬가지로 `standardize를 반드시 진행하고 사용해야 한다.
사용 방법은 다음과 같다.

from sklearn.linear_model import Lasso 

# Fitting 
lasso = Lasso()
lasso.fit(train_scaled, train_target) 

# Model evaluation 
target_score = lasso.score(train_scaled, train_target) 
test_score = lasso.score(test_scaled, test_target)

Decision of alpha parameter value

사실 중요한 부분은 Ridge나 Lasso의 사용 여부가 아니라, 어느 정도로 규제를 하는 것이 Overfitting이나 Underfitting을 막을 수 있는지 파악하는 것이다.

 

따라서 적절하게 alpha값을 독립 변수로 잡고, target_score과 test_score의 값을 종속 변수로 잡은R2R2그래프의 결과를 바탕으로 가장 적절한 값을 선택해주면 된다.

어차피 Ridge나 Lasso 모두 근본적으로 방법이 동일하므로 Ridge만 샘플 코드를 샆펴보도록 하겠다.

import matplotlib.pyplot as plt 

# Declare empty array for storing score values 
train_score = [] 
test_score = [] 

# Result of score values by changing alpha value 
alpha_list = [0.001, 0.01, 0.1, 1, 10, 100] 
for alpha in alpha_list:
    ridge = Ridge(alpha = alpha) 
    ridge.fit(train_scaled, train_target) 
    # Result store 
    train_score.append(ridge.score(train_scaled, train_target) 
    test_score.append(ridge.score(test_scaled, test_target) 

# Visualize graph by using matplotlib 
plt.plot(np.log10(alpha_list), train_score) 
plt.plot(np.log10(alpha_list), test_score) 
plt.xlabel("alpha") 
plt.ylabel("R^2") 
plt.show()

Matplotlib를 통해 그려진 그래프는 다음과 같다.

파란색이 train_score, 주황색이 test_score

위 결과를 보면 alpha값이 0.1일 때 가장 좋은 결과값을 산출하고 있음을 파악할 수 있다. 따라서 최종적으로 alpha를 0.1로 선택해서 규제를 진행해주면 된다. (log 스케일을 적용하였으므로 -1은 $10^{-1}$이므로 0.1이다.)

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.