회귀분석(다중회귀)

이전 글에는 하나의 독립변수를 사용한 예측을 테스트했습니다. 이번에는 2개 이상의 독립변수를 포함하는 다중회귀분석에 대해서 동일한 데이터셋을 활용해서 알아보겠습니다.

dataset = pd.read_csv('./fitness.csv')
dataset[0:10]

지난 예제에서 runpulse를 통해서 maxpulse를 예측하는 회귀분석을 수행했습니다. 여기서 runpulse는 독립변수로서 종속변수인 maxpulse에 영향을 주는 변수입니다. 이번에도 maxpulse를 예측할 것인데 독립변수가 age, weight, oxygen, runtime, runpulse, rstpulse 이렇게 6개입니다.

먼저 예측할 maxpulse를 제외한 데이터셋을 만들어줍니다. 이것을 dataset2라고 정의하겠습니다. dataset2은 6개의 column과 31개의 row를 가진 [31 × 6] 행렬이 됩니다. 이것은 이전 시간에 하나의 독립변수를 통해서 예측을 하기 위해서 작성했던 수식인 y = Xw+b를 확장한 개념입니다.

이것을 풀어서 쓰게 되면 y = X1w1 + X2w2 + X3w3 + X4w4 + X5w5 + X6w6 + b가 되는 것이고 이런 y가 31개가 있다는 의미가 됩니다. 그러니까 각각의 요소에 w1~w6개의 값을 곱해주는 [31 × 6] × [6 × 1] + b의 행렬곱 연산이 되고 이는 [1 × 6] × [6 × 1] + b 이런 벡터의 내적의 합이 31개가 된다는 동일한 의미입니다.

dataset2 = dataset[dataset.columns[0:-1]]
print(dataset2.values)

이제 이전에 단순회귀에서 했던것처럼 sklearn 패키지의 LinearRegression을 임포트 하고 기울기와 절편을 계산합니다. fit()에 두개의 인자값을 주는데 하나는 6개의 독립변수들의 값이 있는 2차원 행렬이고 또 하나는 실제 계산 값이 들어있는 데이터셋입니다. 여기서는 알고자 하는 값인 maxpulse 값이 되겠습니다.

from sklearn.linear_model import LinearRegression
lr = LinearRegression().fit(dataset2.values, dataset['maxpulse'].values.reshape(-1,1))
print('W:{}, b:{}'.format(lr.coef_, lr.intercept_))
#W:[[-0.00794636  0.09986232  0.57982346  1.18233886  0.87556793  0.05439718]], b:[-25.0634534]

간단히 계산이 완료되었고 예상했던것처럼 알고자 했던 각 독립변수의 가중치 값인 6개와 절편 값을 얻었습니다. 이 모델이 어느정도 결과값과 일치하는지 차이를 보기 위해서 실제값과 예측값을 그래프로 시각화해보겠습니다.

plt.plot(lr.predict(dataset2.values),'*')
plt.plot(dataset['maxpulse'],'x')

실제값 “x”와 예측값 “*”를 비교해보니 일부 오차가 큰 것들도 있지만 제법 합리적으로 예측을 한것같습니다. 그리고 이 값은 아래와 같이 행렬 곱으로 계산할 수도 있습니다. 여기서 x는 독립 변수들의 값이고 y는 LinearRegression을 통해서 얻은 w, b 값입니다. 이 값들을 활용해서 y = Xw + b 형식으로 풀어낸 값과 동일합니다.

x = dataset2.values
y = lr.coef_.reshape(-1,1)
predict = np.matmul(x,y) + lr.intercept_

“회귀분석(다중회귀)”에 대한 한개의 댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다