선형 회귀와 데이터 준비
선형 회귀(Linear Regression)
선형 회귀는 아주 간단한 1차 함수로 표현할 수 있다.
위 1차 함수의 기울기(slope)는 a이고 절편(intercept)는 b이다.
보통 1차 함수 문제는 x에 따른 y의 값에 집중하는데 선형 회귀에서는 이와 반대로 x, y가 주어졌을 때 기울기와 절편을 찾는데 집중한다. 즉, 선형 회귀의 주요 관심사는 '절편과 기울기를 찾는 것'이다. 예를 들어 x가 3일 때 y는 25, x가 4일 때 y는 32, x가 5일 때 y는 39라면 기울기와 절편의 값이 뭘까. 조금만 생각해 보면 정답은 기울기는 7, 절편은 4임을 알 수 있다.
그러면 선형 회귀는 위와 같은 문제를 어떤 과정을 통해 해결할까. 바로 기울기와 절편을 계속 변화시키면서 문제를 해결한다. 기울기와 절편을 계속해서 변화시키는 과정에서 많은 1차 함수들이 만들어 질탠데 이때 만들어진 1차 함수들을 '선형 회귀로 만든 모델'이라 하고, 위의 문제에서 기울기가 7, 절편은 4를 찾은것처럼 입력값(x)에 따른 타깃값(y)을 가장 잘 표현한 1차 함수 'y = 7x + 4'를 최적의 선형 회귀 모델인 셈이다. 그리고 이런 모델을 통해 새로운 점에 대한 예측을 할 수 있게 된다. 즉, 새로운 점의 'x 좌표가 6이면 y 좌표는 아마도 46 정도일 것'이라는 예측을 할 수 있게 된다. 미리 준비한 입력(x: 3, 4, 5)과 타깃(y: 25, 32, 39)를 가지고 규칙을 찾아 모델(y=7x + 4)을 만든 다음 새 입력(6)에 대해 어떤 값(46)을 예상한 것이다. 바로 이것이 선형 회귀 모델을 만들어 문제를 해결하는 과정이다.
당뇨병 환자의 데이터 준비
현실적인 문제를 해결해 보겠다. 목표는 '당뇨병 환자의 1년 후 병의 진전된 정도를 예측하는 모델을 만드는 것'이다. 문제를 해결하기 위해 가장 먼저 해야 할 일은 충분한 양의 입력 데이터와 타깃 데이터를 준비하는 것이다. 지금부터 예제에서 사용할 입력 데이터와 타깃 데이터를 준비하겠다.
머신러닝, 딥러닝 패키지에는 인공지능 학습을 위한 데이터 세트(dataset)가 준비되어 있다. 사이킷런과 케라스에서 다양한 데이터 세트를 제공하는데 여기에서는 사이킷런의 데이터 세트 중 당뇨병 환자의 데이터를 사용한다.
아래와 같이 사이킷런의 datasets 모듈에 있는 load_diabetes()함수를 임포트한 후 매개변수 값을 넣지 않은 채로 함수를 호출하면 diabetes에 당뇨병 데이터가 저장된다.
diabetes 변수에 저장된 값의 자료형은 파이썬 딕셔너리(dictionary)와 유사한 Bunch 클래스이다. 이 클래스는 예제 데이터 세트를 위해 준비된 것일 뿐 특별한 기능이 있는 건 아니다.
diabetes의 속성 중 data속성과 target 속성에는 우리에게 필요한 입력과 타깃 데이터가 넘파이 배열로 저장되어 있다. 넘파이 배열의 크기는 shape 속성에 저장되어 있으므로 아래와 같이 shape 속성을 출력하여 입력 데이터와 타깃 데이터의 크기를 확인해 볼 수 있다.
data는 422*10 크기의 2차원 배열이고 target은 442개의 요소를 가진 1차원 배열이다. 즉, data는 442개의 행과 10개의 열로 구성되어 있는데 여기서 행은 샘플(sample)이고, 열은 샘플의 특성(feature)이다. 샘플이란 당뇨병 환자에 대한 특성으로 이루어진 데이터 1세트를 의미하고, 특성은 당뇨병 데이터의 여러 특징들을 의미한다. 쉽게 말해 당뇨병 데이터에는 환자의 혈압, 혈당, 몸무게, 키 등의 특징(특성)이 있는데, 그 특징들의 수치를 모아 1세트로 만들면 1개의 샘플이 나온다고 생각하면 된다. 이때 입력 데이터의 특성은 다른 말로 속성, 독립 변수(independent variable), 설명 변수(explanatory variable)등으로 부른다. 이런 용어는 통계학에서 나온 것이 많은데, 머신러닝에서 널리 통용되는 용어는 특성이다.
diabetes.data에 저장된 입력 데이터를 일부만 출력해 보겠다. 슬라이싱을 사용해 입력 데이터 앞부분의 샘플 3개만 출력한다.
위와 같이 특성의 값 10개가 나열되어 있는데 3개의 샘플을 추출했으므로 3*10크기의 배열이 나타난다.
이번에는 타깃 데이터를 출력해 보겠다.
타깃 데이터는 10개의 요소로 구성된 샘플 1개에 대응된다.
이렇게 공부할 때는 저 데이터들의 수치를 알 필요가 없지만 실전에서는 데이터의 의미를 아는 것이 매우 중요할 수 있으므로 해당 분야의 전문가의 도움을 받는 것이 좋다.
지금까지 이렇게 미리 준비된 당뇨병 환자의 데이터를 사이킷런을 이용해 손쉽게 불러왔다. 하지만 실무에서는 충분한 데이터가 없으면 제대로 된 모델을 만들 수 없기 때문에 데이터를 준비하는 과정에 많은 시간과 비용이 필요하다. 어떤 경우에는 데이터를 구매하기도 한다.
당뇨병 데이터 시각화
입력 데이터와 타깃 데이터의 관계를 눈으로 확인하기 위하여 맷플롯립을 이용해 데이터를 시각화해 보겠다.
당뇨병 데이터 세트에는 10개의 특성이 있으므로 이 특성을 모두 그래프로 표현하려면 3차원 이상의 그래프를 그려야 한다. 3차원 이상의 그래프는 그릴 수 없으므로 세 번째 특성과 타깃데이터 1개의 특성만 사용하겠다.
매번 diabetes.data를 입력하여 입력 데이터의 속성을 참고하는 방법은 번거로우니 아래와 같이 입력 데이터의 세 번째 특성(입력 데이터)를 미리 분리하여 변수 x에 저장하고 타깃 데이터는 변수 y에 저장하겠다. 이후 실습에서는 x에 있는 데이터와 y에 있는 데이터를 이용해 모델을 훈련할 것이다.