본문 바로가기

TIL

[240130-31] 머신러닝 - 선형회귀, 로지스틱회귀

[머신러닝의 이해와 라이브러리 활용 기초 by 임정 튜터]

1. 머신러닝의 기초

1) 머신러닝 정의 및 발전 배경 

▶ 머신러닝 용어 정리 

AI ⊃ 머신러닝 ⊃ 딥러닝

 

- AI: 인간의 지능을 요구하는 업무를 수행하기 위한 시스템
└ Machine Learning: 관측된 패턴을 기반으로 의사 결정을 하기 위한 알고리즘. 다른 말로 하면 대용량 데이터의 패턴을 인식하고 이를 바탕으로 예측, 분류하는 방법론

   · Deep Learning: 인공신경망을 이용한 머신러닝
- Data Science: AI를 포괄하여 통계학과 컴퓨터공학을 바탕으로 발전한 융합 학문(근거/데이터 기반 의사결정)
- Data Analysis: 데이터 집계, 통계 분석, 머신러닝을 포함한 행위

 

▶ 머신러닝의 발전 

① 통계의 발전: 비용(돈과 시간)의 한계로, 표본집단을 통해 모집단의 성질을 알아내는 추론 방법, 즉 통계가 발전

② 데이터 처리 기술의 발전: 서비스가 많아지고, 저장매체의 가격 또한 하락하며 데이터 수집이 용이해짐 

 

>> 과거 통계학을 통해 제한된 데이터를 기반으로 가설을 세우고 결과를 추론했던 것과 달리, 데이터 처리 기술이 발전하면서 일단 데이터를 수집하고 그 안에서 패턴이나 결과를 확인하는 머신러닝이 발전하게 됨 

 

2) 머신러닝 종류 및 적용 예시 

▶ 머신러닝 종류

- Supervised Leaning(지도 학습): 문제와 정답을 알려주고 공부시키는 방법 -> 예측, 분류

└ 회귀는 숫자(y)를 예측하는 것이고, 분류는 범주(y=0, y=1 등)를 맞추는 것 
- Unsupervised Learning(비지도 학습): 답을 가르쳐주지 않고 공부시키는 방법 -> 연관 규칙, 군집

└ 군집: 어떤 기준에 맞춰 군집을 형성하는 것으로 기준에 따라 군집은 달라질 수도  

└ 연관 분석: 조건부 확률을 가지고 계산하는 것

- Reinforcement Learning(강화 학습): 상은 최대화, 벌은 최소화하는 방향으로 행위를 강화시키는 학습 -> 보상

 

머신러닝 적용 분야
- 금융: 신용평가, 사기탐지, 주식 예측 등
- 헬스케어: 질병 예측, 환자 데이터 분석 등
- 이커머스: 고객 구매 패턴 분석, 추천 시스템, 가격 최적화, 장바구니 분석 등
- (딥러닝) 자연어처리: 번역, 챗봇, 텍스트분석 등
- (딥러닝) 이미지&영상처리: 얼굴인식(snow AI), 이미지 생성 등

콜로라도 주립 박람회 대상 수상작: 스페이스 오페라극장

 

(cf1) Jupyter Notebook 이란?

- Data Science를 위한 환경으로 오픈소프트웨어 웹 어플리케이션

- 코드작성, 시각화, Markdown을 한 페이지에 작성 가능한 것이 장점  

- 노트북인 이유는? 

 : 자연과학, 공과 대학 등 실험을 기반으로 하는 연구에서 연구노트를 사용하는 것에서 유래

 : 기존 script 코드 파일은 메모 및 시각화 기능이 약하여 cell 기반 연구 노트북의 형태인 Jupyter Notebook이 개발됨

 : Jupyter Notebook 내 vscode, Colab, Anaconda 모두 탑재하여서 사용 가능 

 

(cf2) 단축키

- shift + enter: 코드 실행 후 아래 신규 코드 생성   

- ctrl + enter: 코드 실행 

- esc(cell 선택) + 알파벳 

 : A는 위쪽에 신규 셀 추가 / B는 아래쪽에 신규 셀 추가 

 : DD 셀 삭제

 : M은 마크다운 / Y는 파이썬 모드로 변경 

- 단축키 확인: ctrl + k + s

 

2. 선형회귀 

