03-1 K-최근접 이웃 회귀
지도 학습 알고리즘 종류
1. 분류 - 0인지 1인지, 도미인지 빙어인지
2. 회귀 - 임의의 어떤 숫자를 예측, 내년도 경제 성장률, 농어의 무게
K-최근접 이웃 회귀도 어렵게 생각하지 않아도 된다.
60, 80, 100의 이웃을 가진 k를 예측하려면 그냥 평균내면 된다 = 80
여기서는 농어의 길이만 가지고 무게를 예측할 수 있을 것 같아서 해보려고 한다.
파이썬에서는 1차원 배열의 크기는 원소가 1개인 튜플로 나타냅니다. 예를 들어 [1, 2, 3]의 크기는 (3, )입니다.
이를 2차원 배열로 억지로 바꾸려고 하나의 열을 추가했습니다. 그러면 배열의 크기가 (3, 1)이 됩니다.
[1, 2, 3] -> [[1], [2], [3]]
2장에서는 특성이 [길이, 무게]로 자연스럽게 2차원 배열이 되었지만 여기서는 훈련에 길이만 쓰이고 target에 무게만 쓰이기 때문에 (3, ) 이런 식으로 1차원 튜플이 나오니 조심해야 합니다.
이를 구현하려면 Numpy의 reshape 메서드를 사용하면 됩니다.
(원본 크기 확인하고 개수에 주의하시오 신경 쓰고 싶지 않다면 reshape(-1, 1)로 하면 됩니다.)
결정 계수
결정 계수란 분류에서는 테스트 셋에 있는 데이터의 정답을 정확하게 분류한 비율을 정확도라고 부른다.
회귀에서는 이를 결정 계수라고 부른다.
만약 타깃이 평균정도를 예측하는 뻔한 수준이면 (분자와 분보가 비슷해지면) 0에 가까워지고
타깃이 예측에 아주 가까워지면 (분모가 0에 가까워져서) 1에 가까운 값이 된다.
높을수록 좋은 값
과대적합(Overfitting) vs 과소적합(Underfitting)
과대적합: 훈련데이터를 너무 잘 공부한 나머지 훈련데이터만 잘 맞추고 테스트 데이터를 잘 못 맞추는 경우
과소적합: 훈련데이터조차 공부를 똑바로 못해서 그냥 모델이 모자람 ex) 보통 훈련데이터의 크기가 너무 작으면 발생
n_neighbors에서 k의 수를 작게 하면 모델이 복잡해지고 하나하나 다 맞추려고 그래프가 많이 꺾이는 양상이 보이고 k를 너무 크게 하면 모델이 너무 단순해진다. 그래서 적절하게 골라서 학습해야 한다.
확인문제
1.②
2.n, knr.predict(x)
03-2 선형 회귀
최근접 회귀의 단점이 있다.
만약 테스트 할 때 훈련 데이터의 범위보다 넘어가버리면
예를 들어 k = 5일 때 제일 길이가 긴 농어의 무게의 평균이 1033이고 훈련 데이터 중 가장 길이가 긴 농어의 길이가 45cm일 때 45cm, 46cm, 50cm, 100cm 모두 다 1033g으로 예측할 것입니다.
이를 보완하기 위해 선형회귀를 사용하는 것입니다. 혹은 이를 해결하기 위해서는 100cm짜리 농어의 무게를 다시 모델에게 학습시키는 방법이 있지만 귀찮습니다.
원래는 머신러닝의 모델을 주기적으로 학습을 진행해야 합니다. 바뀌어가는 데이터를 계속해서 학습해 주어야만 성능과 정확도가 유지되는 것입니다.
우리의 데이터 위에 하나의 직선을 그리고 싶습니다.
농어 데이 터니까 y = ax + b의 형태로 바꿀 때
농어의 무게 = a * 농어의 길이 + b의 방정식이 만들어집니다.
여기서 a와 b의 값은 LinearRegression 클래스가 친절하게 찾아줍니다.
기울기 = 계수
lr.coef_, lr.intercept_ = a, b
선형 회귀는 특성과 타깃 사이의 관계를 가장 잘 나타내는 선형 방정식을 찾는 것입니다. 특성이 하나면 직선 방정식
다항 회귀
다항 회귀는 다항식을 사용하여 특성과 타깃 사이의 관계를 나타내는 것. 비선형 가능 선형도 가능
여기서는 농어의 길이를 제곱해서 앞에 붙여서 특성을 두 개로 만들겠습니다.
일차 방정식이 아니라 이차 방정식을 구한 것과 같습니다.
이 모델이 학습한 방정식은
무게 = 1.01 * 길이^2 -21.6 * 길이 + 116.05입니다.
2차 방정식인데 비선형인데 왜 선형회귀인가요?
- 길이^2와 길이 사이의 선형 관계를 표현한 것이라고 보면 됩니다.
결국 선형회귀와 다항 회귀를 사용하는 이유는 K-최근접 이웃 회귀를 사용할 때 예측할 수 없던 훈련데이터 범위 밖의 입력 데이터를 예측하고 싶기 때문에 사용하는 것입니다.
확인문제
1.④
2.①
03-3 특성 공학과 규제
사이킷런은 변환기 transformer를 가지고 있습니다. 이는 특성을 만들거나 전처리하기 위한 클래스입니다.
특성을 너무 많이 늘리다 보면 훈련데이터에 대한 거의 완벽한 학습을 할 수 있습니다. 하지만 이는 곧 과대적합으로 이어지는 지름길입니다.
특성이 많으면 모델의 성능이 좋아지는 것은 맞지만 너무 늘어난 특성은 오히려 성능을 낮춥니다.
42개의 샘플을 55개의 특성으로 학습한다면
= 42마리의 참새를 맞추기 위해 55개의 총알을 발사한다면?
모델은 한 번의 총알을 잘 맞추려면 어디를 쏴야 하는가를 학습하는 것인데 총알을 55개나 줘버리면 훈련데이터에 과대적합 되어버리는 것입니다.
규제
regularaization은 과대적합을 훼방 놓는 역할입니다.
챕터 2에서 정규화를 사용하여 표준점수로 바꾸는 일을 했지만 StandardScaler라는 편한 클래스를 만들어 놓았으니 사용하겠습니다. 동작은 동일하고 주의해야 할 점은 이전과 동일하게 훈련세트로 학습한 변환기를 사용해 테스트 세트까지 변환해야 합니다.
선형회귀 모델에 규제를 추가한 것을 릿지와 라쏘라고 합니다.
릿지는 계수를 제곱한 값으로 규제를 적용하고
라쏘는 계수의 절댓값을 기준으로 규제를 합니다.
릿지와 라쏘는 alpha값으로 규제의 정도를 조절할 수 있습니다.
적절한 alpha값은 그래프를 그려서 알 수 있습니다.
추가로 alpha값은 사람이 직접 입력해야 합니다.
alpha값을 작은 값부터 큰 값까지 바꿔가며 R^2의 값을 구해본 결과 아래의 테스트 세트의 그래프와 위의 훈련 세트의 그래프가 가장 가까운 지점인 -1이 적절한 것 같습니다.
라쏘는 그냥 ridge -> lasso로 바꾸기만 하면 됩니다.
확인문제
1.④
2.③
3.②
나의 코드
'AI > AID' 카테고리의 다른 글
[혼공 머신] 혼자 공부하는 머신러닝 정리하기 - Chapter 05 (1) | 2024.11.05 |
---|---|
[혼공 머신] 혼자 공부하는 머신러닝 정리하기 - Chapter 04 (5) | 2024.10.29 |
[혼공 머신] 혼자 공부하는 머신러닝 정리하기 - Chapter 02 (2) | 2024.10.04 |
[혼공 머신] 혼자 공부하는 머신러닝 정리하기 - Chapter 01 (7) | 2024.09.27 |
[혼공 머신] 혼자 공부하는 머신러닝 정리하기 - Chapter 00 (6) | 2024.09.27 |