일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- C++
- 파이썬라이브러리
- html/css
- 데이터입출력구현
- 정수와유리수
- 파이썬
- 자바 실습
- 컴퓨터구조
- 머신러닝
- 컴퓨터비전
- numpy/pandas
- 운영체제
- 자바
- 데이터베이스
- CNN
- JSP/Servlet
- 중학1-1
- 데이터분석
- 연습문제
- 딥러닝
- 코딩테스트
- 혼공머신
- 영어공부
- 정보처리기사실기
- SQL
- 텍스트마이닝
- CSS
- 중학수학
- 정보처리기사필기
- pandas
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
회귀 알고리즘과 모델 규제 1 - k-최근접 이웃 회귀 1 : 회귀와 분류 모델 그리고 과대적합과 과소적합 문제 해결하기 본문
회귀 알고리즘과 모델 규제 1 - k-최근접 이웃 회귀 1 : 회귀와 분류 모델 그리고 과대적합과 과소적합 문제 해결하기
huenuri 2024. 9. 28. 12:06조금 늦은 아침을 먹고 아침 공부를 시작해 본다. 한 타임의 공부를 끝내고 다시 시작하려고 하면 언제나 하기 싫은 마음과 공부보다 더 하고 싶은 일 사이에서 많은 갈등을 한다. 조금 전에도 이러한 싸움을 하며 아까운 시간은 조금 허비하다 10시가 훌쩍 넘어 공부를 시작했다.
이번 시간에는 k-최근접 이웃 회귀 모델에 대해서 좀 더 자세히 배우게 된다. 가능하면 공부를 1시간 반 안에 빨리 끝마치고 싶다.
지난 시간 복습
학습 목표
지도 학습의 한 종류인 회귀 문제를 이해하고 k-최근접 이웃 알고리즘을 사용해 농어의 무게를 예측하는 회귀 문제 풀어보기
시작하기 전에
한빛 마켓이 농어를 무게 단위로 판매하려고 한다. 어떻게 농어의 무게를 예측할 수 있을까?
회귀의 임의의 숫자가 있을 때 주로 사용하는데 여기서 타깃값은 무게가 된다. 타깃은 0과 1로 나타낼 수 있는 수이다. 이 책에서는 문제를 간단하게 만들기 위해 높이와 두께는 측정하지 않고 길이만 이용해서 측정하게 될 것이다.
k-최근접 이웃 회귀
지도 학습 알고리즘은 크게 분류와 회귀로 나뉜다. 분류는 샘플을 몇 개의 클래스 중 하나로 분류하는 문제이다. 회귀는 클래스 중 하나로 분류하는 것이 아니라 임의의 어떤 숫자를 예측하는 문제이다.
예를 들어, 경제 성장률을 예측하거나 배달이 도착할 시간을 예측하는 것이 회귀 문제이다.
회귀라는 용어는 19세기 통계학자이자 사회학자인 프랜시스 골턴이 처음 사용했다. 그는 키가 큰 사람의 아이가 부모보다 더 크지 않다는 사실을 관찰하고 이를 '평균으로 회귀한다'라고 표현했다. 그 후 두 변수 사이의 상관관계를 분석하는 방법을 회귀라 불렀다.
최근적 이웃 모델은 분류와 회귀로 나눌 수 있다. 분류는 예측하려는 샘플에 가장 가까운 샘플 k개를 선택한다. 그 다음 이 샘플들의 클래스를 확인하여 다수 클래스를 새로운 샘플의 클래스로 예측한다. k = 3이라 가정하면 사각형이 2개로 다수이기 때문에 새로운 샘플 x의 클래스는 사각형이 된다.
회귀는 분류처럼 똑같이 예측하려는 샘플에 가장 가까운 샘플 k개를 선택한다. 하지만 회귀이기 때문에 이웃한 샘플의 타깃은 어떤 클래스가 아니라 임의의 수치이다. 이웃 샘플 수치를 사용해 새로운 샘플 x의 타깃을 예측하는 간단한 방법은 무엇이 있을까? 이 수치들의 평균을 구하면 된다. 그림에서 이웃한 샘플의 타깃값은 각각 100, 80, 60이니 이를 평균하면 샘플 x의 예측 타깃값은 80이 된다.
그럼 이에 농어 데이터를 준비하고 사이킷런을 사용해 회귀 모델을 훈련해 보겠다.
데이터 준비하기
먼저 훈련 데이터를 준비한다. 혼공머신은 농어의 길이만 있어도 무게를 잘 예측할 수 있다고 생각했다. 그럼 농어의 길이가 특성이고 무게가 타깃이 되겠다.
그런 다음 이 데이터가 어떤 형태를 띠고 있는지 산점도를 그려보았다. 하나의 특성을 사용하기 때문에 특성 데이터를 x축에 놓고 타깃 데이터를 y축에 놓는다. 분류일 때는 2개의 특성을 사용한다. 회귀는 임의의 숫자는 축에 표현하는데, 분류처럼 문자를 여러 개 사용하면 3차원 그래프가 된다. 그렇기에 대부분의 회귀 문제는 특성 하나에서 시작하는 것이 일반적이다.
그래프를 보면 농어의 길이가 커짐에 따라 무게도 늘어난다.
회귀일 때는 stritify 매개변수를 사용하지 않는다. 여기에 타깃값을 넣어주는데 회귀에서는 임의의 숫자가 타깃이 되므로 사용하지 않고 랜덤하게 훈련 세트와 테스트 세트를 섞어서 사용한다.
농어 데이터를 머신러닝 모델에 사용하기 전에 훈련 세트와 테스트 세트로 나누었다. 사이킷런에 사용할 훈련 세트는 2차원 배열이어야 하기에, perch_length를 2차원으로 바꾸어야 한다.
이때 reshape() 메서드를 사용해서 바꿀 수 있다. reshape() 메서드에는 바꾸려는 배열의 크기를 지정할 수 있다. train_input과 test_input을 2차원 배열로 바꾸어본다. train_input의 크기는 (42,)이다. 넘파이에는 배열의 크기를 자동으로 지정하는 기능도 제공한다. 크기에 -1을 지정하면 나머지 원소 개수로 모두 채운다. 두 번째 크기를 1로 하려면 이와 같이 사용한다.
결정계수(R²)
사이킷런에서 k-최근접 이웃 회귀 알고리즘을 구현한 클래스는 KNeighborsRegressor이다. 이 클래스의 사용법은 KNeighborsClassifier와 매우 비슷하다.
분류의 경우 테스트 세트에 있는 샘플을 정확하게 분류한 개수의 비율이다. 이를 정확도라고 불렀다. 다시 말해 정답을 맞힌 개수의 비율이다. 회귀에서는 정확한 숫자를 맞힌다는 것은 불가능하다. 예측하는 값이나 타깃 모두 임의의 수치이기 때문이다.
회귀의 경우에는 결정계수로 평가한다. 각 샘플의 타깃과 예측한 값의 차이를 제곱하여 더한다. 그다음 타깃과 타깃 평균의 차이를 제곱하여 더한 값으로 나눈다. 만약 타깃의 평균 정도를 예측하는 수준이라면 R²은 0에 가까워지고, 예측이 타깃에 아주 가까워지면(분자가 0에 가까워지기 때문에) 1에 가까운 값이 된다. 책과 강의를 들어도 무슨 말인지 이해가 되지 않아서 자료를 찾아보았다.
R²은 0에서 1 사이의 값을 가지며, 그 해석은 다음과 같다.
- R²이 1에 가까울 때: 모델의 예측값이 실제 타깃 값과 거의 일치함을 의미한다. 예를 들어, 분자가 0에 가까워지면 모델이 거의 완벽하게 예측하고 있다는 뜻입니다.
- R²이 0에 가까울 때: 모델이 타깃의 평균값 정도만을 예측할 수 있다는 뜻입니다. 예를 들어, 모델이 모든 예측값을 타깃의 평균값과 비슷하게 예측한다면, 분자와 분모 값이 비슷해지며 R²은 0에 가까워진다.
예시
- R² = 1에 가까울 때
- 만약 실제 타깃 값이 [5, 10, 15]이고, 모델의 예측값이 [5, 10, 15]라면 분자가 0에 가까워져 R²가 1에 가까워진다.
- 즉, 모델이 실제 값을 거의 완벽하게 예측한 상태이다.
- R² = 0에 가까울 때
- 타깃 값이 [5, 10, 15]인데 모델이 모두 평균인 10으로 예측했다고 가정하면, 모델은 데이터를 전혀 설명하지 못한 상태가 된다. 이 경우 R²은 0에 가까워진다.
따라서, 타깃의 평균을 예측하는 수준이라면 R²는 0에 가까워지고, 모델이 타깃에 가까운 예측값을 내면 R²는 1에 가까워진다.
여기서 0.99면 좋은 값이다.
타깃과 예측한 값 사이의 차이를 구해 보면 어느 정도 예측이 벗어났는지 가늠하기 좋다. 사이킷런은 sklearn.metrics 패키지 아래 여러 가지 측정 도구를 제공한다. 이 중에서 mean_absolute_errors는 타깃과 예측의 절대값 오차를 평균하여 반환한다.
결과에서 예측이 평균적으로 19g 정도 타깃값과 다르다는 것을 알 수 있다.
과대적합 vs 과소적합
앞에서 테스트 세트를 사용한 점수와 비교해 보자. 모델을 훈련 세트에 훈련하면 훈련 세트에 잘 맞는 모델이 만들어진다. 이 모델을 훈련 세트와 테스트 세트에서 평가하면 두 값 중 어느 것이 높을까? 보통 훈련 세트의 점수가 조금 더 높게 나온다. 왜냐하면 훈련 세트에서 모델을 훈련했기 때문이다.
만약 훈련 세트에서 점수가 굉장히 좋았는데 테스트 세트에서는 점수가 굉장히 나쁘다면 모델이 훈련 세트에 과대적합되었다고 말한다. 즉 훈련세트에만 잘 맞는 모델이라 새로운 샘플에 대한 예측을 만들 때 잘 동작하지 않을 것이다.
반대로 훈련 세트보다 테스트 세트의 점수가 높거나 두 점수가 모두 너무 낮은 경우에는 과소적합되었다고 말한다. 모델이 너무 단순하여 훈련 세트에 적절히 훈련되지 않은 경우이다.
훈련 세트가 전체 데이터를 대표한다고 가정하기 때문에 훈련 세트를 잘 학습하는 것이 중요하다. 과소적합이 일어나는 또 다른 이유는 훈련 세트와 테스트 세트의 크기가 매우 작기 때문이다. 우리는 작은 데이터를 사용했기에, 데이터가 작으면 테스트 세트가 훈련 세트의 특징을 따르지 못할 수 있다.
과소적합 문제를 해결하는 방법은 모델을 조금 더 복잡하게 만드는 것이다. 훈련 세트에 더 잘 맞게 만들면 테스트 세트의 점수는 조금 낮아질 것이다. k-최근접 이웃 알고리즘 모델을 더 복잡하게 만드는 방법은 이웃의 개수 k를 줄이는 것이다. 그래프가 좀더 부드러워졌음을 알 수 있다.
이웃의 개수를 줄이면 훈련 세트에 있는 국지적인 패턴에 민감해지고, 이웃의 개수를 늘리면 데이터 전반에 있는 일반적이 개념을 다룬다.
k값을 줄였더니 훈련세트의 R² 점수가 높아졌다. 반대로 과대적합일 경우 모델을 덜 복잡하게 만들어야 한다. k-최근접 이웃의 경우 k값을 늘린다. 이 경우에는 하나의 값만 예측하게 되어 훈련 세트를 전혀 학습하지 못한 모델이 된다.
학습을 마치고
오늘은 왜 이렇게 공부가 하기 싫고 컨디션이 안 좋은지 모르겠다. 그냥 만사가 피곤하다. 잠도 잘 잔 것 같은데 평일 동안의 피로가 누적되어 토요일은 그냥 놀고 싶고 쉬고 싶은 것 같다. 몇 번이나 공부를 중단했다가 그래도 시작한 공부는 끝까지 마무리해 보았다.
시간은 평소보다 2배 이상 걸렸지만 그래도 뿌듯하고 감사하다. 오후에는 놀게 될지도 모르겠다.
'인공지능 > 머신러닝' 카테고리의 다른 글
회귀 알고리즘과 모델 규제 3 - 선형 회귀 1 : 선형회귀와 다중회귀로 농어의 무게 예측해보기 (0) | 2024.09.28 |
---|---|
회귀 알고리즘과 모델 규제 2 - k-최근접 이웃 회귀 2 : 스스로 실습해보고 문제 풀어보기 (0) | 2024.09.28 |
데이터 다루기 4 - 데이터 전처리 2 : 스스로 실습하며 문제 풀어보는 시간 (0) | 2024.09.28 |
데이터 다루기 3 - 데이터 전처리 1 : 이상한 도미 전처리하여 제대로 예측하게 만들기 (0) | 2024.09.28 |
데이터 다루기 2 - 훈련 세트와 테스트 세트 2 : 스스로 실습하며 문제 풀어보는 시간 (0) | 2024.09.28 |