1) 선형회귀 들어가기 

① 몸무게와 키 데이터: 일정하게 증가하는 패턴 확인 > 몸무게를 통해 키를 예측할 수 있는 방법을 고안하고자 함 

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

 

② Error: 직선과 점의 간의 거리를 Error라고 정의. Error가 최소인 직선을 그리면 예측값의 정확도가 높아진다고 판단

└ Error 예시 

  · ①번 실제 데이터:187, 예측 데이터: 187 Error: 0

  · ②번 실제 데이터: 174, 예측 데이터: 181 Error: -7

  · ③번 실제 데이터: 174, 예측 데이터 : 169 Error: +5

└ (방법1) Error = 실제 데이터 값 - 직선의 예측 값의 합 

  · ① + ② + ③ = 0 + -7 + 5 = -2

  · 문제점: 음수와 양수의 수가 합해지면서 Error 값이 축소됨 

└ (방법2) Error = (실제 데이터 값 - 직선의 예측 값) 제곱의 합

  · ①² + ②² + ③² = 0 + 49 + 25 = 74

  · 문제점: 데이터가 늘어나면 에러값이 커지면서 정확도가 떨어지게 됨  

└ (방법3) Error = (실제 데이터 값 - 직선의 예측 값) 제곱의 합 / 데이터 개수 

 · ①² + ² + ③² / 1+1+1 = 0 + 49 + 25 / 3 = 24.7

 · 오차 합의 평균이라고 부름 

 

2) 선형회귀 이론

▶ 용어 및 수식 정리

- 선형회귀란?

└ 종속 변수 Y와 한 개 이상의 독립 변수 X와의 선형 상관 관계를 모델링하는 회귀분석 기법

└ 선형은 일자 직선 모양, 회귀는 주변에 퍼진 점이 선을 향해 돌아가려는 모양을 띄고 있음을 의미 

 

- 기초 용어  
└ Y는 종속 변수, 결과 변수 / 알고 싶은 값이자 x에 영향을 받는 값 

    · $y_{i}$: 개수가 i인 특정 데이터의 실제 값
    · $\bar{y}$: 평균 값
    · $\hat{y}$: 예측, 추정한 값
X는 독립 변수, 원인 변수, 설명 변수 /  y에 영향을 주는 값 

1차 방정식 그래프 식 : y = ax + b 

  · a는 기울기, b는 y절편(직선이 y축과 만나는 점)

 

- 통계학에서 사용하는 선형회귀 식

$$ Y = \beta_0 + \beta_1X + \varepsilon $$

  · $\beta_0$: 편향(Bias) 
  · $\beta_1$: 회귀 계수 
  · $\varepsilon$: 오차(에러), 모델이 설명하지 못하는 Y의 변동성

- 머신러닝/딥러닝에서 사용하는 선형회귀 식

$$ Y = wX + b $$

  · $w$: 가중치
  · b: 편향(Bias) / 통계학의 \beta_0과 \varepsilon를 합쳐서 편향이라고 부름 
     * 머신러닝/딥러닝 모델에서 오차 항은 명시적으로 다루지 않기 때문


- 선형회귀 수식이 갖는 함의는, 회귀 계수 혹은 가중치, 편향 값을 알면 X가 주어졌을 때 Y를 알 수 있다는 것

 └ 상기 몸무게와 키 데이터를 이용해서 선형회귀 식은 y = 0.86x + 109.37

 └ 즉, 몸무게가 1kg 증가할 때마다 키가 0.86 cm 증가한다는 해석이 가능해짐 

 

(cf1) 통계학 식에서 $\varepsilon$ 이 필요한 이유는? 

 : 선형회귀 식이 모든 데이터가 실제 데이터값 = 예측 데이터가 완벽하게 일치할 수 없으므로 에러 값을 표현하기 위함

(cf2) 가중치($w)$나 회귀 계수($\beta_1$)는 어떻게 구할 수 있나? 

: 데이터가 충분히 있다면 가중치 '추정' 가능한데, 그래프를 계속 그려서 에러를 최소화하는 직선을 구한다고 보면 됨

 

3) 회귀분석 평가 지표 

▶ MSE (Mean Squared Erorr)

- 같은 데이터 내에서 다른 모델을 비교할 때 주로 사용 (데이터 마다 단위가 다르므로) 

