핵심 키워드
- #다중 회귀 #특성 공학 #릿지 #라쏘 #하이퍼파라미터
- 여러 특성을 사용한 다중 회귀에 대해 배우고 사이킷런의 여러 도구를 사용해보고
복잡한 모델의 과대적합을 막기 위한 릿지와 라쏘 회귀를 배우자
다중 회귀
- 다중 회귀
여러 개의 특성을 사용한 선형 회귀를 다중 회귀라고 부름
1개의 특성을 사용했을 때 선형 회귀 모델이 학습하는 것은 직선이지만, 2개의 특성을 사용하면 선형 회귀는 평면을 학습
특성이 2개이면 타깃값과 함께 3차원 공간을 형성하고 선형 회귀 방정식 '타깃 = a * 특성1 + b * 특성2 + 절편'은 평면이 됨
그러므로 농어의 길이뿐만 아니라 농어의 높이와 두께도 함께 사용하도록 하며
3개의 특성을 각각 제곱하여 추가하고 각 특성을 서로 곱해서 또 다른 특성을 만들도록 함
이렇게 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업을 특성 공학이라고 부름
이를 위해 직접 특성을 제곱하고 곱해서 새로운 특성을 추가할 수도 있지만 사이킷런에서 제공하는 편리한 도구를 사용하도록 함
데이터 준비
- 판다스로 데이터 준비
판다스는 유명한 데이터 분석 라이브러리이며, 데이터프레임은 판다스의 핵심 데이터 구조
판다스는 다차원 배열을 다룰 수 있으며 넘파이 배열보다 훨씬 더 많은 기능을 제공하고
데이터프레임은 넘파이 배열로 쉽게 바꿀 수 있음
판다스를 사용해 농어 데이터인 CSV 파일을 인터넷에서 내려받아 데이터프레임에 저장한 후,
넘파이 배열로 변환하여 선형 회귀 모델을 훈련해보도록 함
타깃 데이터는 이전과 동일한 방식으로 준비
그 후 perch_full과 perch_weight를 훈련 세트와 테스트 세트로 나누어 새로운 특성을 만들도록 데이터를 준비함
사이킷런의 변환기
- 다항 특성 만들기
특성을 만들거나 전처리하기 위한 다양한 클래스 중 변환기 클래스를 사용
변환기 클래스는 fit(), transform() 메소드를 제공하며 우리가 사용할 변환기는 PolynomialFeatures 클래스
예) 2개의 특성 2와 3으로 이루어진 샘플 하나를 적용할 경우
이 클래스의 객체를 만든 다음 fit(), transform() 메소드를 차례대로 호출하여
fit() 메소드로 새롭게 만들 특성 조합을 찾고 transform() 메소드로 실제 데이터를 변환하도록 함
그리하여 2개의 특성(원소)을 가진 샘플 [2, 3]이 6개의 특성을 가진 샘플 [1, 2, 3, 4, 6 ,9]로 바뀌게 됨
PolynomialFeatures 클래스는 기본적으로 각 특성을 제곱한 항을 추가하고 특성끼리 서로 곱한 항을 추가함
그러므로 2와 3을 각기 제곱한 4와 9가 추가되었고, 2와 3을 곱한 6이 추가되었음
또한 1의 경우 절편을 위한 가상의 특성으로 선형 방정식의 절편을 항상 값이 1인 특성과 곱해지는 계수라고 볼 수 있음
하지만 사이킷런의 선형 모델은 자동으로 절편을 추가하므로 이렇게 특성을 만들 필요 없으므로 include_bias=False로 설정
이를 통해 절편을 위한 항이 제거되고 특성의 제곱과 특성끼리 곱한 항만 추가되도록 train_input에 적용
그리고 train_input을 변환한 데이터를 train_poly에 저장하고 이 배열의 크기를 확인하면 42개의 샘플과 9개의 특성 확인 가능
PolynomialFeatures 클래스는 9개의 특성이 어떻게 만들어졌는지 확인하는 get_feature_names_out() 메소드를 제공
그러므로 0개의 특성이 각각 어떤 입력의 조합으로 만들어졌는지 알려줌
이 후 훈련 세트를 기준으로 테스트 세트를 변환
+) LinearRegression 같은 사이킷런의 모델 클래스는 추정기라고도 부름
+) fit() 메소드와 transform() 메소드를 하나로 붙인 fit_transform() 메소드도 존재
다중 회귀 모델 훈련하기
- LinearRegression
LinearRegression 클래스를 임포트하고 변환된 특성을 사용하여 모델을 훈련하면
아주 높은 점수가 나오며 농어의 길이 뿐만 아니라 높이와 두께를 모두 사용했고
각 특성을 제곱하거나 서로 곱해서 다항 특성을 더 추가했으므로 특성이 늘어나면 선형 회귀의 능력은 매우 강해짐
테스트 세트에 대한 점수는 높아지지 않았지만 농어의 길이만 사용했을 때 있던 과소적합 문제는 더이상 나타나지 않음
- 더 많은 특성 만들기
테스트 세트의 점수를 더 높이기 위해 특성을 더 많이 추가
PolynomialFeatures 클래스의 degree 매개변수를 사용하여 필요한 고차항의 최대 차수를 지정해 특성을 더 많이 추가
5제곱까지 특성을 만들어 출력할 경우 55개의 특성이 만들어지므로 이 데이터를 사용해 선형 회귀 모델을 다시 훈련
훈련 세트에 대한 점수는 거의 완벽한 점수지만 테스트 세트에 대한 점수는 아주 큰 음수이므로
특성의 개수를 크게 늘리면 선형 모델은 아주 강력해서 훈련 세트에 대해 거의 완벽하게 학습하지만
이런 모델은 훈련 세트와 테스트 세트의 점수가 너무 차이나 훈련 세트에 너무 과대적합되므로 테스트 세트에서는 형편 없음
이 문제를 해결하려면 다시 특성을 줄여야 함
규제
- 규제 전에 표준화
규제는 모델이 훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 것을 뜻하며, 모델이 훈련 세트에 과대적합되지 않도록 함
앞서 55개의 특성으로 훈련한 선형 회귀 모델의 계수를 규제해 훈련 세트의 점수를 낮추고 대신 테스트 세트의 점수를 높여야 함
그 전에 특성의 스케일이 정규화되지 않으면 여기에 곱해지는 계수 값도 차이가 나게 되므로
규제를 적용할 때 계수 값의 크기가 서로 많이 다르면 공정하게 제어되지 않으므로 규제를 적용하기 전에 먼저 정규화를 해야 함
즉, 특성의 스케일링 비슷해져야 특성에 곱해지는 기울기도 비슷해지므로 정규화를 해야 함
앞에서는 평균과 표준편차를 직접 구해 특성을 표준점수로 바꾸었지만 이번에는 StandardScaler 클래스를 사용
StandardScaler 클래스의 객체를 초기화한 후 PolynomialFeature 클래스로 만든 train_poly를 사용해 객체를 훈련
또한 훈련 세트로 학습한 변환기를 사용해 테스트 세트까지 변환하여 표준점수로 변환한 train_scaled와 test_scaled를 준비
그 후 선형 회귀 모델에 규제를 추가한 모델인 릿지와 라쏘를 사용하여
가중치가 높으면 벌칙을 받도록 하여 가중치를 줄여 테스트 세트에서도 높은 점수가 나오도록 해야 함
릿지 회귀
- 릿지 회귀
선형 회귀 모델에 규제를 추가한 모델인 릿지(L2 규제)는 계수(가중치)를 제곱한 값을 기준으로 규제를 적용
Ridge 모델 객체를 만들고 fit() 메소드에서 훈련한 다음 score() 메소드로 평가하면
훈련 세트의 경우 거의 완벽에 가까웠던 점수가 조금 낮아지며, 테스트 세트의 경우 정상으로 돌아오게 됨
확실히 많은 특성을 사용했음에도 불구하고 훈련 세트에 너무 과대적합되지 않아 테스트 세트에서도 좋은 성능을 내게 됨
- 적절한 규제 강도 찾기
릿지 모델을 사용할 때 모델 객체의 alpha 매개변수로 규제의 양을 임의로 조절할 수 있음
alpha 값의 기본값은 1이며, alpha 값이 크면 규제 강도가 세지므로 계수 값을 더 줄이고 조금 더 과소적합될 수 있도록 유도
alpha 값이 작으면 계수를 줄이는 역할이 줄어들고 선형 회귀 모델과 유사해지므로 과대적합될 가능성이 큼
적절한 alpha 값을 찾는 한 가지 방법은 alpha 값에 대한 R² 값의 그래프를 그려보는 것이므로
alpha 값을 바꿀 때마다 score() 메소드의 결과를 저장할 리스트를 만들고
alpha 값을 0.001에서 100까지 10배씩 늘려가며 릿지 회귀 모델을 훈련하고 훈련 세트와 테스트 세트의 점수를 리스트에 저장
그 후 이를 가지고 그래프를 그려보도록 함
이때 alpha 값을 0.001부터 10배씩 늘렸기 때문에 이대로 그래프를 그리면 그래프 왼쪽이 너무 촘촘해지므로
alpha_list에 있는 6개의 값을 동일한 간격으로 나타내기 위해 상용 로그 함수로 바꾸어 지수로 표현
그래프의 왼쪽을 보면 훈련 세트와 테스트 세트의 점수 차이가 아주 크므로
훈련 세트에는 잘 맞고 테스트 세트에서 형편없는 과대적합의 모습을 보임
즉, 규제를 안 하면 훈련 세트에만 아주 잘 맞는 과대적합이 발생
그래프의 오른쪽을 보면 훈련 세트와 테스트 세트의 점수가 모두 낮아지는 과소적합의 모습을 보임
즉, 규제가 세지므로 훈련 세트의 점수도 낮아지고 테스트 세트의 점수는 더 낮아져 과소적합이 발생
그러므로 적절한 alpha의 값은 두 그래프가 가장 가깝고 테스트 세트의 점수가 가장 높은 -1, 즉 0.1이므로
alpha 값을 0.1로 하여 최종 모델을 훈련
+) alpha 값은 릿지 모델이 학습하는 것이 아니라 사전에 우리가 지정해야 하는 값이므로 하이퍼파라미터라고 부름
라쏘 회귀
- 라쏘 회귀
선형 회귀 모델에 규제를 추가한 모델인 라쏘(L1 규제)는 계수(가중치)의 절댓값을 기준으로 규제를 적용
라쏘 모델을 훈련하는 것은 릿지와 비슷하므로 Lasso 모델 객체를 만들고 fit() 메소드에서 훈련한 다음 score() 메소드로 평가
라쏘도 과대적합을 잘 억제한 결과를 보여주며 테스트 세트의 점수도 릿지만큼 아주 좋음
- 적절한 규제 강도 찾기
라쏘 모델도 alpha 매개변수로 규제의 강도를 조절할 수 있으므로 값을 바꾸어 가며 훈련 세트와 테스트 세트에 대한 점수를 계산
그 이후 리스트를 사용해 그래프를 그림
그래프의 왼쪽을 보면 과대적합을 보여주고 있고, 오른쪽으로 갈수록 훈련 세트와 테스트 세트의 점수가 좁혀지며
가장 오른쪽은 아주 크게 점수가 떨어지므로 이 지점은 과소적합되는 모델
그러므로 적절한 alpha의 값은 1, 즉 1-이므로 alpha 값을 10으로 하여 최종 모델을 훈련
라쏘 모델이 과대적합을 잘 억제하고 테스트 세트의 성능을 크게 높임을 볼 수 있음
또한 라쏘 모델은 일부 특성을 완전히 사용하지 않아 계수(가중치) 값을 아예 0으로 할 수 있음
라쏘 모델의 계수는 coef_ 속성에 저장되어 있으므로 속성으로 어떤 특성을 사용하지 않는지 알 수 있어
유용한 특성을 골라내는 용도로도 라쏘 모델을 사용할 수 있음
이를 통해 확인해보면 55개의 특성을 모델에 주입했지만 라쏘 모델이 사용한 특성은 15애 밖에 되지 않음을 알 수 있음
'ML > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼공머신] 04. 다양한 분류 알고리즘 - 확률적 경사 하강법 (0) | 2022.05.24 |
---|---|
[혼공머신] 04. 다양한 분류 알고리즘 - 로지스틱 회귀 (0) | 2022.05.24 |
[혼공머신] 03. 회귀 알고리즘과 모델 규제 - 선형 회귀 (0) | 2022.05.16 |
[혼공머신] 03. 회귀 알고리즘과 모델 규제 - k-최근접 이웃 회귀 (0) | 2022.05.15 |
[혼공머신] 02. 데이터 다루기 - 데이터 전처리 (0) | 2022.05.12 |