반응형
Index
● Linear Regression 개요
- 회귀(Regression)모델의 가장 큰 구분은 ①독립변수의 개수에 따라 단일회귀/다중회귀 ② "회귀계수"의 종류에 따라 선형회귀/비선형회귀로 구분된다. (비선형 회귀와 다항회귀를 혼동하면 안된다).
- 선형회귀는 피쳐와 라벨간에 선형적인 관계가 있다고 가정하고 최적의 선형함수를 탐색한다. (실제는 선형적 관계가 아닐수 있음에도)
- 회귀모델은 오류(=Cost=Loss function ; residual, RSS, MAE, MSE 등으로 측정)를 최소화하는 회귀계수 혹은 회귀선을 찾는것을 목적으로 한다.
- 최적의 회귀계수를 찾는 대표적인 방법론 : Gradient Descent (경사하강법). Gradient는 Cost를 parameter(회귀계수)에 대해 편미분 한것이고. Cost 가 줄어드는 Negative Gradient 방향으로 Parameter를 지속 업데이트한다. OLS(일반선형회귀)는 최적 회귀선 찾는게 쉬워 굳이 Gradient Descent 를 사용하진 않는다.
- Gradient Descent 방식에도 여러가지가 있는데, 주로 Stochastic Gradient Descent (≒ mini batch gradient) 방식 : 전체 데이터셋을 batch 단위로 나누어 실행 (300,000 records of data = 100 batches of 3000 size = 1 epoch)
- 선형회귀는 특정 독립변수의 회귀계수가 너무 크게되는 것을 방지하기위해 (overfitting 방지 목적으로) Regularization을 적용하는데, 적용방식에 따라 크게 OLS(기본), Lasso(L1), Ridge(L2), ElasticNet(L1+L2)로 구분한다.
- 다중 회귀모델은, multi-collinearity problem(다중공선성문제) 즉, 종속변수간의 높은 상관관계가 존재할때 생기는 문제 해결이 매우 중요하다. 이를위해 변수간에 ①PCA 등 차원축소 전처리가 진행되며, ②Regularization 도 어느정도 다중 공선성을 해결한다.
- 다중공선성의 문제점? y = 자동차 사고확률 , x1=혈중 알콜농도, x2=운전자 음주량 이라고 하면 x1/x2 의 상관계수가 1에 가깝기 때문에 메 학습마다 x1,x2의 회귀계수의 합만 일정하게 비율은 항상 크게 다를수 있다. 즉 계수에 대한 표준오차가 크다는것을 의미하고 통계적으로 회귀모델 유의성이 떨어지고 그만큼 해석력이 부족하고 과적합되기 쉽다 (모두 같은 의미)
● 회귀 평가지표
회귀의 평가지표는 여러가지가 있겠지만,, 주로 많이 쓰이는것은 아래와 같다. MAE 는 보다 직관적인 장점이 있고 Root 를 씌우는 이유는 MSE에서 제곱하며 커진 크기를 맞춰주기 위함
● 다항회귀 (Polynomial Regression)
- 회귀식의 하나이상의 독립변수가 다항식(2차이상)으로 표현되는 모델
- 다항회귀도 선형회귀(Linear) 이다. (비선형은 회귀계수와 변수의 관계가 비선형인것 : 예를들어 x 가 e의 지수로 들어가거나 sin함수 안에 들어가있거나..)
- 다항회귀가 선형회귀의 연장인것은 다항 독립변수를 치환할 수 있기 때문이다. (ex. x1*x2 = z1 , x1*2 = z2)
- 사이킷런은 다항회귀 클래스가 없어서 PolynomialFeature 클래스를 이용해 단항피처를 다항으로 변환해서 사용한다.
X = np.arange(4).reshape(2,2)
print('일차 단항식 계수 feature:\n',X )
# 3 차 다항식 변환
poly_ftr = PolynomialFeatures(degree=3).fit_transform(X)
print('3차 다항식 계수 feature: \n',poly_ftr)
- 사이킷런의 pipeline 객체를 이용해 피쳐 다항변환과 회귀모델 학습을 순차 결합하기
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
def polynomial_func(X):
y = 1 + 2*X[:,0] + 3*X[:,0]**2 + 4*X[:,1]**3
return y
# Pipeline 객체로 Streamline 하게 Polynomial Feature변환과 Linear Regression을 연결
model = Pipeline([('poly', PolynomialFeatures(degree=3)),
('linear', LinearRegression())])
X = np.arange(100).reshape(50,2)
y = polynomial_func(X)
model = model.fit(X, y)
print('Polynomial 회귀 계수\n', np.round(model.named_steps['linear'].coef_, 2))
결과값 : Polynomial 회귀 계수 [ 0. 0.2 0.2 0.93 1.13 1.32 -0.59 0.34 1.46 2.79]
# 정합성 확인
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
- 다항회귀 문제에서 변수의 차수(degree)가 클수록 overfit 되는 경향이 있고, 작을수록 underfit 되는 경향이 있다. 트리 모델에서의 depth 와 비슷한 느낌이다.
● 규제 선형모델 (Regularized Linear Models) - Ridge, Lasso, ElasticNet
- 기존의 Cost Function 에서는 RSS의 최소화(Bias)만 고려하기 때문에 과적합(Variance)을 방지하기위한 장치로 Regularization 이 필요하다. (모든 예측모델은 Bias - Variance 균형이 필요하다)
- Regularization은 아래와 같이 비용함수에 W 크기에 대한 penalty를 부여함으로서 과적합을 방지한다.
- alpha 계수를 조정함으로서 Bias-Variance tradeoff 를 조정한다.
1. Ridge 릿지 회귀 (L2)
- Ridge 회귀모델은 Regularization term 에 W^ (제곱)을 사용하는 규제 회귀모델이다.
- alptha 계수를 바꿔가며 교차검증 수행하는 코드. 데이터 사이즈가 크다면 Ridge(solver='sag') 와 같이 gradient 방식으로 해를 찾을 수도 있다.
from sklearn.linear_model import Ridge
# 릿지에 사용될 alpha 파라미터의 값을 정의
alphas = [0, 0.1, 1, 10, 100, 3000]
# alphas list 값을 반복하면서 alpha에 따른 평균 rmse를 구함.
for alpha in alphas :
ridge = Ridge(alpha = alpha)
# cross_val_score를 이용해 5 폴드의 평균 RMSE를 계산
# 사이킷런의 모델 학습은 score 가 높은걸 목표로 학습하기에 MSE 에 negative 적용
neg_mse_scores = cross_val_score(ridge, X_data, y_target, scoring="neg_mean_squared_error", cv = 5)
avg_rmse = np.mean(np.sqrt(-1 * neg_mse_scores))
print('alpha {0} 일 때 5 folds 의 평균 RMSE : {1:.3f} '.format(alpha, avg_rmse))
2. Lasso 라쏘 회귀 (L1)
- Lasso 회귀모델은 Regularization term 에 |W| (절대값)을 사용하는 규제 회귀모델이다.
- Ridge와의 비교: Ridge는 계수의 크기를 최대한 줄이는 방향인 반면, Lasso 는 불필요한 계수는 완전히 0 으로 만드는 Feature selection 에 가까운 모델이다.
3. ElasticNet 엘라스틱넷 회귀 (L1+L2)
- ElasticNet 회귀모델은 L1,L2 규제를 결합한 형식의 회귀모델이다.
- 상관관계가 높은 피쳐들중에 중요 피쳐만 선택하는 방식으로, 다중 공선성문제가 큰 데이터에 유리하다.
- 파라미터는 alpha(L1,L2 가중치의 합), l1_ratio (L1 alpha / L1 + L2 alpha)
반응형
'Study > ML' 카테고리의 다른 글
11. 차원축소(PCA,LDA,SVD) (0) | 2023.06.01 |
---|---|
10. 회귀(Regression) - 로지스틱 회귀, 회귀 트리 (0) | 2023.05.31 |
8. 베이지안 최적화(Bayesian Optimization) (0) | 2023.05.30 |
지니계수 (0) | 2023.05.28 |
7. 앙상블(Ensemble) - 부스팅(Boosting) (0) | 2023.05.28 |
댓글