- 에러 정의 방법 수식화

└ 방법1) $\varepsilon = y_i - \hat{y_i}$ : 에러 = 실제 데이터 - 예측 데이터

방법2) $\sum\limits_{i=1}^n (y_i - \hat{y_i})^2$ : 에러를 제곱하여 양수로 만든 후 모두 더하기 

방법3) $\frac{\sum\limits_{i=1}^n (y_i - \hat{y_i})^2}{n}$ : 2) : 값을 데이터 개수 대로 나누기 

 

$$ MSE = \frac{\sum\limits_{i=1}^n (y_i - \hat{y_i})^2}{n} $$

 

* 대부분의 숫자 예측 문제는 어떤 모델이든 MSE 지표를 최소화하는 방향으로 진행하고 평가

 

- MSE 관련 기타 평가 지표

└ RMSE: MSE에 Root를 씌워 제곱된 단위를 다시 맞추기

$$ RMSE = \sqrt{\frac{\sum\limits_{i=1}^n (y_i - \hat{y_i})^2}{n}} $$

MAE: 절대 값을 이용하여 오차 계산하기

$$ MAE = \frac{1}{n}\sum\limits_{i=1}^n{\left\vert y_i - \hat{y_i} \right\vert} $$

 

R Square - 선형회귀만의 평가 지표

- R Square: 전체 모형에서 회귀선으로 설명할 수 있는 정도를 의미. 평균대비 설명력으로 0~1 사이 숫자로 1일수록 높음 

 

- R Square 수식 

$$ R^2 = \frac{SSR}{SST} = \frac{SSR}{SSR+SSE} $$

 

· SST(Sum of Squares Total): 실제값에서 평균값을 뺀 값의 제곱의 합. error + regression 을 합친 값

· SSE(Sum of Squares Error): 실제값에서 예측값을 뺀 값의 제곱의 합. 적을 수록 정확도 상승 

· SSR(Sum of Squares Regression): 예측값에서 평균값을 뺀 값의 제곱의 합. 클수록 정확도 상승

 

(예시) ③의 데이터 값

· SST = 174^2, SSR = 169^2, 해당 값에 대한 설명력 = 94%

 * 단, 모든 데이터에 대해서 위 계산을 수행

 

4) 선형회귀 적용

▶ 라이브러리 설치하기 

- 머신러닝 수행에 필요한 파이썬 라이브러리

└ scikit-learn: Python 머신러닝 라이브러리
numpy: Python 고성능 수치 계산을 위한 라이브러리
pandas: 테이블 형 데이터를 다룰 수 있는 라이브러리
└ matplotlib: 대표적인 시각화 라이브러리, 그래프가 단순하고 설정 작업 많음
└ seaborn: matplot기반의 고급 시각화 라이브러리, 상위 수준의 인터페이스를 제공


- 자주 쓰는 함수
sklearn.linear_model.LinearRegression: 선형회귀 모델 클래스(도)
  · coef_: 회귀 계수
  · intercept: 편향(bias)
  · fit: 데이터 학습
  · predict: 데이터 예측

 

▶(실습) 선형회귀 

더보기

Tips 데이터를 활용한 실습 

1. 머신이는 전체 금액에 따라 받을 수 있는 팁 금액이 예측 가능할지 회귀 분석 진행

# 라이브러리 불러오기
import sklearn 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


# 데이터 불러오기 
tips_df = sns.load_dataset('tips')
tips_df.head(3)


# 산점도 그려서 데이터 확인하기 
sns.scatterplot(data= tips_df, x = 'total_bill', y= 'tip')


# 모델 불러오고 x, y 변수 지정하기 
# x = total_bill # y = tip 
# 한 페이지 내에서 동일한 모델을 사용할 경우에는 변수를 다르게 지정해야
# 모델이 이미 기존 데이터로 학습을 마쳤기 때문에 

from sklearn.linear_model import LinearRegression
model_lr_for_tips = LinearRegression()

# DataFrame[]: Series(데이터 프레임의 칼럼)
# DataFrame[[]]: DataFrame
x = tips_df[['total_bill']]
y = tips_df[['tip']]


# 모델 적합(학습)하기 
# y(tip) = wi(coef_) * x(total_bill) + w0(intercept_) 수식에 맞춰 예측이 가능해짐!
model_lr_for_tips.fit(x, y) 

