한빛미디어 도서 <혼자 공부하는 머신러닝+딥러닝>의 전개를 따른 내용이다.
이번에 다룰 내용은 "여러가지 선형 회귀 알고리즘"이다.
특히 k-최근접 이웃 알고리즘 vs 선형회귀알고리즘은 어떤 차이가 있는지 비교해보자.
챕터 3, 회귀 알고리즘과 모델 규제
| 다양한 선형 회귀 알고리즘
* 지도 학습 알고리즘의 한 종류인 회귀 알고리즘 배우기
* 다양한 선형 회귀 알고리즘의 장단점 이해하기
지금까지는 k-최근접이웃 알고리즘만 접했는데,
다른 알고리즘도 살펴보자.
특히 k-최근접이웃 알고리즘과는 다르게 선형적인 특징 파악해내는 선형 회귀 알고리즘을 공부하자.
( 이름에서도 알 수 있다. k-최근접이웃 알고리즘은 최근접 이웃을 기반으로 예측값을 내놓지만, 선형 회귀 알고리즘은 데이터의 선형적인 특성을 기반으로 예측한다. )
# k-최근접이웃 회귀 모델로 예측할 때 주의점
먼저 말하자면, 선형적인 데이터에는 k-최근접이웃 회귀모델이 부적합하다.
선형회귀모델을 사용해야 한다.
이웃 데이터를 기반으로 값을 예측하기 때문에, 만얀 샘플데이터가 이웃데이터와 동떨어져있다면 예측변수와 반응변수가 선형적인 관계임에도 불구하고 한정적인 값만 예측할 수밖에 없다.
왜 k-최근접이웃 회귀모델은 선형 데이터 값 예측에 부적절할까?
그 이면을 직접 확인해보자!
(데이터 준비하기, train/test set 나누기 과정은 생략! 계속 중복되는 내용이다.)
①
k-최근접이웃 회귀 모델 (knr)을 이용해서 length 50의 농어 weight를 예측해보았다.
아래와 같이 1033정도의 weight를 가진다고 예측했다.
그러나! 실제 무게는 훨씬 더 나간다고 한다.
이런 문제는 k-최근접이웃 회귀 모델이 "최근접이웃" 기반 평균치를 예측값으로 삼기 때문이다.
②
그럼 최근접이웃 알고리즘이 어떻게 이런 예측을 내놓았는지 좀 더 자세히 보자.
③
분명 위 데이터는 length-weight의 선형적 관계가 있는데, k-최근접이웃 회귀모델은 선형 회귀모델이 아니기 떄문에, 애초에 데이터들의 선형적 관계를 기반으로 예측할 수가 없다.
즉, 단지 length 50인 농어의 최근접 이웃 데이터가 고작 length 45인 농어 3개이기 때문에 그것들의 평균 weight를 예측값으로 내놓을 수밖에 없었던 것이다.
( 무게 50인데 억울하게~~~~!!! ㅠㅅ ㅠ )
그래서 선형적인 데이터에는 "선형 회귀" 모델을 적용해야 한다.
오늘 핵심 내용이 바로 이 "선형 회귀"!!
# 선형 회귀 (linear regression)
선형 회귀 알고리즘을 구현해놓은 클래스는 사이킷런 패키지에 LinearRegression 클래스로 존재한다.
그럼 이제 LinearRegression 객체에다가 fit()으로 훈련시키고 score()로 모델을 평가해보자.
-> 사이킷런의 모델 클래스에는 일관적으로 fit(), score(), predict() 메서드가 존재함
이제서야 length-weight 변수의 선형적인 특성을 반영하여 예측했다!
length 50인 농어의 weight를 예측한 결과가 1241이다~~!
아까 최근접이웃 회귀모델에서는 1033 weight밖에 안나왔는데! >_<
++ 선형 회귀 직선식
LinearRegression클래스가 선형관계를 파악하여 예측값을 내놓기 위해서,
즉 선형적인 특성을 가장 잘 보여주는 직선식을 찾기 위해서,
내부적으로 '최적의 모델 파라미터'인 coef_와 intercept_를 계산한다.
기울기 = coefficient(계수) = weight(가중치)
+ (이렇게 '최적의 모델 파라미터'를 찾는 것을 "모델 기반 학습"이라 한다. 반면 k-최근접이웃 알고리즘을 학습할 때는 단지 input data와 target data를 저장하는 것이 훈련의 전부였는데, 이것은 "사례 기반 학습"이다. )
실습 데이터에서 LinearRegression 클래스가 파악한 직선식을 확인해보자.
그리고 아까 선형회귀모델로 예측한 50cm, 1241.8g 농어 위치도 찍어보자.
train set 데이터의 범위를 벗어난 50cm 농어의 데이터라도, 이 최적의 직선식에 기반하여 weight를 예측할 수 있음을 확인할 수 있다.
.
.
원하는 대로 나왔다고 해서 간과하지 말 것!
# 과대적합/과소적합 되었는지 확인하기
train set과 test set의 score()값 (R^2값) 대소를 비교하여, 잘 적합되었는지 확인해야함을 잊지 말자.
확인해보면, train set의 R^2값이 test set의 R^2값보다 꽤 차이가 나게 크다.
그치만 과대적합되었다고 말하기에는 또.. train set의 R^2 자체도 그다지 높지는 않다.
두 값이 너무 낮다. 전체적으로 훈련이 덜 된 느낌이랄까?!
왜 훈련이 덜 된 느낌이 날까?
사실 아래 산점도는 그냥 딱 보면 직선식보다는 사알짝 곡선 느낌이 난다.
(사실 이 직선식대로 예측하면, length가 작은 경우들에 대해 weight가 너무 음수쪽으로 뻗어있어서 직선식은 흠좀무!!)
어 그러면 예측을 직선으로 하지 말고 곡선으로 하면 더 잘 적합되지 않나? 싶다.
# 데이터를 더 잘 설명하는 곡선식을 그려보자
위 산점도의 점들을 지나는 이차곡선을 그려보자.
ax^2 + bx + c이기 떄문에 이차항 계수 a를 도출하려면 데이터(x값)의 제곱값이 필요하다.
그럼 이제 train_poly와 test_poly에는 length^2 column과 length column이 존재한다.
train_poly로 다시 LinearRegression을 훈련해보자.
이 선형회귀 모델은 이차식을 학습한 셈이다. 이차식은 length^2와 length의 선형식이다.
이렇게 다항식을 적용한 선형 회귀를 특별히 다항 회귀(polynomial regression)이라고 부른다.
그럼 이차곡선을 그려보자
++ 아래 주석에 보면 의문점이라고해서 그냥 곡선을 그리는 기능은 없는지 의아해하며 진행했다. 그런데 가만히 생각해보면 수치프로그래밍 과목에서 matlab으로 실습할 때도 어떤 그래프를 그릴 때 항상 점을 잘게 쪼개서 잇는 방식으로 모든 그래프를 그렸다. 그 느낌을 떠오르니까 더이상 의아하지는 않았다... 갑자기 당연스럽게 느껴지는 이건 모지 ㅡ.ㅡ;
이제는 train 데이터의 곡선형태 분포를 잘 나타낸다.
이 곡선을 기반으로 R^2 값을 확인해보자
이전보다 R^2가 꽤 높아졌다.
다만 train set의 R^2가 test set의 R^2보다 작으므로 과소적합이 보인다.
과소적합을 없애기 위해서 모델을 좀 더 복잡하게 만들어야 할 필요가 있다.
# 이번 내용 정리
- 분포가 선형적인 데이터에는 선형회귀모델을 사용해야 한다.
k-최근접 회귀 모델은 그저 이웃데이터의 평균치를 사용하기에 선형적인 관계를 전혀 이해하지 못한다.
- 사이킷런의 LinearRegression 클래스를 훈련시켜 선형관계를 파악시킬 수 있었다. 내부적으로 계수와 절편을 계산하여 회귀직선식을 얻었다.
- 다만 직선식은 데이터의 섬세한 특성을 잘 반영하지 못할 수 있다. 그래서 조금 더 데이터의 분포를 잘 설명하는 이차곡선도 그려보았다. 그 결과, R^2를 높일 수 있었다.
- 복잡합 모델을 만들어 과소적합을 피해볼 것이다. 또한 너무 복잡하여 과대적합될 경우에는 어떻게 대처해야 할지도 공부할 예정이다.
이전 글:
머신러닝 | 회귀 모델 (+ knr) | 과소적합, 과대적합
다음 글:
'데이터분석과 머신러닝' 카테고리의 다른 글
머신러닝 | 특성 수를 늘려 과소적합 피하기 - 다중회귀와 특성 공학 (2) | 2022.01.23 |
---|---|
혼공단 7기 2주차 미션인증 (0) | 2022.01.23 |
머신러닝 | 회귀 모델 (+ knr) | 과소적합, 과대적합 (0) | 2022.01.21 |
혼공단7기 1주차 미션인증 (0) | 2022.01.13 |
머신러닝 | 데이터 전처리 | 스케일 조정, 표준화하여 전처리 | 표준점수로 변환 (0) | 2022.01.12 |