목차
1. 선형 회귀란 무엇일까?
2. 선형 회귀 과정 쉽게 알기
3. 실습해보기
1. 선형 회귀란 무엇일까?
선형 회귀는 y = ax + b와 같은 간단한 1차 함수로 표현할 수 있다.
선형 회귀의 목표는 기울기(a)와 절편(b)을 찾아내는 것이다.
2. 선형 회귀 과정 쉽게 알기
다음 세 그래프를 통해 선형 회귀의 해결 과정을 살펴보자.
🟩 그래프 1
그래프 1의 1차 함수는 세 점을 잘 표현하지 못하는 것 같다.
기울기와 절편을 수정하여 세 점을 표현할 수 있는 1차 함수로 바꿔보자.
그래프의 기울기를 줄여 일직선 상에 위치한 세 점을 이은 선분과 수평을 이루게 할 수 있다.
🟩 그래프 2
우선 세 점을 이은 선분과 수평을 이루도록 기울기를 조정했다. 이제 절편을 조정해보자.
🟩 그래프 3
세 점이 1차 함수 위에 모두 올라가는, 세 점을 잘 표현하는 1차 함수가 되었다.
이러한 과정에서 만든 1차 함수들이 선형 회귀로 만든 모델들이다. 그래프 3에서 나타낸 1차 함수가 그 그래프 중 최적의 선형 회귀 모델인 것이다. 그리고 이런 모델을 통해 새로운 점에 대한 예측도 할 수 있게 된다. 임의의 x에 대해 y를 예측할 수 있는 것이다.
3. 실습해보기
머신러닝, 딥러닝 패키지에는 인공지능 학습을 위한 데이터 세트들이 준비가 되어있다. 사이킷런과 케라스에도 다양한 데이터 세트를 제공한다. 이 실습에서는 사이킷런의 데이터 세트 중 당뇨병 환자의 데이터 세트를 사용한다.
🟩 당뇨병 데이터 준비하기
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
load_diabetes() 함수를 임포트하여 diabetes에 당뇨병 데이터를 저장한다.
🟩입력, 타깃 데이터 크기 확인
print(diabetes.data.shape, diabetes.target.shape)
(442, 10) (442,)
diabetes 속성 중 data 속성과 target 속성에는 우리에게 필요한 입력과 타깃 데이터가 numpy 배열로 저장되어 있다. numpy 배열의 크기는 shape 속성에 저장되어 있으므로 위와 같이 shape 속성을 출력하여 입력, 타깃 데이터의 크기를 확인할 수 있다. 이 코드에서는 입력 데이터에는 442개의 행과 10개의 열로 구성된 2차원 배열임을 알 수 있고, 타깃 데이터는 442개의 행을 가진 1차원 배열이다.
행은 샘플, 열은 샘플의 특성이다. 쉽게 설명하자면 다음 표와 같다.
이름 | 성별 | 키 | 몸무게 | 나이 |
철수 | 남성 | 174 cm | 57 | 25 |
영희 | 여성 | 162.3 cm | 63.2 kg | 32 |
이 표는 2개의 행과 5개의 열로 구성된 2차원 배열이다.
🟩 입력 데이터, 타깃 데이터 내용 확인하기
diabetes.data[0:3]
diabetes.target[:3]
array([[ 0.03807591, 0.05068012, 0.06169621, 0.02187235, -0.0442235 ,
-0.03482076, -0.04340085, -0.00259226, 0.01990842, -0.01764613],
[-0.00188202, -0.04464164, -0.05147406, -0.02632783, -0.00844872,
-0.01916334, 0.07441156, -0.03949338, -0.06832974, -0.09220405],
[ 0.08529891, 0.05068012, 0.04445121, -0.00567061, -0.04559945,
-0.03419447, -0.03235593, -0.00259226, 0.00286377, -0.02593034]])
array([151., 75., 141.])
먼저 diabetes.data에 저장된 입력 데이터 중 슬라이싱을 사용해 앞부분의 3개만 출력했다.
안쪽 대괄호에 특성 10개의 값씩, 총 3개의 샘플, 즉 3 x 10 크기의 배열이 나타난다.
그리고 여기서 시작 부분을 0으로 할 것이라면 굳이 인덱스에 0을 적어주지 않아도 괜찮다. target 데이터에서는 0을 생략하고 코드를 작성했다. 타깃 데이터의 출력을 보면 각 입력 데이터의 각 행에 해당하는 각 타깃 데이터 1개씩임을 확인할 수 있다.
🟩 scatter() 함수로 산점도 그래프 그리기
import matplotlib.pyplot as plt
plt.scatter(diabetes.data[:,2], diabetes.target)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
matplotlib의 scatter() 함수를 사용해 산점도 그래프를 그릴 수 있다. 당뇨병 데이터 세트에는 10개의 열, 즉 10개의 특성이 있는데, 이 특성을 모두 그래프로 표현하려면 3차원 이상의 그래프를 그려야 한다. 따라서 3번째 특성(index = 2)만을 사용하여 산점도 그래프를 그리면 위의 그래프와 같다.
다음 글에서는 당뇨병 데이터를 가지고 모델을 훈련하기 위한 최적화 알고리즘인 경사 하강법(gradient descent)에 대해 다뤄보겠다.
'딥러닝 입문' 카테고리의 다른 글
선형 회귀(Linear Regression) - 2 (0) | 2022.10.23 |
---|
댓글