통계학에서 전통적으로 많이 사용되던 방법으로 여러 데이터를 기반으로 연속형 변수 간의 관계를 모델링하고 적합도를 측정하는 방법
독립변수와 종속변수 사이에 상호 관련성을 규명하는 것
선형 회귀분석의 기본 가정
선형 회귀분석의 기본 가정 내로 문제가 들어온다면 회귀분석을 먼저 해보는 것이 좋음
1)선형성
선형인지 비선형인지
2)독립성
독립성 : 독립 변수들 간의 통계적 독립성 (비 다중공선성)
3)등분산성
등분산성이란 분산이 같다는 것이고, 분산이 같다는 것은 특정한 패턴 없이 고르게 분포했다는 의미
4)정규성
정규성은 정규분포를 띄는지 여부를 의미
선형 회귀의 모델링
y=βx+ϵ
β는 회귀계수, ϵ는 종속변수와 독립변수 사이의 오차
선형회귀 모델링은 주어진 데이터에 선형 식이 잘 맞도록 회귀계수 및 오차를 구하는 것
조금은 다른, 머신러닝에서의 선형회귀 모델 표기법
H=Wx+b
H는 가정(Hypothesis), W는 가중치, b는 편향
여기에서 W나 b는 스칼라가 아닌 고차원의 행렬의 형태
용어 설명
잔차(Residuals) : 회귀모델을 이용해 추정한 값과 실제 데이터의 차이
y=2x + 3일 때 실제값은 8, x=2의 y가 7이 나왔을때 8-7=1의 잔차값 발생
최소제곱법
n개의 점 데이터에 대해서 잔차 제곱의 합이 최소가 되는 W와 b를 구하는 방법
머신러닝에서는 최소제곱법과 같은 회귀계수를 구하는 과정에 쓰는 함수를 손실함수(Loss fuction)이라고 함
회귀모델의 평가 지표
결정계수(R-squared or R2 score)
0과 1사이로 표현하며 1에 가까울수록 해당 회귀모델이 데이터를 잘 표현
Linear Regression 예제
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'])
print("boston dataset dimension: ", data.shape)
print("price dimension: ", price.shape)
print("boston train dataset dimension: ", x_train.shape)
print("boston test dataset dimension: ",x_test.shape)
print("Boston dataset")
df.head()
Linear Regression 적용
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]):
single_attr, attr_name = data[:, i].reshape(-1, 1), boston['feature_names'][i] #i번째 attribute의 data, 이름
estimator = LinearRegression()
estimator.fit(single_attr, price)
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))
ax.set_xlabel(attr_name)
ax.set_ylabel('price')
결과에서 R2 score가 높은 편에 속하는 선일수록 데이터를 잘 설명하고 있음
경사하강법
주어진 데이터에 대해 손실함수를 최소화하는 W와b를 구하는 것이 핵심
최소화 할 때 기준이 가중치의 그래디언트(미분값)이 최소가 되는 지점이 손실함수의 최소점
α: learning rate
로지스틱 회귀분석(Logistic Regression)
로지스틱 회귀분석이란?
데이터가 어떤 범주에 속할 확률을 0에서 1사이의 값으로 예측하고 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해 주는 지도학습 알고리즘
특징
- 선형회귀 분석인데 Y값이 확률로 고정되어 하한 상한이 [0,1] 사이로 정해져있음
- 특정 threshold 값을 기준으로 예측된 확률 값이 threshold 이상과 미만인 것으로 분류
- 1개 이상의 독립변수가 있을 때 이를 이용하여 데이터가 2개의 범주 중 하나에 속하도록 결정하는 이진 분류(binary classification)문제를 풀때 로지스틱 회귀분석이 자주 사용됨
로지스틱 회귀식
종속변수가 0일 확률이 P(y=O|x)일 때
Odd 개념은 사건이 발생할 확률을 발생하지 않을 확률로 나눈 값. 유방암 데이터셋을 예로 할 경우
악성 종양의 확률이 0.2일 때 양성 종양일 확률은 0.8
위의 식에 log 적용시 Log-odds 인데, 결국 log-odds값을 선형회귀분석의 종속변수(y)처럼 구하면 됨
여기서 구한 LogOdds의 식을 다시 종속변수가 0일 확률이 P(y=O|x)일 때의 식에 정의
식이 복잡해보이니 변수z로 정리하면
공부하다보니 로지스틱 회귀함수가 갑자기 시그모이드 활성화 함수가 되었다
z=0인 지점을 중심으로 범주간 경계가 불명확해지는 x(0.3 < p < 0.7)을 최소화하기 때문에 분류모델 성능 향상
로지스틱 회귀가 특정 범주에 속할 확률의 예측 3단계
1. 실제 데이터를 대입하여 Odds 및 회귀계수를 구함
2. Log-odds를 계산 후 sigmoid function의 입력으로 넣어서 특정 범주에 속할 확률 값 계산
3. 설정한 threshold에 맞추어 설정 값 이상이면 1, 이하면 0으로 이진 분류 수행
Logistic Regression 예제
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
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)
print("전체 검사자 수: {}".format(len(cancer_X)))
print("Attribute number: {}".format(len(cancer_X[0])))
print("Train dataset num of inspection in train {}".format(len(train_X)))
print("Test dataset num of inspection in test {}".format(len(test_X)))
cancer_df = pd.DataFrame(cancer_X, columns=cancer['feature_names'])
cancer_df.head()
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
LR = LogisticRegression()
LR.fit(train_X, train_y)
pred = LR.predict(test_X)
print(classification_report(test_y, pred))
Softmax 함수와 Cross Entropy
로지스틱회귀는 이진 분류뿐 아니라 다중 로지스틱 회귀로 확장 가능
Softmax
Softmax function의 정의
Softmax function의 특징
- 각 범주의 확률 값이 0에서 1사이의 값
- 모든 범주에 해당하는 softmax의 값을 전부 더하면 합이 1
- 큰 log-odds와 작은 log-odds의 차이를 극대화
- 가장 큰 값이 1, 나머지 값들은 0으로 인코딩하는 one hot encoding
Cross Entropy
Cross entropy의 정의
Cross entropy의 특징
- 손실함수 이므로 가중치가 최적화 될수록 H(p,q)의 값이 감소하는 방향으로 가중치 학습
- p(x)는 실제 데이터 범주 값 q(x)는 softmax의 결과값 대입
- 선형회귀의 경우 잔차제곱은 추정치와 실제 값의 거리를 측정하기에 적절하지만 로지스틱 회귀에서는 확률변수이므로 잔차 제곱의 형태는 바람직하지 않음
Softmax, Cross entropy 예제
단순 로지스틱 회귀의 형태
import tensorflow as tf
from tensorflow import keras
n_dense = 30
n_train_epoch = 20
num_classes = 2 # 악성, 양성
model = keras.models.Sequential()
model.add(keras.layers.Dense(num_classes, use_bias=True, activation='softmax', input_shape=(30,)))
model.summary()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_X, train_y, epochs=n_train_epoch)
test_loss, test_accuracy = model.evaluate(test_X, test_y, verbose=1)
print("test_loss: {}".format(test_loss))
print("test_accuracy: {}".format(test_accuracy))
딥러닝의 형태(Dense 부여)
import tensorflow as tf
from tensorflow import keras
n_dense = 30
n_train_epoch = 20
num_classes = 2
model = keras.models.Sequential()
model.add(keras.layers.Dense(n_dense, input_shape=(30,),use_bias=True))
model.add(keras.layers.Dense(n_dense, use_bias=True))
model.add(keras.layers.Dense(n_dense, use_bias=True))
model.add(keras.layers.Dense(num_classes, use_bias=True, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_X, train_y, epochs=n_train_epoch)
test_loss, test_accuracy = model.evaluate(test_X, test_y, verbose=1)
print("test_loss: {}".format(test_loss))
print("test_accuracy: {}".format(test_accuracy))
마무리
선형회귀분석이 흐르고 흘러서 딥러닝까지 오게 되는 모습이 한편의 연구 역사를 보는 것 같았고
그동안 코드 위주의 실습 예제와 간단한 설명만 있었는데, 수학 수식과 함께 왜 이렇게 풀어가는지에 대한 설명을
자세히 해두어서 이해하기가 수월했고, 너무 이론만 있으면 심심한데 중간중간 실제 예제를 통해서 실습까지하니
정말 좋았다
로지스틱 회귀분석이 시그모이드 함수로 이어지는 것도, 사용은 하지만 이론적으로 이어지는 내용임을 알게되니
이해가 좀 더 풍부해진 느낌!
'23년 이전 글 > 모두의연구소 아이펠' 카테고리의 다른 글
-22일차- 비지도 학습 (0) | 2022.01.26 |
---|---|
-21일차- 조금은 큰 고양이와, 맹수와 인셉션 댕댕이 (0) | 2022.01.25 |
-18일차- 딥러닝과 신경망 (0) | 2022.01.19 |
아이펠 인공지능 교육과정 중간 회고 (0) | 2022.01.14 |
- 14일차 - 야너두 작사가 될 수 있어 (3) | 2022.01.13 |