25.05.19 코딩 공부 시작

코딩 척척석박사 분들 피드백 환영합니다.

공대생이 코딩에서 살아남기

강의자료/머신러닝의 이해와 라이브러리 활용

2강. 회귀분석(선형회귀 정의 및 단순선형회귀 실습)(06.23,06.24)

코딩 아가 2025. 6. 24. 20:16

선형회귀란?

주변의 점들이 직선(선형)으로 돌아가려하는 것(회귀)처럼 보임.

  1. 선형성
  2. 등분산성
  3. 정규성
  4. 독립성
  • 장점: 직관적, X-Y관계 빠르게 정량화
  • 단점: X-y간 선형성 가정 필요, 이상치에 민감, 인코딩시 정보 손실

  • Y: 종속, 결과 변수
  • X: 독립, 원인 변수
  • Y =  B0 + B1X + e
    • B0: 편향(절편)
    • B1: 회귀 계수(기울기), 가중치(예측 가능)
    • e: 오차(모델이 설명하지 못하는 Y의 변동성)

회귀분석 평가지표(Mean Squared Erorr  = MSE)

에러(e) = 실제 데이터 - 예측 데이터

 

함수 정의 확인

1. 인터넷 있을때: sklearn linearregression 검색해서 들어가기

2. 인터넷 없을때: 쥬피터 노트북

help(sklearn.linear_model.LinearRegression)

선형회귀만의 평가 지표(R square)

실습

[훈련하기]

1. 라이브러리 설치 및 적용

#실행 전 터미널에 pip install scikit-learn하기
import numpy as np
import matplotlib.pyplot as plt
import sklearn
import pandas as pd
import seaborn as sns

2. 임의의 데이터 생성

weights = [87, 81, 82, 92, 90, 61, 86, 66, 69, 69]
heights = [187, 174, 179, 192, 188, 160, 179, 168, 168, 174]

body_df = pd.DataFrame({'weights': weights, 'heights': heights})
body_df.head(3)

3. 선형그래프인지 확인(산점도)

sns.scatterplot(data=body_df, x='weights', y='heights')
plt.title('몸무게와 키의 산점도')
plt.xlabel('몸무게 (kg)')
plt.ylabel('키 (cm)')

4. 머신러닝 베이스 생성

from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()
type(model_lr)

#X대문자, y소문자
#DF[]:대괄호 1개 = DF 컬럼
#DF[[]]:대괄호 2개 = DF (학습시킬때 차원 문제 방지)
X = body_df[['weights']]
y = body_df[['heights']]

4. 머신러닝 훈련(학습)

model_lr.fit(X, y)

5. 확인해보기

#가중치(w1)=기울기
model_lr.coef_
#편향(bias, w0)=선형회귀식
model_lr.intercept_

print('y = {}x + {}'.format(w1.round(2), w0.round(2)))        #round: 소수점 자리수
# y = 0.86X + 109.37

 

 

결론: y는 X에 0.86을 곱한뒤 109.37을 더하면된다.

[평가 전 해야할 일]

1. 컬럼 추가(예측값, 에러값, 양수만들기 위해 제곱)

#예측값
body_df['pred'] = body_df['weights'] * w1 + w0
#에러값
body_df['error'] = body_df['heights'] - body_df['pred']
#제곱값
body_df['error^2'] =body_df['error']*body_df['error']
#확인하기
body_df.head(3)

2. MSE 구하기(편차^2/데이터 수)

body_df['error^2'].sum()/len(body_df)

[평가하기]

1. 산점도 그래프에 선형식을 그려보기

sns.lineplot(data=body_df, x='weights', y='pred', color='red')

2. R Square 및 r^2구하기

  • 회귀(숫자 맞추는 방법): MSE(수동계산)
  • R Square: 평균대비 설명력(0~1)
from sklearn.metrics import mean_squared_error, r2_score

y_true = body_df['heights']
y_pred = body_df['pred']
mean_squared_error(y_true, y_pred)
#10.152939045376309
r2_score(y_true, y_pred)
#0.8899887415172141

 

3. 한번에 예측값 보기

model_lr.predict(body_df[['weights']])
# = y_pred2 로 지정 후 r^2보기
mean_squared_error(y_true,y_pred2)
#10.152939045376309
#값 같음

[심화]

다중선형회귀

# 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)
#모델설계도 가져오기
model_lr = LinearRegression()
X = tips_df[['total_bill', 'sex_en']]
y = tips_df[['tip']]
#학습
model_lr.fit(X, y)
# 예측
y_pred_tip = model_lr.predict(X)