#가중치wi과 절편 w0 구하기
tips_w1 = model_lr_for_tips.coef_[0][0]
tips_w0 = model_lr_for_tips.intercept_[0]

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


# 예측값 생성 
y_true_tip = tips_df['tip']
# 예측값은 X값만 있어도 가능
y_pred_tip = model_lr_for_tips.predict(tips_df[['total_bill']])


# 평가하기 
# 평가 함수 불러오기 
from sklearn.metrics import mean_squared_error, r2_score

# MSE
mean_squared_error(y_true_tip, y_pred_tip)
# 1.036019442011377
# 키와 몸무게는 MSE가 10이었다? 그것은 단위가 다르기 때문
# 따라서 MSE는 같은 데이터에서 다른 모델을 비교할 때 사용 

# R-SQURE
r2_score(y_true_tip, y_pred_tip)
# 0.45661658635167657
# R스퀘어는 분야마다 기준치가 상이하나 높은 수치는 아니므로 모델을 바꿀 필요가 있을 수도


# 산점도 위에 선형회귀 선 그리기 
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')

 

(cf) 함수 찾기
① 구글링 -> 블로그 
 - 단점: 접근 가능한 블로그가 바뀌고 정보 형태가 일정하지 않음
② chatGPT LLM
 - 단점: 의존하면 공부를 안하고, 진위 여부 파악이 어려움
③ 공식문서
 - 장점: 일괄되게 정리되어 있고, 동일한 위치에 문서가 존재함. 
 - 단점: 읽기 어려움(초보자의 경우) 

 - 기본 용어 sklearn.linear_model.LinearRegression

 └ Parameters: 입력 함수값 

 └ Attributes:모델이 가진 속(coef_, intercept_ 등)

 └ Methods: 지원하는 기능 (fit, predict 등) 
④ 내장 함수 이용해서 helf(sklearn.linear_model.LinearRegression)

 

5) 선형회귀 심화

▶ 다중선형회귀

- 단순 회귀와 달리 x 변수가 2개 이상인 것을 다중 회귀라고 함 

단순선형회귀 vs 다항회귀

범주형 데이터 사용하기

① 수치형 데이터
  - 연속형 데이터: 두 개의 값이 무한한 개수로 나누어진 데이터 ex) 키, 몸무게
  - 이산형 데이터: 두 개의 값이 유한한 개수로 나누어진 데이터 ex) 주사위 눈, 나이       
② 범주형 데이터
  - 순서형 자료: 자료의 순서 의미가 있음 ex) 학점,등급
  - 명목형 자료: 자료의 순서 의미가 없음 ex) 혈액형, 성별

* 인코딩(Encoding): 머신러닝 모델에 성별, 날짜와 같은 범주형 데이터를 훈련시키기 위해 임의의 숫자로 바꾸는 과정 

 

(실습) 선형회귀 심화

더보기

Tips 데이터를 활용한 실습 (1.에 이어서)

2. 범주형 포함 2개 이상의 X변수로 선형회귀 

# 성별 함수 만들기 
# Female 0, Male 1
def get_sex(x):
    if x == 'Female':
        return 0
    else: 
        return 1
        
        
# apply 메소드는 매 행에 특정한 함수를 적용
# 데이터 전처리 시 apply를 많이 사용 
tips_df['sex_en'] = tips_df['sex'].apply(get_sex)
tips_df.head()


# 모델 가져와 변수 지정, 적합하기 
from sklearn.linear_model import LinearRegression
model_lr_for_poly = LinearRegression()

x_poly = tips_df[['total_bill', 'sex_en']]  # X변수에 2개 넣어주면 OK!
y_poly = tips_df[['tip']]

# fit에 넣기 전에 x, y값은 데이터 프레임에 넣어주기 
model_lr_for_poly.fit(x_poly, y_poly)


# 예측값 구하기 
y_pred_poly = model_lr_for_poly.predict(x_poly)


# 평가하기
# 단순선형회귀: X변수가 전체 금액 
# 다중선형회귀: 변수가 전체 금액, 성별  
print('MSE 단순선형회귀:', mean_squared_error(y_true_tip, y_pred_tip))
print('MSE 다중선형회귀:', mean_squared_error(y_true_tip, y_pred_poly))
print('R-SQUARE 단순선형회귀:', r2_score(y_true_tip, y_pred_tip))
print('R-SQUARE 다중선형회귀:', r2_score(y_true_tip, y_pred_poly))

