관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

회귀 알고리즘과 규제 모델 9 - 특성 공학과 규제 심화 학습 본문

인공지능/머신러닝

회귀 알고리즘과 규제 모델 9 - 특성 공학과 규제 심화 학습

huenuri 2024. 10. 1. 21:37

다중 회귀에 대해서 좀더 학습해보기로 한다.


 

 

 

특성 공학과 규제 실습해보기

 

 

판다스를 사용해 농어 데이터를 인터넷에서 내려받아 데이터프레임에 저장하겠다. 그다음 넘파이 배열로 변환하여 선형 회귀 모델을 훈련한다. 판다스를 읽는 방법은 판다스의 read_csv() 함수에 주소를 넣어주는 것이 전부이다.

타깃 데이터는 이전과 같은 방식으로 준비한다.

 

 

이 데이터를 사용해 새로운 특성을 만들겠다.


 

 

 

 

fit() 메서드는 새롭게 만들 특성 조합을 찾고 transform() 메서드는 실제로 데이터를 변환한다. 변환기는 입력 데이터를 변환하는데 타깃 데이터가 필요하지 않다. 여기서는 2개의 특성(원소)을 가진 샘플 [2, 3]이 6개의 특성을 가진 샘플 [1. 2. 3. 4. 6. 9.]로 바뀌었다.

PolynomiaFeatures 클래스는 기본적으로 각 특성을 제곱한 항을 추가하고 특성끼리 서로 곱한 항을 추가한다.

무게 = a * 길이 + b  * 높이 + c  * 두께 + d * 1

 

선형 방정식의 절편은 항상 값이 1인 특성과 곱해지는 계수라고 볼 수 있다. 이렇게 놓고 보면 특성은 (길이, 높이, 두께, 1)이 된다. 하지만 사이킷런의 선형 모델은 자동으로 절편을 추가하므로 굳이 이렇게 특성을 만들 필요가 없다. include_bias=False로 지정하면 된다.

 

이제 이 방식으로 train_input에 적용해보겠다. 변환한 데이터를 train_poly에 저장하고 이 배열의 크기를 확인해본다.


 

 

 

이제 변환된 특성을 사용하여 다중 회귀 모델을 훈련해보겠다.


 

 

 

 

먼저 사이킷런의 LinearRegression 클래스를 임포트하고 앞서 만든 train_poly를 사용해 모델을 훈련시킨다. 점수가 아주 높게 나왔다. 농어의 길이뿐 아니라 높이와 두께를 모두 사용했고 각 특성을 제곱하거나 서로 곱해서 다항 특성을 더 추가했다. 이렇게 특성이 늘어나면 선형 회귀의 능력은 매우 강하다는 것을 알 수 있다.

 

테스트 세트에 대한 점수는 높아지지 않았지만, 농어의 길이만 사용했을 때 있던 과소적합 문제는 더 이상 나타나지 않았다. 특성을 더 많이 추가하면 어떻게 될까? 5제곱까지 특성을 만들어 출력해보겠다.


 

 

 

훈련 세트는 거의 완벽한 점수가 출력되었지만, 테스트 세트의 점수는 음수가 나왔다. 특성의 개수를 크게 늘리면 선형 모델은 아주 강력해진다. 훈련 세트에 대해 거의 완벽하게 학습할 수 있지만 이런 모델은 훈련세트에 너무 과대적합된다. 따라서 테스트 세트에서는 형편없는 점수를 만든다. 이 문제를 해결하기 위해 특성을 줄어보겠다.


 

 

 

 

선형 회귀 모델에 규제를 추가한 모델을 릿지 라쏘라고 부른다. 두 모델은 규제를 가하는 방법이 다르다. 릿지는 계수를 제곱한 값을 기준으로, 라쏘는 계수의 절대값을 기준으로 규제를 적용한다. 두 알고리즘 모두 계수의 크기를 줄이지만 라쏘는 아예 0으로 만들 수도 있다.


 

 

 

 

선형 회귀에서는 거의 완벽에 가까웠던 점수가 조금 낮아졌다. 테스트 세트에 대한 점수도 정상으로 돌아왔다. 확실히 많은 특성을 사용했음에도 불구하고 훈련 세트에 너무 과대적합되지 않아 테스트 세트에서도 좋은 성능을 내고 있다.

릿지와 라쏘 메델을 사용할 때 규제의 양을 임의로 조절할 수 있다. 모델 객체를 만들 때 alpha 매개변수로 규제의 강도를 조절한다. alpha 값이 크면 규제 강도가 세지므로 계수 값을 더 줄이고 조금 더 과소적합 되도록 유도한다. alpha 값이 작으면 계수를 줄이는 역할이 줄어들고 선형 회귀 모델과 유사해지므로 과대적합될 가능성이 크다.

 

