뮤트 개발일지

AIFFEL 아이펠 20일차 본문

AIFFEL

AIFFEL 아이펠 20일차

박뮤트 2022. 1. 25. 18:27

선형 회귀와 로지스틱 회귀

회귀Regression

연속형 변수 간의 관계를 모델링하고 이에 대한 적합도를 측정하는 분석 방식

선형 회귀 분석Linear Regression: 두 변수 사이의 관계를 직선 형태로 가정하고 분석하는 것

분류: 데이터 x의 여러 feature 값들을 이용해 해당 데이터의 클래스 y를 추론하는 것

회귀: 데이터 x의 여러 feature 값들을 이용하여 연관된 다른 데이터 y의 정확한 값을 추론하는 것

 

선형 회귀 분석 Linear Regression

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

한 개의 독립변수를 갖고 있으면 단순 선형 회귀, 둘 이상의 독립변수를 갖고 있으면 다중 선형 회귀라고 부른다.

1. 선형 회귀 모델링

선형 회귀식:

β: 회귀계수

ϵ: 종속 변수와 독립 변수 사이의 오차

선형회귀 모델을 찾는다는 것: 주어진 데이터에 선형 식이 잘 맞도록 회귀계수 및 오차를 구하는 것

 

2. 머신러닝 모델에서의 선형회귀모델 표기법

H: 가정Hypothesis

W: 가중치Weight

b: 편향bias

W,b는 고차원의 행렬 형태를 띄고 있는 경우가 많고, 이 파라미터 개수가 많을 수록 모델의 크기가 커지고 학습이 어려워진다.

 

3. 용어 설명

잔차Residuals: 회귀모델을 이용해 추정한 값과 실제 데이터의 차이 의미

최소제곱법: 잔차를 이용해 주어진 점 데이터들을 가장 잘 설명하는 회귀모델을 찾는 대표적인 방법

최소제곱법 정의

n개의 점 데이터에 대하여 잔차의 제곱의 합을 최소로하는 W,b를 구하는 방법

회귀모델이 잘 결정되었는지 확인할 때 참고하는 지표로 결정계수(R-squared or R2 score로 표기)가 있다. 0에서 1 사이의 값으로 나타나고, 1에 가까울수록 해당 회귀모델이 데이터를 잘 표현하고 있다고 볼 수 있다.

=> Boston dataset의 각각의 attribute에 선형 회귀 모델을 구해보고, 이 모델의 결정계수를 확인하자!

 

4. 데이터셋 준비하기 Boston house prices dataset

사이킷런에서 기본으로 제공하는 Boston house prices dataset 사용

from sklearn.datasets import load_boston
from sklearn import model_selection
import pandas as pd
import numpy as np

# 데이터 로드
boston = load_boston()
data, price = boston['data'], boston['target']
x_train, x_test, y_train, y_test = model_selection.train_test_split(data, price, test_size=0.2)

df = pd.DataFrame(x_train, columns=boston['feature_names'])

=> 506 rowm 13가지 attribute로 구성, row에 대응되는 가격price의 값이 price에 저장되어 있음

# 각 attribute에 대한 설명 확인
print(boston["DESCR"])

5. Boston dataset에 Linear Regression 적용하기

# Boston dataset의 각 attribute에 선형회귀 적용하는 예제
import pandas as pd
from sklearn import datasets
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
from sklearn import metrics
from sklearn import datasets
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,35))
fig.suptitle('Boston dataset - (X:Y = each attr: price) with R2', fontsize=16, y=0.9)

for i in range(data.shape[1]): # boston dataset에서 i번째 attribute(column)을 살펴볼 거에요.

    single_attr, attr_name = data[:, i].reshape(-1, 1), boston['feature_names'][i] # i번째 attribute에 대한 data 및 이름
    estimator = LinearRegression() # 선형 회귀 모델이에요.

    #x에는 single_attr, y에는 price에 해당하는 데이터를 대입해서 최소제곱법을 이용하여 모델 내에서 W, b를 구하는 과정이에요
    estimator.fit(single_attr, price) 

    #위 fit() 과정을 통해 구한 회귀계수를 기반으로 회귀모델에 X값을 대입했을 때의 예측 Y 값이에요. 
    pred_price = estimator.predict(single_attr)

    score = metrics.r2_score(price, pred_price) # 결정계수를 구하는 함수에요. 

    # 캔버스 생성
    ax = fig.add_subplot(7, 2, i+1)
    ax.scatter(single_attr, price) # 실제 데이터에 대한 산포도
    ax.plot(single_attr, pred_price, color='red') # 선형회귀모델의 추세선
    ax.set_title("{} x price, R2 score={:.3f}".format(attr_name ,score)) #subplot의 제목이에요
    ax.set_xlabel(attr_name) # x축
    ax.set_ylabel('price') # y축

6. 경사하강법 Gradient Descent Algorithm

https://lsh424.tistory.com/9

α: learning rate. 이 값이 클수록 그림의 화살표의 길이가 길어져 빠른 수렴이 가능하다. 그러나 learning rate가 너무 크면 최적의 W값을 건너뛰어 오히려 수렴하지 못하는 경우도 생기기 때문에 적절한 값을 선정하는 것이 중요하다.

 

