오랑우탄의 반란

[ML] 머신러닝 선형회귀분석 파이썬 실습 (VSCode) 본문

PYTHON/머신러닝

[ML] 머신러닝 선형회귀분석 파이썬 실습 (VSCode)

5&2 2024. 8. 9. 18:17
반응형

 

 

머신러닝 선형회귀분석 실습

회귀분석은 scikit-learn 라이브러리에서 제공해주는 함수만 다룰 줄 알면 매우 간단한데요, 

아래 단계에 따라 진행하겠습니다.

  1. 사용할 라이브러리 설치
  2. 데이터 확인 (Seaborn tips)
  3. 선형회귀 모델 훈련
  4. 모델 평가

 

1. 라이브러리 설치

우선 사용할 라이브러리를 모두 import 해줍니다.

import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import sklearn #scikit-learn으로 적으면 안됨

 

라이브러리 설치가 안 되어 있다면 pip 설치를 진행해주세요.

! pip install 라이브러리

 

2. 데이터 확인 

이번 실습에서 사용할 데이터는 Seaborn 라이브러리에 기본 내장된 tips 데이터로, 아래와 같은 구성입니다.

tips_df = sns.load_dataset('tips')
tips_df.head()

 

 

해당 데이터에 대해 total_bill (X) 을 알면 얼마의 tip (Y) 을 받을 수 있을지 예측하고자 회귀분석을 진행합니다. 

 

 

모델을 훈련하기에 앞서, 두 칼럼의 상관관계와 분포를 산점도로 먼저 확인해줍니다. 

선형으로 양의 상관관계를 가진 것을 확인했으니, 선형 회귀 분석을 진행해도 좋겠습니다. 

sns.scatterplot(data = tips_df, x='total_bill', y='tip')

 

3. 선형회귀 모델 훈련

본격적인 모델 훈련에 앞서 자주 쓰이는 함수를 짚고 넘어가겠습니다.

Class: sklearn.linear_model.LinearRegression 
fit 데이터 학습
coef_ 회귀 계수 (w1)
intercept_ 편향 bias (w0)
predict 데이터 예측

 

앞서 scikit-learn 라이브러리를 import 했는데요, 그 중 linear_model의 LinearRegression 클래스를 사용할 예정입니다. 

해당 클래스를 import 해서 변수에 저장해두고 이번 실습의 분석 모델로 사용하겠습니다. 

from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()

 

훈련할 모델에 넣어줄 데이터 또한 변수에 넣어주고, fit 함수를 사용해 훈련을 진행하면 아래와 같이 뜹니다. 

X = tips_df[['total_bill']] 
y = tips_df[['tip']]
model_lr2.fit(X=X, y=y)

 

모델을 훈련시킬 데이터에 왜 대괄호가 추가되나요?
모델 훈련 시 DataFrame 형태의 데이터를 넣어줘야 하기 때문에 기존의 칼럼 그대로 Series 형태의 데이터로 코드를 실행하면 아래와 같은 에러가 발생합니다. 

ValueError: Expected a 2-dimensional container but got <class 'pandas.core.series.Series'> instead.
Pass a DataFrame containing a single row (i.e. single sample) or a single column (i.e. single feature) instead.

 

Series vs DataFrame

 

선형회귀 이론 포스트에서 언급했던 선형회귀 수식을 사용할 건데요

 

Y = w1X + w0 형식으로 문자만 조금 바꿔서 사용하겠습니다. (w1: 가중치, w0: 편향/bias )

가중치를 구하는 함수 coef_편향을 구하는 함수 intercept_ 를 사용해 수식을 만들어줍니다. 

이때 가중치는 대괄호 2개에 들어가있는 형태로 출력되기 때문에 두 번 슬라이싱 해줍니다. 

w1 = model_lr2.coef_[0][0]
w0 = model_lr2.intercept_[0]
print(f'y = {w1:.2f}x + {w0:.2f}')

 

이때 나온 결과는 어떻게 해석할 수 있을까요?

전체 금액이 $1 오를 때마다 팁이 $0.11 추가된다

혹은 전체 금액이 $100 오르면 팁이 $11 추가된다고 할 수 있겠습니다. 

 

이 관계를 바탕으로 예측 데이터를 predict 함수로 생성해줍니다. 

실제 데이터의 경우 tips_df 의 tip 칼럼이 되겠지요?

y_true = tips_df['tip']
y_pred = model_lr.predict(tips_df[['total_bill']])

 

이때 만든 예측 데이터를 tips_df 에 칼럼으로 추가해준 후 앞서 그렸던 산점도에 직선으로 시각화할 수 있습니다.  

tips_df['pred'] = y_pred_tips
sns.lineplot(data = tips_df, x='total_bill', y='pred', color='red')

 

4. 선형회귀 모델 평가

metrics 에서 mse와 rscore 값을 구해줄 함수를 import 해서 실제 데이터와 예측 데이터를 넣어서 모델 평가를 진행합니다. 

from sklearn.metrics import mean_squared_error, r2_score
print(mean_squared_error(y_true,y_pred_))
print(r2_score(y_true,y_pred))

 

해당 모델의 MSE 가 1 이 나왔지만, y값 total_bill 과 tips의 단위가 다르기 때문에 성급하게 좋다고 하기는 어렵습니다. 

 

r score 의 경우 분야마다 기준이 다른데요, 사회/문화/경제 분야에서는 40이면 좋다고 평가된다고 합니다.

여기서는 너무 낮게 나온 걸 볼 수 있는데요, total_bill 대신 다른 칼럼들에 대해 변수 추가를 해서 다중선형회귀로 다시 분석해봐야 합니다. 

 

 

 

다음 포스트에서 다중선형회귀의 기초 이론 그리고 같은 데이터로 다시 실습을 진행해보겠습니다. 

 

반응형