본문 바로가기
학습노트/Python

[강의노트] Python - 머신러닝 - 선형회귀-실습(1)

by kime2 2024. 1. 30.
스파르타코딩클럽의 강의를 참고하여 정리하였습니다

 

사용데이터: seaborn시각화 라이브러리 기본 데이터 셋, tips

 

목표1. 주문의 전체 금액(total_bill)-> X 을 통해 받을 팁(tip)->y 예상하기

순서: 데이터획득 > 선형회귀 훈련하기 > 평가

방법: 단순선형회귀

 

💡순서
라이브러리 불러오기 > 데이터불러오기 > 선형회귀 훈련하기(산점도 그려보기, 가중치/편행 계산, 회귀식 계산,  예측값 계산, 회귀식/산점도 확인) > 평가하기(MES,z-score)

 

 

0. 라이브러리 불러오기

import sklearn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

 

1. 데이터불러오기

tips_df = sns.load_dataset('tips')
tips_df.head(3)
# X: total_bill
# y: tip

 

2. 선형회귀 훈련하기

# 선형회귀 훈련(적합)
from sklearn.linear_model import LinearRegression
model_lr2 = LinearRegression()
X = tips_df[['total_bill']]
y = tips_df[['tip']]
model_lr2.fit(X,y)

 

- 산점도 그려보기 : 관계확인

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

- 가중치, 편향 계산

# y(tip) = w1*x(total_bill) + w0
w1_tip = model_lr2.coef_[0][0]
w0_tip = model_lr2.intercept_[0]

print(w1_tip)
print(w0_tip)
# w1: 가중치
# w0: 편향

>> w1: 0.10502451738435337

>> w0: 0.9202696135546731

 

-회귀식 계산

print('y = {}x + {}'.format(w1_tip.round(2), w0_tip.round(2)))
# y = 0.11x + 0.92
# 전체 결제금액이 1달러 오를때, 팁은 0.11달러 추가된다.
# 전체 결제금액이 100달러 오를때, 팁은 11달러 추가된다.

 

- 예측값 계산

# 예측값 생성 by .predict()
y_true_tip = tips_df['tip']
y_pred_tip = model_lr2.predict(tips_df[['total_bill']])
tips_df['pred'] = y_pred_tip

 

- 회귀식 및 산점도 확인

sns.scatterplot(data = tips_df, x = 'total_bill', y=  'tip')
sns.lineplot(data = tips_df, x = 'total_bill', y = 'pred', color = 'red')

 

3. 평가하기

from sklearn.metrics import mean_squared_error, r2_score

 

- MES

mean_squared_error(y_true_tip, y_pred_tip)

>> 1.036019442011377

 

- z-score

r2_score(y_true_tip, y_pred_tip)

>> 0.45661658635167657

 

결과: 예측이 크게 맞지는 않은 것 같음(?) 더 효과적인 예측 방법은 없을 까?


목표2. 주문의 전체 금액(total_bill)-> x1 와 남여의 성별(sex) -> x2을 통해 받을 팁(tip)->y 예상하기

순서: 데이터획득>범주형 데이터 encoding > 선형회귀 훈련하기 > 평가

방법: 다중선형회귀

💡순서
라이브러리 불러오기 > 데이터불러오기 > 범주형 데이터 encoding> 선형회귀 훈련하기(산점도 그려보기, 가중치/편행 계산, 회귀식 계산,  예측값 계산, 회귀식/산점도 확인) > 평가하기(MES,z-score)

 

 

0. 라이브러리 불러오기

import sklearn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

 

1. 데이터불러오기

tips_df = sns.load_dataset('tips')
tips_df.head(3)
# X: total_bill
# y: tip

 

 

2. 데이터 encoding하기 : 여자라면 0, 남자라면 1

# Female 0, Male 1 
def get_sex(x):
    if x == 'Female':
        return 0
    else:
        return 1

 

#apply method는 매 행을 특정한 함수를 적용한다.
tips_df['sex_en'] = tips_df['sex'].apply(get_sex) #'sex'의 데이터에 get_sex함수를 적용하여 'sex_en'라는 새로운 컬럼을 만들어서 저장
tips_df.head(3)

 

 

3. 선형회귀 훈련하기

# 모델설계도 가져오기
# 학습
# 평가
model_lr3 = LinearRegression()
X = tips_df[['total_bill','sex_en']]
y = tips_df[['tip']]
#학습
model_lr3.fit(X,y)
#예측
y_pred_tip2 = model_lr3.predict(X)
y_pred_tip2[:5]

 

4. 평가하기

- MES

# 단순선형회귀 mse: X변수가 전체 금액
# 다중선형회귀 mse: X변수가 전체 금액, 성별
print('단순선형회귀', mean_squared_error(y_true_tip, y_pred_tip))
print('다중선형회귀', mean_squared_error(y_true_tip, y_pred_tip2))

단순선형회귀 1.036019442011377

다중선형회귀 1.0358604137213614

 

- z-score

print('단순선형회귀', r2_score(y_true_tip, y_pred_tip))
print('다중선형회귀', r2_score(y_true_tip, y_pred_tip2))

단순선형회귀 0.45661658635167657

다중선형회귀 0.45669999534149974

 

결론: 별 차이 없음...왜?

성별에 따라 팀의 차이가 별로 없기 때문,,

sns.barplot(data = tips_df, x = 'sex', y = 'tip')