# MSE 단순선형회귀: 1.036019442011377
# MSE 다중선형회귀: 1.0358604137213614
# R-SQUARE 단순선형회귀: 0.45661658635167657
# R-SQUARE 다중선형회귀: 0.45669999534149974

 

▶ 선형회귀 정리

- 선형 회귀의 가정  

 [!] 가정을 잘 따를수록 선형 회귀식이 잘 작동함 

 ① 선형성(Linearity)

 : 종속 변수(Y)와 독립 변수(X) 간에 선형 관계가 존재해야 함 

R-Square = 0.9

 ② 등분산성(Homoscedasticity)

 : 오차의 분산(떨어져 있는 정도)이 모든 수준의 독립 변수에 대해 일정해야 함

 : 즉, 오차가 특정 패턴을 보여서는 안 되며, 독립 변수의 값에 상관없이 일정해야 한다는 가정

 : 일정하지 않은 패턴을 보일 경우 모델은 데이터 특성이 잘못 세워진 것

 

X축:독립변수 Y축: 오차(에러)


③ 정규성(Normality)

 : 오차 항(잔차Residual, 실제값에서 예상값을 뺀 값)은 정규 분포를 따라야 함  

 

 

 

④ 독립성(Independence)

 : X변수는 서로 독립적이어야 함

 : 다중 회귀 시 다중공선성 문제*가 발생함

🌰 다중공선성(Multicolinearity) 문제
회귀분석에서 독립변수(X) 간의 강한 상관관계가 있는 것. 여러 변수multi가 같이co 선형성linearity을 띈다는 의미. 변수가 많아지면 서로 연관이 있는 경우가 많은데, 이를테면 키와 몸무게로 발사이즈(y)를 예측한다면 서로 연관성이 있어 다중공선성 문제가 나타남 

 

└ 다중공선성 해결방법
  : 서로 상관관계가 높은 변수 중 하나만 선택(산점도 혹은 상관관계 행렬) ex. pair plot, hitmap
  : 두 변수를 동시에 설명하는 차원축소(Principle Component Analysis, PCA) 실행하여 변수 1개로 축소

 

pairplot 기능을 이용한 산점도

 

heatmap을 이용한 상관관계 행렬
PCA를 이용한 차원축소

 

 

- 선형 회귀 요약

└ 장점
   : 직관적이며 이해하기 쉽고, X-Y관계 정량화 가능 
   : 모델의 빠른 학습 (가중치 계산이 빠름) - 행렬 계산을 함
단점
   : X-Y간의 선형성 가정이 필요
   : 평가지표가 평균(mean) 포함 하기엔 이상치에 민감
   : 범주형 변수를 인코딩 시 정보 손실 발생 
Python 패키지: sklearn.linear_model.LinearRegression

 

 

3. 로지스틱회귀 - 분류분석

1) 로지스틱회귀 이론

▶ 타이타닉 생존 분류 문제 

- Kaggle 타이타닉 예측 대회 https://www.kaggle.com/c/titanic
└ 주제: 탑승한 승객의 정보를 바탕으로 생존 유무를 예측하는 분류 문제
Y(종속변수): 사망(0), 생존(1)
 X(독립변수): 티켓등급, 성별, 요금 등

 

▶ 로지스틱회귀 이론

- Y가 범주형일 경우 선형함수의 한계

 

└ X가 연속형 변수이고, Y가 특정 값이 될 확률(범주)일 경우, 확률은 0과 1사이 값이므로 S자 형태가 적합 

 

- S형태의 함수를 만들기 위한, 로짓의 개념의 등장

└ 오즈비(Odds ratio)

$$ 오즈비(odds\ ratio) = \frac{P}{1-P} $$

 

  : 실패확률 대비 성공확률로 승산비라고도 불림. 도박사들이 자주 쓰는 개념 

  : 도박 성공 확률이 80%라면, 오즈비는 80%/20% = 4. 즉, 1번 실패하면 4번은 딴다는 의미 

  : (문제점) 오즈비는 P = 0 이면 0 , P = 0.9면 9, P = 1이면 분모가 0이되면서 발산을 함(급격히 증가)

 

