일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 컴퓨터비전
- 정수와유리수
- SQL
- CSS
- 정보처리기사실기
- 연습문제
- JSP/Servlet
- numpy/pandas
- 정보처리기사필기
- CNN
- 중학1-1
- 코딩테스트
- 컴퓨터구조
- 운영체제
- 파이썬라이브러리
- 텍스트마이닝
- 영어공부
- 파이썬
- 데이터분석
- 데이터베이스
- pandas
- 딥러닝
- 혼공머신
- 중학수학
- 자바 실습
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
회귀 알고리즘과 모델 규제 3 - 선형 회귀 1 : 선형회귀와 다중회귀로 농어의 무게 예측해보기 본문
3장은 세 번째 장까지 있어서 공부를 다 마치려면 한참의 시간이 걸릴 것 같다. 그래도 공부를 해야겠지. 어제와 오늘은 공부할 컨디션이 좋지는 않아서 좀 천천히 하는 중이다.
지난 시간 복습
결정 계수가 1에 가까우면 좋은 모델이고, 0에 가까우면 좋지 않은 모델로 예측한다. 모델의 복잡도가 낮으면 과소적합이고, 높으면 과대적합이다. 이 모델 복잡도를 조절하는 매개변수는 이웃의 개수이다.
학습 목표
k-최근접 이웃 회귀와 선형 회귀 알고리즘의 차이를 이해하고, 사이킷런을 사용해 여러 가지 선형 회귀 모델을 만들어보기
시작하기 전에
농어 담당 직원은 혼공머신에게 아주 큰 농어를 골라 무게를 예측해 달라고 가져왔다. 무려 길이가 50cm인 농어이다.
혼공머신은 앞서 만든 모델을 사용해 이 농어의 무게를 예측했다. 하지만 저울에 나온 농어의 무게와 너무 차이가 많이 났다.
k-최근접 이웃의 한계
먼저 앞에서 사용했던 데이터와 모델을 준비한다. 그리고 데이터를 훈련 세트와 테스트 세트로 나눈다. 특성 데이터는 2차원 배열로 변환한다. 그런 다음 최근접 이웃 개수를 3으로 하는 모델을 훈련한다.
이제 이 모델을 사용해 길이가 50cm인 농어의 무게를 예측한다.
혼공머신의 모델은 50cm 농어의 무게를 1023g 정도로 예측했다. 하지만 실제 이 농어의 무게는 훨씬 더 많이 나간다고 한다. 훈련 세트와 50cm 농어 그리고 이 농어의 최근접 이웃을 산점도에 표시해 보았다.
농어는 삼각형으로 표시되었고, 그 주변의 샘플은 마름모이다. 이 산점도를 보면 길이가 커질수록 농어의 무게가 증가하는 경향이 있다. k-최근접 이웃 회귀는 가장 가까운 샘플을 찾아 타깃을 평균한다. 해당 범위 안에서만 예측하기에, 새로운 샘플이 훈련 세트의 범위를 벗어나면 엉뚱한 값을 예측할 수 있다. 예를 들어 100cm인 농어도 여전히 1033g으로 예측한다.
선형 회귀
선형 회귀는 널리 사용되는 대표적인 회귀 알고리즘이다. 비교적 간단하고 성능이 뛰어나기 때문에 맨 처음 배우는 머신러닝 알고리즘 중 하나이다. 선형이라는 말에서 짐작할 수 있듯이 특성이 하나인 경우 어떤 직선을 학습하는 알고리즘이다. 다음 중 어떤 직선이 농어 데이터를 가장 잘 표현하는지 생각해 보자.
로지스틱 회귀도 신경망 모델도 모두 선형 회귀를 바탕으로 한다. 선형 회귀는 실제로 머신러닝 모델에서 많이 사용된다.
그래프 3이 농어의 기울기를 잘 표현한 가장 그럴싸한 직선이다. 이런 직선을 머신러닝 알고리즘이 자동으로 찾을 수 있다.
사이킷런은 LinearRegression 클래스로 선형 회귀 알고리즘을 구현해 놓았다. 사이킷런의 모델 클래스들은 훈련, 평가, 예측하는 메스드 이름이 모두 동일하다. k-최근접 이웃 회귀를 사 용했을 때와 달리 선형 회귀는 50cm 농어의 무게를 아주 높게 예측했다.
하나의 직선을 그리려면 기울기와 절편이 있어야 한다. y = a * x + b처럼 쓸 수 있다. 여기서 x를 농어의 길이, y를 농어의 무게로 바꾸면 이와 같다. LinearRegreesion 클래스는 이 데이터에 가장 잘 맞는 a와 b를 찾아서 lr 객체의 coef_와 intercet_ 속성에 저장되어 있다.
사이킷런에서는 어떤 데이터에 학습하는 값을 저장할 때 다른 속성과 구분되게 하기 위해 속성 이름 밑에_를 사용한다. 이 밑줄 문자가 보이면 이건 자신이 저장한 값이 아니라 모델에서 학습한 값이라고 생각하면 된다.
머신러닝에서 기울기를 종종 계수(coefficient) 또는 가중치(weight)라고 부른다. coef_와 intercet_를 머신러닝 알고리즘이 맞는 값이라는 의미로 모델 파라미터라고 부른다. 많은 머신러닝 알고리즘의 훈련 과정은 최적의 모델 파라미터를 찾는 것과 같다. 이를 모델 기반 학습이라고 부른다.
기울기값은 대괄호가 쳐있는데 이건 넘파이 배열이다. 길이 특성을 여기서는 하나만 사용했지만 여러 개의 특성을 사용할 수 있기에 배열 형태로 나타나는 것이다.
앞서 사용한 k-최근접 이웃에는 모델 파라미터가 없다. 훈련 세트를 저장하는 것이 훈련의 전부인데 이를 사례 기반 학습이라고 부른다.
농어의 길이 15에서 50까지 직선으로 그려보았다. 이 직선을 그리려면 앞에서 구한 기울기와 절편을 사용해서 두 점을 이으면 된다. 이 직선이 선형 회귀 알고리즘이 이 데이터셋에서 찾은 최적의 지선이다. 100cm의 농어 데이터를 넣어도 잘 예측할 거라 판단할 수 있다.
훈련 세트와 테스트 세트의 점수가 조금 차이가 난다. 훈련 세트의 점수도 높지 않고 오히려 전체적으로 과소적합되었다고 볼 수 있다. 두 점수만 보았을 때는 과대적합되었다고 말할 수도 있다.
어떤 모델이 과대적합, 과소적합되었는지는 여러 모델과 실험을 통해 상대적으로 판단하는 것이 좋다.
다항 회귀
앞서 그래프에서 이상한 부분을 발견할 수 있다. 그것은 선형 회귀가 만든 직선이 왼쪽 아래로 쭉 뻗어 있다는 것이다. 이 직선대로 예측하면 농어의 무게가 0g 이하로 내려갈 텐데 현실에서는 있을 수 없는 일이다.
농어의 길이와 무게에 대한 산점도를 자세히 보면 일직선이라기보다 왼쪽 위로 조금 구부러진 곡선에 가깝다. 그렇다면 최적의 직선을 찾기보다 최적의 곡선을 찾으면 어떨까?
이런 2차 방정식의 그래프를 그리려면 길이를 제곱한 항이 훈련 세트에 추가되어야 한다. 사실 넘파이를 사용하면 아주 간단히 만들 수 있다. 다음처럼 농어의 길이를 제곱해서 원래 데이터 앞에 붙여 보았다.
2장에서 사용했던 column_stack() 함수를 사용하면 간단하다. train_input을 제곱한 것과 train_input 두 배열을 나란히 붙이면 된다. 즉 train_input에 있는 모든 원소를 제곱한다.
원래 특성인 길이를 제곱하여 왼쪽 열을 추가했기 때문에 훈련 세트와 테스트 세트 모두 열이 2개로 늘어났다.
이제 train_poly를 이용해 선형 회귀 모델을 다시 훈련했다. 이 모델은 2차 방정식의 a, b, c를 잘 찾을 것으로 기대한다. 여기서 주목할 점은 2차 방정식 그래프를 찾기 위해 훈련 세트에 제곱 항을 추가했지만 타깃값은 그대로 사용한다는 것이다. 조금 전에 제곱항을 앞쪽에 넣어주었으므로 이번에도 앞쪽에 제곱한 값을 넣어준다. 순서를 맞게 해야 한다. 목표하는 값은 어떤 그래프를 훈련하든지 바꿀 필요가 없다. 이 훈련 세트로 선형 회귀 모델을 훈련한 다음 50cm짜리 농어에 대해 무게를 예측해 보자.
테스트할 때는 이 모델에 농어 길이의 제곱과 원래 길이를 함께 넣어주어야 한다. 이 모델은 다음과 같은 그래프를 학습했다.
무게 = 1.01 x 길이² - 21.6 x 길이 + 116.05
이러한 방정식을 다항식이라 부르며, 다항식을 사용한 선형 회귀를 다항 회귀라고 부른다.
1씩 증가하는 모양이 되도록 포인트 배열로 만들었다. 훈련 세트에 산점도 그래프를 그려보면 이와 같다. 잘게 쪼갠 짧은 직선을 이어서 그리면 마치 곡선처럼 표현할 수 있다.
50cm 농어 데이터도 이전에 그렸던 것보다 훨씬 높은 값으로 예측되었다. 앞서 그린 단순 선형 회귀 모델보다 훨씬 나은 그래프가 그려졌다. 훈련 세트와 테스트 세트의 R² 점수를 평가해 보면, 점수가 크게 높아짐을 알 수 있다. 하지만 여전히 테스트 세트의 점수가 조금 높아 과소적합이 남아있다.
학습을 마치고
오후에 조금 이 학습을 진행하다 오늘은 너무 공부가 하기 싫은 관계로 실컷 놀고 잠도 많이 자다가 저녁 무렵 공부를 재개했다. 그래도 다시 공부의 자리로 나아와 책을 펴고 강의를 듣는 내 모습이 신기할 뿐이다. 아무리 힘들어도 술에 취해도 일을 멈추지 않는 직장인처럼 나도 이젠 어느 정도 내성이 생김을 느낄 수 있었다.
솔직히 강의는 들어도 이해가 잘 가지 않고 책을 보는 것이 훨씬 더 간결하고 이해도 잘 되었다. 난 역시 강의보다는 책으로 공부하는 스타일인 것 같다.
'인공지능 > 머신러닝' 카테고리의 다른 글
회귀 알고리즘과 모델 규제 5 - 특성 공학과 규제 1 : 여러 특성을 추가한 다중 회귀 모델과 릿지 회귀와 라쏘 회귀에 대하여 (0) | 2024.09.28 |
---|---|
회귀 알고리즘과 모델 규제 4 - 선형 회귀 2 : 스스로 실습하고 문제를 풀어보는 시간 (0) | 2024.09.28 |
회귀 알고리즘과 모델 규제 2 - k-최근접 이웃 회귀 2 : 스스로 실습해보고 문제 풀어보기 (0) | 2024.09.28 |
회귀 알고리즘과 모델 규제 1 - k-최근접 이웃 회귀 1 : 회귀와 분류 모델 그리고 과대적합과 과소적합 문제 해결하기 (2) | 2024.09.28 |
데이터 다루기 4 - 데이터 전처리 2 : 스스로 실습하며 문제 풀어보는 시간 (0) | 2024.09.28 |