로지스틱 회귀분석 Logistic Regression

데이터가 어떤 범주에 속할 확률을 0~1 사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하도록 분류해주는 지도학습 알고리즘이다. 1개 이상의 독립변수가 있을 때 이를 이용하여 데이터가 2개의 범주 중 하나에 속하도록 결정하는 이진분류 문제를 풀 때 많이 사용한다.

1. 정의 및 용어 설명

Odds: 사건이 발생할 확률 / 발생하지 않을 확률

(예) 악성 종양일 확률이 0.2일 경우 양성 종양일 확률은 0.8로 Odds를 계산할 수 있다. 다음식->

위 값에 log를 취한 값이 Log-Odds이다.

그러나 우리가 실제로 필요한 값은 log-odds의 값이 아닌 종속변수가 0일 확률, 1일 확률 자체이다. 그래서 log-odds로부터 특정 범주에 속할 확률을 얻기 위해 다시 정리하면,

이고,

로 한다면,

로 간결하게 표현할 수 있다.

 

2. 데이터 개요

(유방암 데이터셋 사용)

# 로지스틱 회귀분석 예제: 유방암 데이터셋
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# 데이터 로드
cancer=load_breast_cancer()

# y = 0(Malignant - 악성 종양), y=1(Benign - 양성 종양)
cancer_X, cancer_y= cancer.data, cancer['target']
train_X, test_X, train_y, test_y = train_test_split(cancer_X, cancer_y, test_size=0.1, random_state=10) # train 데이터셋과 test 데이터셋으로 나눔
print("전체 검사자 수: {}".format(len(cancer_X)))
print("Attribute 수: {}".format(len(cancer_X[0])))
print("Train dataset에 사용되는 검사자 수: {}".format(len(train_X)))
print("Test dataset에 사용되는 검사자 수: {}".format(len(test_X)))
cancer_df = pd.DataFrame(cancer_X, columns=cancer['feature_names'])
cancer_df.head()

>>> 
전체 검사자 수: 569
Attribute 수: 30
Train dataset에 사용되는 검사자 수: 512
Test dataset에 사용되는 검사자 수: 57

3. 로지스틱 회귀분석 예제

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

LR = LogisticRegression() #로지스틱 회귀분석
LR.fit(train_X, train_y) # 유방암 train data를 이용하여 로지스틱 회귀분석 모델 학습
pred = LR.predict(test_X) # 학습된 로지스틱 회귀분석 모델을 이용한 예측값 출력


# 로지스틱 회귀분석 모델의 예측값과 실제값 비교결과를 나타낸 통계표
print(classification_report(test_y, pred))

LogisticRegression()을 사용하면 log-odds를 생략하고 precisoin, recall로 유방암 데이터셋에 대한 분류를 할 수 있는 로지스틱회귀모델을 학습할 수 있다.

 

Softmax 함수

2가지가 아닌 여러 범주로 분류하는 함수

softmax 함수 정의

특징

 - 각 범주의 확률값이 0~1 사이의 값이다.

 - 모든 범주에 해당하는 softmax의 값을 더하면 1이된다.

 - 큰 log-odds와 작은 log-odds의 차이를 극대화시켜준다.

=> 가장 큰 값을 1, 그 외의 값을 0으로 인코딩하는 one-hot encoding을 통해 표현한다.

 

Cross Entropy 

 

cross entropy 함수 식

softmax 함수의 손실함수로 쓴다.

가중치가 최적화될수록 H(p,q)의 값이 감소하는 방향으로 가중치 학습이 된다.

p(x)는 실제 데이터의 범주 값, q(x)는 softmax의 결과값을 대입한다.

cross entropy는 로지스틱 회귀모델이 추론한 확률 분포 q(x)와 실제 데이터의 분포 p(x)의 차이를 게산한 것으로 차이가 적을수록 cross entropy는 작아진다.

읽을거리...

https://theeluwin.postype.com/post/6080524

 

왜 크로스 엔트로피를 쓸까?

(본 글은 유투브 영상을 글로 재구성 한 것입니다.) 머신러닝/딥러닝을 하다보면 크로스 엔트로피(cross entropy)가 자주 등장합니다. 정확히는, 분류(classification) 문제를 풀 때 크로스 엔트로피를 이

theeluwin.postype.com

https://3months.tistory.com/436

 

Cross-entropy 의 이해: 정보이론과의 관계

Cross-entropy 의 이해: 정보이론과의 관계 1. 손실함수로서의 Cross-entropy 딥러닝에서 분류 모델에 대한 손실 함수로 cross-entropy 혹은 binary entropy 나 log loss 라는 것을 사용하게 된다. 손실함수로서의..

3months.tistory.com

'AIFFEL' 카테고리의 다른 글

AIFFEL 아이펠 22일차  (0) 2022.01.26
AIFFEL 아이펠 21일차  (1) 2022.01.26
AIFFEL 아이펠 19일차  (0) 2022.01.25
AIFFEL 아이펠 18일차  (0) 2022.01.25
AIFFEL 아이펠 17일차  (0) 2022.01.25