본문 바로가기
딥러닝 입문

선형 회귀(Linear Regression) - 1

by 소글소글 2022. 10. 22.
반응형
목차

1. 선형 회귀란 무엇일까?
2. 선형 회귀 과정 쉽게 알기
3. 실습해보기

 

1. 선형 회귀란 무엇일까?

 

선형 회귀는 y = ax + b와 같은 간단한 1차 함수로 표현할 수 있다.

선형 회귀의 목표는 기울기(a)와 절편(b)을 찾아내는 것이다.


2. 선형 회귀 과정 쉽게 알기

 

다음 세 그래프를 통해 선형 회귀의 해결 과정을 살펴보자.

왼쪽부터 순서대로 그래프 1, 2, 3

🟩 그래프 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()

3번째 속성과 target 데이터의 산점도 그래프

matplotlib의 scatter() 함수를 사용해 산점도 그래프를 그릴 수 있다. 당뇨병 데이터 세트에는 10개의 열, 즉 10개의 특성이 있는데, 이 특성을 모두 그래프로 표현하려면 3차원 이상의 그래프를 그려야 한다. 따라서 3번째 특성(index = 2)만을 사용하여 산점도 그래프를 그리면 위의 그래프와 같다. 

 

다음 글에서는 당뇨병 데이터를 가지고 모델을 훈련하기 위한 최적화 알고리즘인 경사 하강법(gradient descent)에 대해 다뤄보겠다. 

반응형

'딥러닝 입문' 카테고리의 다른 글

선형 회귀(Linear Regression) - 2  (0) 2022.10.23

댓글