└ 로짓(Logit)

$$ Logit = \log(\frac{P}{1-P}) $$

  : 오즈비는 P값 증가에 따른 상승폭이 너무 급격하고, 선형성을 따르지 않는 문제가 있어 오즈비에 log를 씌움

  : 로짓 그래프는 선형적인 그림을 나타내어 선형회귀의 기본식을 활용할 수 있게 됨 (우변에 선형회귀식 넣어서)

    · 숫자를 맞추는 개념이 아님에도 로지스틱'회귀'라고 불리는 이유가 이것

 

확률이 증가할수록 (좌)오즈비는 급격히 발산, (우) 로짓은 완만하게 증가

- 로지스틱 함수 

$$ P = \frac{1}{1+e^{-Logit}} $$

 : 로짓식을 P에 대해서 정리한 것 

 : 어떤 값을 가져오더라도 특정 값일 확률 값이 0과 1안으로 들어오게 하는 것이 특징 (0과 1로 수렴) 

 : 확률이 얼마 이상이면 1이고, 얼마 이하면 0이라는 기준, 즉 임계값을 둬야 함 

 : 확률을 높일 수 있는 로짓값에 대한 정보가 많아질수록 그래프가 우측으로 이동하는 성질이 있음(반대는 좌측) 

로짓 그래프의 X-Y축 교체하여 Y축에 확률이 오도록 변형

 

└ 로지스틱함수를 분류 예측에 활용하는 방법 

 : 가중치 값을 안다면 로지스틱함수로 X값이 주어졌을 때 해당 사건이 일어날 수 있는 P의 확률 계산 가능

 : 확률 0.5 기준 보다 높으면 사건이 일어남(P(Y) = 1), 낮으면 사건이 일어나지 않음(P(Y) = 0)으로 판단 > 분류 예측

 : 분류 예측 식 도출 방법 

   ① 로짓과 기존 선형회귀의 우변을 합쳐 다음과 같은 식을 도출

$$ log(\frac{P}{1-P}) = w_0+w_1X $$

 

   (cf) 왜 로짓 우변에 선형회귀식을 붙이나??

     · Y값이 범주형일 때 선형회귀식 y = w0 + w1 * x 가 문제였던 이유는 y가 0~1사이 값으로 나오지 않기 때문임.

     · 선형회귀식의 y값에 로짓을 넣어서, y축에 사건이 일어날 확률(0~1)이 나오도록 계산

 

   ② 양변에 자연지수 $e$를 취하면

$$ \frac{P}{1-P} = e^{w_{0} + w_{1}X} $$

 

   ③ 해석: X값이 $w_1$만큼 증가하면 오즈비는 $e^{w_1}$만큼 증가한다.

 

(cf) 로지스틱회귀는 어떤 자료형을 쓸 수 있을까? 

- 상기 로지스틱회귀는 x = 연속형, y = 이진분류(0, 1) 예시이나 다른 조건도 분류 예측 가능! 

- x = 연속형, 이진분류 등으로 여러 개이거나, y = 다중분류(softmax)도 가능

 └ 다중분류는 a일 때, b일 때, c일 때의 확률을 예측해주나 전체 합은 1이 되어야 함

 

2) 분류 평가 지표

(예시) 데이터 분석가 러닝이는 귀찮은 나머지 모든 환자를 정상이라고 판정하는 암 예측 진단소프트웨어를 개발해 납품

 └ 암 예측 모델 설계: 무조건 환자가 음성(정상인)이라고 판정
 └ 실제 데이터: 100명의 입실 환자 중 95명은 음성(정상), 5명은 양성(암 환자)

 

▶ 혼동 행렬(confusion Matrix)

- 개념: 실제 값과 예측 값에 대한 모든 경우의 수를 표현하기 위한 2x2 행렬

- 표기법
└ 실제와 예측이 같으면 True / 다르면 False
예측을 양성으로 했으면 Positive / 음성으로 했으면 Negative
- 해석
TP: 실제로 양성(암 환자)이면서 양성(암 환자) 올바르게 분류된 수
FP: 실제로 음성(정상인)이지만 양성(암 환자)로 잘못 분류된 수
FN: 실제로 양성(암 환자)이지만 음성(정상인)로 잘못 분류된 수
TN: 실제로 음성(정상인)이면서 음성(정상인)로 올바르게 분류된 수

 

