
회귀란 임의의 어떤 숫자를 예측하는 문제이다. k-최근접 이웃 회귀는 예측하는 샘플에 가장 가까운 k개의 샘플을 선택해 샘플의 수치를 사용해 예측하려는 샘플의 타깃을 예측하는 것이다. 그것의 예시로 농어의 무게를 예측하는 모델을 만드려고 한다.
데이터를 입력하고 x축을 길이, y축을 무게로 하는 그래프를 만든다.
perch_length가 1차원 배열이기에 train_input, test_input 또한 1차원 배열이다. 일반적으로 회귀에선 stratify를 사용하지 않는다.
train_input과 test_input은 1차원 배열로 되어있고 배열에서 보통 행을 샘플, 열을 특성으로 하는데 이 1차원 배열에선 반대로 되어 있기 때문에 이를 바꾸기 위해 reshape함수를 사용하는데 순서대로 행과 열의 개수를 입력하면 된다. 여기서 -1은 1개의 열을 만들고 나머지 원소 개수들로 행을 채우라는 의미가 된다. 만약 [1,2,3]인 배열을 reshape(-1, 1)을 하면 [[1],[2],[3]]이 된다.
KNeighborsRegressor함수를 불러오고 모델을 훈련시키고 정확도를 검사해보니 0.99가 나왔다.
분류에선 샘플을 정확하게 분류한 개수의 비율인데 회귀에선 결정계수이다. 결정계수(R^2)는 1-(타깃 - 예측)^2의 합 / (타깃 - 평균)^2의 합이다. 결정계수가 높으면 예측이 타깃과 비슷하다는 뜻이고 결정계수가 낮으면 예측이 평균에 비슷하여 안좋은 모델인 것이다.
평균적으로 예측값과 타깃이 얼마나 차이가 나는지 확인하는 코드이다. mea_absolute_error함수는 평균 절댓값 오차를 나타내는 함수이고 절댓값이기에 어떤 값이 큰지 작은지는 나오지 않는다.
지금까지는 테스트 세트로만 평가를 했는데 훈련 세트로도 평가를 하여 비교를 해보면 테스트 세트가 클 때도 있고 테스트 세트가 작을 때도 있다. 보통 훈련 세트가 테스트 세트보다 조금 더 좋은 점수가 나온다. 만약 훈련 세트의 점수는 매우 좋은데 테스트 세트는 굉장히 점수가 나쁘다면 이를 과대적합되었다고 한다. 반대로 테스트 세트의 점수가 높거나 두 점수 모두 낮은 경우에는 과소적합되었다고 한다. 과소적합은 모델이 너무 단순하여 훈련 세트에 적절히 훈련되지 않은 경우나 훈련 세트와 테스트 세트의 크기가 매우 작을 때 나타난다.
- k의 개수가 크면 과소적합
- k의 개수가 작으면 과대적합
테스트 세트와 훈련 세트의 점수를 보며 k개수를 적당한 값으로 설정해야 한다.
코드링크텍스트
k-최근접 이웃 회귀 알고리즘으로 길이가 50인 농어의 무게를 예측하려고 했는데 1033이 나왔다. 50cm인 농어의 실제 무게는 1.5kg으로 예측값과 차이가 많이 났다. 이러한 문제가 발생한 이유는 k-최근접 이웃 알고리즘은 예측하려는 샘플 주위에 있는 샘플들의 평균을 내서 값을 예측하는데 50cm인 농어 샘플에서 가장 가까운 샘플이 45cm이기에 원래 무게보다 더 작게 예측이 된 것이다. 100cm의 농어 길이를 넣어도 50cm와 같은 결과가 나오게 되는데 이를 해결할 수 있는 방법이 선형 회귀이다.
선형회귀는 대표적인 회귀 알고리즘으로, 특성을 가장 잘 나타낼 수 있는 직선을 찾는 알고리즘이다.
선형회귀 모델을 만들어 예측해보니 1241이 나왔다.
coef는 기울기를 나타내는 함수이고 intercept는 y절편을 나타내는 함수이다.
직선의 방적식은 y = a*x + b로 보통 나타내는데 여기서 a가 coef이고 b가 intercept이다.
x축은 15부터 50까지로 하고 y는 위에서 구했던 값을 이용해 시작점과 끝나는 점을 넣어준다. 그렇게 하면 그래프처럼 직선의 형태를 띄게 된다.
훈련 세트와 테스트 세트를 봤을 때 과소적합되었다고 볼 수 있고 또한 위의 그래프에서 왼쪽아래부분이 음수가 된 것을 볼 수 있다. 음수가 되지 않게 하기 위해 다항 회귀를 쓸 수 있다.