적절한 alpha 각을 찾는 한 가지 방법은 alpha 값에 대한 R² 값의 그래프를 그려보는 것이다. 훈련 세트와 테스트 세트의 점수가 가장 가까운 지점이 최적의 alpha 값이 된다.


 

 

 

 

처음 공부할 때 이 그래프가 그려지지 않아서 별 방법을 다 사용하며 길이도 측정하고 코드를 수정했었다. 근데 코랩으로 하니 이렇게 잘 된다. 머신러닝과 딥러닝을 할 때는 주피터 노트북보다는 코랩을 사용해야 한다는 걸 알게 되었다.


 

 

 

 

alpha 값을 0.001에서 100까지 10배씩 늘려가며 릿지 회귀 모델을 훈련한 다음 훈련 세트와 테스트 세트의 점수를 리스트에 저장했다. 그래프는 alpha 값을 0.0004부터 10배씩 늘렸기 때문에 이대로 그래프를 그리면 그래프 왼쪽이 너무 촘촘해진다. 

그렇기에 alpha_list에 있는 6개의 값을 동일한 간격으로 나타내기 위해 로그 함수로 바꾸어 지수로 표현했다. 그래프에서 위는 훈련세트, 아래는 테스트 세트이다. 이 그래프 왼쪽을 보면 훈련 세트와 테스트 세트의 점수 차가 아주 크다. 훈련 세트에는 잘 맞고 테스트 세트에는 형편없는 과대적합의 전형적인 모습이다. 반대로 오른쪽은 훈련 세트와 테스트 세트의 점수고 모두 낮아지는 과소적합으로 가는 모습을 보인다.

이번에는 라쏘 모델을 훈련해보겠다.


 

 

 

 

 테스트 세트의 점수도 릿지만큼 아주 좋다. 라쏘 모델도 alpha 매개변수로 규제의 강도를 조절할 수 있다. 여기서도 alpha 값을 바꾸어가며 훈련 세트와 테스트 세트에 대한 점수를 계산해보겠다.


 

 

 

 

라쏘 모델을 훈련할 때 ConvergenceWarnig이라는 경고가 발생할 수 있다. 사이킷런의 라쏘 모델은 최적의 계수를 찾기 위해 반복적인 계산을 수행하는데, 지정한 반복 횟수가 부족할 때 이런 경고가 발생한다. 이 반복 횟수를 충분히 늘리기 위해 max_iter 매개변수를 10000으로 지정했다. 필요하다면 더 늘릴 수 있지만 이 문제에서는 큰 영향을 미치지 않는다.

 

이제 train_score와 test_score 리스트를 사용해 그래프를 그려본다.

 

 

 

 

이 그래프도 왼쪽은 과대적합을 보여주고 있고, 오른쪽으로 갈수록 훈련 세트와 테스트 세트의 점수가 좁혀지고 있다. 가장 오른쪽은 점수가 크게 떨어진다. 이 지점은 분명 과소적합되는 모델이다.

라쏘 모델에서의 최적의 alpha 값은 1, 즉 10이다. 이 값으로 다시 모델을 훈련해보겠다.


 

 

 

 

과대적합을 잘 억제하고 테스트 세트의 성능도 크게 높임을 볼 수 있다. 앞에서 라쏘 모델은 계수 값을 아예 0으로 만들 수 있다고 이야기했었다. 라쏘 모델의 계수는 coef_ 속성에 저장되어 있다. 이 중에 0인 것을 헤아려 보겠다.

 

 

 

 

55개의 특성을 모델에 주입했지만 라쏘 모델이 사용한 특성은 15개(55 - 40)밖에 되지 않는다. 이런 특성 때문에 라쏘 모델을 유용한 특성을 골라내는 용도로 사용할 수 있다.

이제 규제를 적용한 선형 모델을 사용해 농어의 무게를 잘 예측할 수 있게 되었다.

 


 

 

학습을 마치고

이번 시간에는 다중 회귀 모델에 대해서 학습해보았다. 그중에서 릿지 회귀와 라쏘 회귀를 살펴보며 훈련시켜보았다. 최적의 alpha 값을 찾는 방법도 배울 수 있었는데 전에 학습할 때는 하나도 이해하지 못하고 넘어갔던 내용이었다. 오늘 다시 학습해보니 정말 이해가 잘 된다.