러닝이 암 예측 모델의 혼동 행렬 예시

 

▶ 정확도

$$ 정확도(Accuracy) = \frac{TP+TN}{TP+TN+FP+FN} $$

 

- 상기 수식에 따르면 95/100로 암 예측 모델의 정확도는 95%

- 실제로 정확도는 높은 것 같으나 실제로 양성(암 환자)는 하나도 못 맞춤 (한계)

 

F1 - Score

: 정확도가 제 기능을 못할 때, 특히 Y값이 불균형할 때 필요한 지표 

: Y범주의 비율을 맞춰주거나 평가 지표를 f1 score을 사용함으로써 정확도를 보완

 

① 정밀도(Precision): 모델이 양성 1로 예측한 결과 중 실제 양성의 비율(모델의 관점) 

$$ 정밀도(precision) = \frac{TP}{TP+FP} $$

> 머신이 예시에서 정밀도는 0/0 이므로 정의되지 않음 (divsion by zero) 

 

② 재현율(Recall): 실제 값이 양성인 데이터 중 모델이 양성으로 예측한 비율(데이터의 관점)

 

$$ 재현율(Recall) = \frac{TP}{TP+FN} $$

> 머신이 예시에서 재현율은 0/95 이므로 0 

 

③ f1-Score: 정밀도와 재현율의 조화 평균

 

$$ f1-score = 2*\frac{정밀도*재현율}{정밀도+재현율} $$

 

> 머신이 예시에서 f1-Score는 결국 0

 

 

3) 로지스틱회귀 실습

 자주 쓰는 로지스틱회귀 함수
 └ 클래스

  · sklearn.linear_model.LogisticRegression: 로지스틱회귀 모델
 └ 속성
  · classes_: 클래스(Y)의 종류
  · n_features_in_: 들어간 독립변수(X) 개수
  · feature_names_in_: 들어간 독립변수(X)의 이름
  · coef_: 가중치
  · intercept_: 바이어스
 └ 메소드
  · fit: 데이터 학습
  · predict: 데이터 예측
  · predict_proba: 데이터가 Y = 1일 확률을 예측
 └ 메트릭(검증)

  · sklearn.metrics.accuracy: 정확도

  · sklearn.metrics.f1_socre: f1_score

 

▶ (실습) 로지스틱회귀

└ 타이타닉 데이터를 토대로 각 변수에 따른 생존 여부 예측하기 

└ 변수 예시

  · 숫자: Age, Sibsp, Parch, Fare
  · 범주형: Pclass, Sex, Cabin(결측치 많음), Embarked

더보기

(1차) 단순 로지스틱회귀

- x : Fare / y : Survived

- 평가: 정확도, F-SCORE

import pandas as pd
import sklearn
import seaborn as sns 

# 파일 불러오기 
# 오류 시 경로 내 역슬래쉬 > 슬래쉬로 바꾸고, encoding='utf-8' 추가
titanic_df = pd.read_csv('phython/ML/titanic/train.csv', encoding='utf-8')

# info(): 데이터에 대한 결측치, 데이터 전체 개수 등 확인 
titanic_df.info(2)

# 데이터 기술 통계를 보는 법(수치형) 
titanic_df.describe()

# 요금과 생존에 대한 산점도를 먼저 보면, 유의미한 결과를 보기 어려움
# 요금이 어떤 분포를 하고 있는 먼저 살펴볼 필요가 있음  
sns.scatterplot(data=titanic_df, x= 'Fare', y= 'Survived')

# 요금의 분포 확인 시 10달러 내외 구간이 몰려 있음
sns.histplot(data=titanic_df, x= 'Fare')


# 모델 불러오기, 변수 지정 및 적합하기 
from sklearn.linear_model import LogisticRegression
model_lor = LogisticRegression()

x_1 = titanic_df[['Fare']]
y_true = titanic_df[['Survived']]

model_lor.fit(x_1, y_true)


# 자주 쓰는 속성에 대한 함수 작성
def get_att(x): 
    # x모델을 넣기
    print('클래스 종류', x.classes_)
    print('독립변수 개수', x.n_features_in_)
    print('들어간 변수(x)의 이름', x.feature_names_in_)
    print('가중치', x.coef_)
    print('바이어스', x.intercept_)
   