다항 회귀는 다항식을 사용한 선형 회귀를 말한다. 다항식에 쓰일 데이터로 농어의 길이를 제곱한 값을 쓴다. columnstack함수를 사용해 길이와 길이 제곱을 나란히 붙인다.
아까보다 훨씬 타깃값에 가까워진 것을 알 수 있다.
coef, intercept_로 기울기와 y절편을 구한다.
15부터 49까지 1씩 나눠져있는 배열을 선언하고 x는 point를 넣고 y는 위에 구했던 기울기와 y절편을 사용해 y를 넣는다.
테스트 세트가 약간 더 높은 결과가 나오게 된다.
코드링크텍스트
다중 회귀는 여러 개의 특성을 사용한 선형 회귀이다. 03-2에서 마지막에도 여전히 과소적합이였는데 이 문제점을 해결할 수 있는 방안이 다중 회귀이다. 또한 03-2에서 길이를 제곱하여 새로운 특성을 만들었는데 이렇게 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업을 특성 공학이라고 한다.
언어 정리
다중 회귀 : 여러 개의 특성을 사용한 선형 회귀
특성 공학 : 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업
판다스 : 유명한 데이터 분석 라이브러리
데이터프레임 : 판다스의 핵심 데이터 구조, 여러 종류의 데이터 다룰 수 있음
변환기 : 특성을 만들거나 전처리하기 위한 클래스
판다스 데이터프레임을 만들기 위해 많이 사용하는 파일인 csv파일을 읽는 방법은 판다스의 read_csv(주소)를 해주면 되고 to_numpy()메서드를 사용해 넘파이 배열로 바꾼다.
PolynomialFeatures클래스의 객체를 만들고 fit(), transform() 메서드를 차례로 호출한다. 특성 2와 3을 사용해 여러 개의 특성을 만들었다. 선형 방정식의 절편을 항상 값이 1인 특성과 곱해지는 계수라고 볼 수 있기에 1을 특성으로 볼 수 있는데 사이킷런 선형 모델은 자동으로 절편을 추가하므로 굳이 이렇게 특성을 만들 필요가 없다. include_bias=False로 지정해 절편을 위한 항을 제거한다.
PolynomialFeatures에서 degree(고차항의 최대 차수)의 기본값은 2인데 degree값을 늘려 특성을 많이 만들면 훈련 세트에는 거의 완벽하게 맞지만 테스트 세트는 거의 안맞는 것을 볼 수 있다. 이렇게 모델이 훈련 세트에 과대적합되지 않도록 하는 것이 규제이다. 규제는 선형 회귀 모델의 경우 특성에 곱해지는 계수(기울기)의 크기를 작게 만드는 일이다.
위 그림은 규제를 하기 전, 정규화를 하는 것이다. 정규화를 하지 않으면 특성의 스케일이 각각 달라 여기에 곱해지는 계수(기울기)도 달라지게 되어 공정하게 제어되지 않게 된다. 중요한 점은 훈련 세트로 학습한 변환기를 사용해 테스트 세트까지 변환해야 한다.
규제 모델
alpha매개변수로 규제의 강도를 조절한다. alpha가 크면 규제의 강도가 세진다. alpha는 직접 사람이 적당한 값을 찾아 넣어줘야 하는데 이렇게 사람이 알려줘야 하는 파라미터를 하이퍼파라미터라고 한다.
for문을 돌려 각각 값을 배열에 넣는다.
상용로그를 사용해 0.001 = -3 이런 식으로 표시한다. 그래프를 보면 0.1(-1)이 가장 적합한 것을 알 수 있다.
score값이 잘 나온 것을 볼 수 있다.
라쏘도 릿지와 유사한 방법으로 하면 되는데 라쏘는 계수 값을 아예 0으로 만들 수 있기 때문에 라쏘보단 릿지를 선호하는 편이고 라쏘 모델은 유용한 특성을 골라내는 용도로 사용할 수 있다.
코드링크텍스트