티스토리 뷰
이전 실습에서 차수가 낮은 다항 회귀 모델은 과소적합이, 차수가 높은 다항 회귀 모델의 경우 회귀 계수가 매우 커짐과 동시에 과적합이 발생하는 것을 확인했습니다. 따라서 회귀 모델을 학습 데이터에 적절히 적합시키면서 회귀 계수가 기하급수적으로 커지는 것을 제어해야 합니다.
이전까지 선형 모델의 비용 함수는 RSS를 최소화하는, 즉 실제값과 예측값의 차이를 최소화하는 것만 고려했습니다. 그러다 보니 학습 데이터에 지나치게 맞추게 되고, 회귀 계수가 쉽게 커졌습니다. 이럴 경우 모델의 변동성이 심해지면서 테스트 데이터에 대해 예측 성능이 크게 저하되기 쉽습니다. 그러므로 비용 함수는 RSS를 최소화함과 동시에 과적합을 방지하기 위해 회귀 계수 값이 커지지 않도록 제어해야 합니다.
이를 만족하기 위해 비용 함수의 목적은 $\min(RSS(W) + alpha*penalty)$로 수정되어야 합니다. 여기서 penalty란 회귀 계수가 커질수록 함께 커지는 함수입니다. 또한 alpha값이 커질수록 페널티에 대한 가중치가 RSS값에 비해 훨씬 커지게 되므로 과적합을 더욱 규제할 수 있습니다. 이와 같은 방식으로 과적합을 개선하는 것은 규제(Regularization)이라고 부릅니다.
규제는 크게 L2 방식과 L1 방식으로 구분됩니다. L2 규제는 penalty가 $\|W\|_{2}^{2}$와 같이 회귀 계수의 제곱에 대해 페널티를 부여합니다. L2 규제를 적용한 회귀를 릿지(Ridge) 회귀라고 합니다. 반면 L1 규제의 penalty는 $\|W\|_{1}$와 같이 회귀 계수의 절댓값에 페널티를 부여합니다. L1 규제는 영향력이 크지 않은 회귀 계수 값을 0으로 변환합니다. L1 규제를 적용한 회귀를 라쏘(Lasso) 회귀라고 합니다.
사이킷런은 Ridge 클래스를 통해 릿지 회귀를 구현합니다. 주요 생성 파라미터는 alpha이며, 이는 릿지 회귀의 L2 규제 계수에 해당합니다. 보스톤 주택 가격을 Ridge 클래스를 이용해 다시 예측하고, 예측 성능을 corss_val_score()로 평가해보겠습니다.
릿지 회귀를 통해 보스턴 주택 가격 예측 데이터 세트를 학습해봅시다. 학습된 모델의 5개의 폴드 세트에 대한 평균 RMSE가 5.518로, 규제가 없는 LInearRegression 모델의 평균 RMSE인 5.829보다 더 나은 예측 성능을 보여줍니다.
이번에는 릿지의 alpha 값을 변화시키면서 RMSE와 회귀 계수 값의 변화를 살펴봅시다. alpha가 100일 때 평균 RMSE가 5.330으로 가장 좋습니다. 즉, 과적합을 제어할수록 더 나은 예측 성능을 보여줍니다.
이번에는 alpha 값의 변화에 따른 피처의 회귀 계수 값을 가로 막대 그래프로 시각화해 보겠습니다. 회귀 계수를 추출한 뒤에 Series 객체로 만들어서 seaborn 가로 막대 차트로 표시하고, DataFrame에 alpha 값 별로 회귀 계수를 저장합니다.
alpha 값을 증가시킬수록 전체적인 회귀 계수가 지속적으로 작아지는 것을 볼 수 있습니다. 특히 "NOX" 피처의 경우 그러한 경향이 두드러지게 나타납니다.
DataFrame에 저장된 alpha값에 따른 릿지 회귀 계수를 살펴봅시다. alpha 값이 증가하면서 회귀 각 회귀 계수가 지속적으로 작아지는 경향이 보입니다. 하지만 회귀 계수가 아예 0인 경우는 보이지 않습니다. 이처럼 릿지 회귀의 경우 회귀 계수를 0으로 만들지는 않습니다.
이번에는 회귀 계수의 절댓값에 페널티를 부여하는 L1규제를 적용하는 라쏘 회귀에 대해 알아봅시다. L2 규제가 회귀 계수의 크기를 감소시키는 데 반해, L1 규제는 불필요한 회귀 계수를 아예 0으로 만들어 제거합니다. 이러한 측면에서 L1 규제는 적절한 피처만 회귀에 포함시키는 피처 선택의 기능을 합니다.
사이킷런은 Lasso 클래스를 통해 라쏘 회귀를 구현했습니다. Lasso 클래스의 주요 생성 파라미터는 alpha이며, 이는 라쏘 회귀의 L1 규제 계수에 해당합니다. Lasso 클래스를 이용하여 바로 이전의 릿지 회귀 예제에서와 비슷하기 alpha 값을 변화시키면서 모델의 RMSE와 회귀 계수를 출력해보겠습니다. 뒤에서 설명할 엘라스틱넷도 동일하게 alpha 값을 변화시키면서 결과를 출력할 것이므로, 해당 루틴을 수행하는 별도의 메서드를 정의하겠습니다.
인자로 회귀 모델의 이름, alpha값 리스트, 피처 데이터 세트와 타겟값을 받아서 alpha값에 따른 모델의 평균 RMSE를 출력하고, 회귀 계수값들을 DataFrame으로 반환하는 메서드를 정의했습니다.
다양한 alpha값에 따른 라쏘 회귀 모델의 평균 RMSE를 확인해봅시다. alpah가 0.07일때 가장 좋은 RMSE 값이 도출되었습니다. 릿지에서 가장 좋았던 RMSE인 5.5118보다는 약간 떨어지는 수치지만, LinearRegression 모델보다는 성능이 향상되었습니다.
alpha값에 따른 피처별 회귀 계수를 확인해봅시다. alpha의 크기가 증가함에 따라 일부 피처의 회귀 계수는 아예 0으로 바뀌고 있습니다. 회귀 계수가 0인 피처는 회귀 식에서 제외되면서 피처 선택의 효과를 얻을 수 있습니다.
다음으로 엘라스틱넷(ElasticNet) 회귀를 설명하겠습니다. 엘라스팃넷 회귀는 L2 규제와 L1 규제를 결합한 회귀입니다. 따라서 엘라스틱넷 회귀 비용함수의 목표는 $RSS(W) + alpha2*\|W\|_{2}^{2} + alpha1*\|W\|_{1}$식을 최소화하는 회귀 계수를 찾는 것입니다. 라쏘 회귀의 경우 서로 상관관계가 높은 피처에 대해, 중요 피처만을 선택하고 다른 피처의 회귀 계수를 0으로 만드는 성향이 강합니다. 이 때문에 alpha값에 따라 회귀 계수의 값이 급격하게 변동할 수 있는데, 엘라스틱 회귀는 이를 완화하기 위해 라쏘 회귀에 L2 규제를 추가한 것입니다. 그러나 L1규제와 L2규제를 함께 사용하기 때문에 학습 시간이 상대적으로 오래 걸린다는 단점이 있습니다.
사이킷런은 ElasticNet 클래스를 통해서 엘라스틱넷 회귀를 구현합니다. 해당 클래스의 주요 생성 파라미터는 alpha와 l1_ratio입니다. ElasticNet 클래스의 alpha는 Ridge와 Lasso 클래스의 alpha와는 살짝 다릅니다. 엘라스틱넷의 규제는 $a*L1 + b*L2$로 정의될 수 있으며, 이때 $a$는 L1규제의 alpha값, $b$는 L2 규제의 alpha값입니다. 따라서 ElasticNet 클래스의 alpha 파라미터 값은 a+b를 나타냅니다. l1_ratio 파라미터는 $a/(a+b)$입니다. 그러므로 l1_ratio 값이 0이면 $a$가 0이므로 L2 규제와 동일합니다. l1_ratio가 1이면 $b$가 0이므로 L1 규제와 동일합니다.
엘라스틱넷 회귀도 릿지, 라쏘 회귀와 마찬가지로 alpha 값을 변화시키면서 평균 RMSE와 회귀 계수를 확인해봅시다. 실습전에 주의해야할 점은, ElasticNet 객체 생성시 l1_ratio를 0.7로 고정한 채 alpha 값만 변화시킨다는 점입니다.
alpha가 0.5일 때 평균 RMSE가 5.467로 가장 좋은 예측 성능을 보이고 있습니다.
alpha 값이 커져도, 회귀 계수가 0인 피처들의 개수가 라쏘보다는 적은 것을 확인할 수 있습니다.
지금까지 규제 선형 회귀의 가장 대표적인 기법인 릿지, 라쏘, 엘라스틱넷 회귀를 살펴봤습니다. 이들 중 어떤 것이 가장 좋은지는 상황에 따라 다르며, 각 알고리즘의 하이퍼 파라미터를 변경해 가면서 예측 성능을 끌어올려야 합니다.
'파이썬 머신러닝 완벽 가이드' 카테고리의 다른 글
파이썬 머신러닝 완벽 가이드 : 로지스틱 회귀와 회귀 트리 (0) | 2023.05.12 |
---|---|
파이썬 머신러닝 완벽 가이드 : 선형 회귀 모델을 위한 데이터 전처리 (0) | 2023.05.12 |
파이썬 머신러닝 완벽 가이드 : 다항 회귀와 과적합/과소적합 이해 (0) | 2023.05.11 |
파이썬 머신러닝 완벽 가이드 : 사이킷런 회귀 클래스를 이용한 보스턴 주택 가격 예측 (0) | 2023.05.11 |
파이썬 머신러닝 완벽 가이드 : 회귀(Regression) (0) | 2023.05.10 |