get_att(model_lor)  
# model_lor.classes_   # 클래스 종류 [0 1]
# model_lor.n_features_in_    # 독립변수 개수 1
# model_lor.feature_names_in_    # 들어간 변수(x)의 이름 ['Fare']
# model_lor.coef_    # 가중치 [[0.01519666]]
# model_lor.intercept_    # 바이어스 [-0.94131796]


# 메트릭 불러와서 정확도 측정 + 함수 이용
from sklearn.metrics import accuracy_score, f1_score
def get_metrics(ture, pred):
    print('정확도', accuracy_score(ture, pred))
    print('fi-score', f1_score(ture, pred))

y_pred_1 = model_lor.predict(x_1)
get_metrics(y_true, y_pred_1)

# 정확도 0.6655443322109988
# fi-score 0.35497835497835495

 

(2차) 단순 로지스틱회귀

- x : Pclass, Sex, Fare / y : Survived

평가: 정확도, F-SCORE

# y : Surevived
# X(수치형): Fare
# X(범주형): Pclass, Sex

# 성별은 문자형으로 되어 있어서 숫자로 바꿔야 함
def get_sex(x):
    if x == 'female':
        return 1
    else:
        return 0
# 인코딩 성별 정보 df 새로운 칼럼에 저장 
titanic_df['Sex_en'] = titanic_df['Sex'].apply(get_sex)


# 새로운 변수 및 모델 지정 후 적합
x_2 = titanic_df[['Pclass', 'Sex_en', 'Fare']]
y_true = titanic_df[['Survived']]

model_lor_2 = LogisticRegression()
model_lor_2.fit(x_2, y_true)


# 속성 리스트 함수 활용해 모델 학습 내용 확인
get_att(model_lor_2)

# 클래스 종류 [0 1]
# 독립변수 개수 3
# 들어간 변수(x)의 이름 ['Pclass' 'Sex_en' 'Fare']
# 가중치 [[-8.88333645e-01  2.53991713e+00  1.64020329e-03]]
# 바이어스 [0.48011703]


# 예측값 확인
y_pred_2 = model_lor_2.predict(x_2)


# 평가하기
get_metrics(y_true, y_pred_2)
# 정확도 0.7867564534231201
# fi-score 0.7121212121212122


# 로지스틱은 확률을 구하는 것이기 때문에, 확률 예측도 가능! 
# 각 데이터별 y가 1일 확률 뽑아내기 (생존할 확률)
model_lor_2.predict_proba(x_2)

# predict_proba는 2차원 구조로 반환
# predict_proba 결과: array([[0.89779787, 0.10220213], [0.0954686 , 0.9045314 ], ..., [0.8977226 , 0.1022774 ]])
# predict 결과: array([0, 1, ... 1], dtype=int64)
# 1번째 사람은 살 활률이 90%로 죽었다(0)고 판단, 
# 2번째 사람은 살 확률이 9%로 살았다(1)고 판단

 

▶ 로지스틱회귀 정리

: 선형회귀의 아이디어에서 종속변수(Y)만 가공한 것이기 때문에 장,단점이 유사함
└ 장점: 역시 직관적이며 이해하기 쉽다.
단점: 복잡한 비선형 관계를 모델링 하기 어려울 수 있음

Python 패키지: sklearn.linear_model.LogisticRegresson

 

4) 모델링 기본 마무리 

- 회귀와 분류 정리

구분 선형회귀(회귀) 로지스틱회귀(분류)
공통점 - 모델 생성이 쉬움
- 가중치(혹은 회귀계수)를 통한 해석인 쉬움
- x 변수에 범주형, 수치형 변수 둘 다 사용 가능 
Y(종속변수) 수치형 범주형
평가척 Mean Square Error(MSE)
R Square(선형 회귀만)
Accuracy
F1 - score
sklearn 모델 클래스 sklearn.linear_model.linearRegression sklearn.linear_model.LogistricRegression
sklearn 평가클래스 sklearn.metrics.mean_squared_error
sklearn.metrics.r2_score
sklearn.metrics.accuracy_score
sklearn.metrics.f1_score

 

 

[(cf) 데이터 분석 프로세스