지금까지 선형회귀.
대부분 다중선형회귀 방식으로
모델을 훈련시키고
예측값을 도출했는데요.
이번에는 회귀 모델이 아닌
분류 모델에 대해서 알아보겠습니다.
첫번째로 이중분류를 파헤쳐보겠습니다.
1. 이중분류 파헤치기
회귀모델에서는 다양한 수치를 예측했다면
이중분류 모델은
참 인지 거짓인지 둘 중 하나를 도출하는 것입니다.
아직은 명확하지 않아서
해당 포스팅에서 정리를 잘 해주셔서 이 포스팅으로 학습해보겠습니다.
https://yhyun225.tistory.com/12
분류 (1) - 이진 분류(Binary Classification)와 로지스틱 회귀(Logistic Regression)
분류 모델은 데이터를 분류하는 방법을 학습합니다. 분류 모델은 크게 이진 분류(Binary Classification)와 다중 분류(Multi Classification)로 나뉩니다. - 이진 분류(Binary Classification)는 입력값에 따라 모델
yhyun225.tistory.com
분류는 크게 이진분류, 다중분류로 나뉜다고 합니다.
그 중 이진분류는 입력값에 대한 모델의 예측값이
두가지가 나온다고 하네요.
암종양 분류 모델에 빗대어 설명해주셨습니다
"암 종양인가? (True), 암 종양이 아닌가 (False)"
이중 분류에는
이 로지스틱 회귀(Logistic Regression)방식이 사용된다고 합니다.
이 모델을 거치면 선형인 데이터가
비선형으로 바뀌게 됩니다.
아직은 어떤 구조인지 이해가 잘 가지 않네요 계속 가보겠습니다
1) Sigmoid(시그모이드) 함수
로지스틱 회귀구조에서 activation(활성화) 함수가
Sigmoid(시그모이드) 함수라고 합니다.
시그모이드 함수는
오즈 비(odds ratio) 라는 식에서부터 도출되나 봅니다.
아래는 오즈 비입니다.
성공 확률, 실패 확률의 비율을
p는 성공확률로 정의해서 아래 식으로 정의합니다.
위에 있는건 성공확률
그 반대로 1에서 성공 확률을 뺀건 실패확률
성공확률을 실패확률로 나눠줬네요.
이 오즈 비에 로그를 씌워주면
로짓함수가 되며
이런 그래프가 그려지게 된다고 합니다.
그래프를 보면 p(성공확률)이 0으로 다가가면
logit 값은 음의 무한대로,
반대로 1로 다가가면 logit은 양의무한 대로 발산합니다.
이 로짓 함수를 로짓값을 z라고 가정하고
아래와 같이
p(성공확률)을 도출하는 식의 형태로 변경하면
이게 시그모이드 함수가 된다고 하네요.
제가 잘 이해한게 맞나요???..ㅎㅎ
계속 가보겠습니다!
시그모이드 함수의 모양입니다.
시그모이드 함수는 모델을 통한 예측값(z)이
일정 임계치 이상이면 참(True) 이하면 거짓(False)를
반환한다고 합니다.
이 기준 임계치는 제가 정해주게 되겠죠.
임계치. 즉 참과 거짓을 나눠주는 기준을 0.6으로 정해주면
0.6 이상이면 참(True)이 된다는 말이네요.
출처: https://ko.wikipedia.org/wiki/%EC%9E%90%EC%97%B0%EB%A1%9C%EA%B7%B8
이 지수함수 그래프와
식을 다시 보면
z(예측값)가 커지면
최대 거의 1이되고
최소 거의 0이되는
식인 듯 하네요.
z가음이면 시그이드 함수를 거치면 0으로 수렴하고
양이면 1로 수렴하다고 생각하면 될까요??
2) Binary Cross-Entropy(이진교차 엔트로피)
위의 Sigmoid(시그모이드) 함수가 로지스틱 회귀에서
activation(활성화) 함수였다면
로지스틱 회귀에서 loss(손실)함수는
바로 Binary CrossEntropy(이진교차 엔트로피)함수입니다.
교차엔트로피 함수는 아래와 같은 식을 가집니다.
a는 활성화 함수를 거친 값이라고 합니다.
즉 a는 0~1 사이의
범위에 있는 값 중 하나겠네요.
y는 모델의 예측값이죠.
우리가 기대하는 y값은 0 혹은 1이기 때문에
손실 값은 이렇게 정리됩니다.
해당 식의 그래프를 보면 아래와 같습니다.
정리를 해보면 이중분류에서 손실을 구할때
예측값(y)이 1일떄,
모델의 예측값(a)이 1에 가까우면
손실이 0에 가까워지고
예측값(y)가 0일때,
모델의 예측값(a)이 0에 가까워지면
손실도 0에 가까워지네요!
2. 적용해보기
-Sigmoid(시그모이드)
-Binary Cross-Entropy(이진교차엔트로피)
-activation(활성화)함수
빡시게 공부해서
사용해볼 시간입니다.
먼저 이진분류 데이터를 받아오기 위해서
Scikit learn 의 datasets의 load_brest_cancer() 데이터를 가져오겠습니다.
데이터가 어떤 형태인지도 확인해보구요.
from sklearn.datasets import load_breast_cancer
datasets = load_breast_cancer()
# print(datasets)
print(datasets.DESCR) #설명 , 평균 등
print(datasets.feature_names) #컬럼명
x = datasets.data
y = datasets.target
print(x.shape, y.shape) #(569, 30) (569,)
unique, counts = np.unique(y, return_counts = True)
print(unique, counts)#[0 1] [212 357]
#print(pd.value_counts(y)) unique와 동일
#print(pd.Series(y).value_counts()) #unique와 동일
데이터도 train데이터, test데이터로 나눠줍니다.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size= 0.7, random_state=1234)
모델 구성의 레이어에
이제 학습한 sigmoid 함수를 사용해주겠습니다.
이중분류에 사용되는 모델이
로지스틱 회귀 모델이고
sigmoid함수는 이 모델의
activation(활성화) 함수라고 했죠?
적용을 해볼게요!
모델의 마지막 레이어에
Dense의 activation 파라미터로 'sigmoid'를 지정해주면 됩니다!
#모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(64, input_dim = 30)) #기본 함수는 linear
model.add(Dense(32))
model.add(Dense(16))
model.add(Dense(8))
model.add(Dense(4))
model.add(Dense(2))
model.add(Dense(1,activation='sigmoid')) #이진함수에서는 sigmoid 는 최종레이어에서 들어가야함.
하나가 더 남았죠?
로지스틱 회귀 모델의
손실함수인 Binary Cross-Entropy는
어디 들어가야 할까요?
모델 구성인 model.compile()의 loss 파라미터로
설정해주면 됩니다.
loss='binary_crossentropy'
그리고 훈련을 시켜줍니다.
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['acc']) #'accuracy'정확도 metrics 설정
history = model.fit(x_train, y_train, epochs= 76, batch_size=1,
validation_split=0.3)
위에서 추가로 metrics를 설정해줬죠?
아래 포스팅에 metrics 값에 대한 내용이 나왔습니다.
https://aigaeddo.tistory.com/21
17. loss 값 시각화 해보기
이번 포스팅에서는 제가 너무나도 해보고 싶었던 (눈으로 보이는게 가장 재밌습니다..) loss 가 떨어지고 튀는 구간을 눈으로 확인해보기 위해 그래프로 그려서 분석해보겠습니다. 튀는 구간이
aigaeddo.tistory.com
model.fit()의 반환값인 History object로
loss값들의 기록을 받아왔는데,
이 history object에
loss values 와 metrics values 값이
들어있다고 했습니다.
바로 여기의 metrics values를 지정해 준겁니다.
로스가 아닌 accruracy를 찍은 이유는
분류에서는
정확도의 값이 높은 신뢰를 갖습니다.
다음으로 평가와 예측을 해줍니다.
새롭게 등장한게 있죠
sklearn metrics의 모듈에서 r2_score, mean_squered_error 등의
평가지표의 함수를 사용했었는데
이번엔 정확도를 확인해주는
accuracy_score() 함수를 사용해줬습니다.
또, 예측값을 np.round()함수를 사용해서 반올림했죠,
sigmoid는 0~1사이의 값을 반환하기 때문에
예측값을 0혹은1로 만들어 주기 위해서
반올림을 했습니다.
(아까 학습한 내용에 적용해보면 제가 한 방식은
임계치를 0.5으로 설정한 것이네요.
임계치를 조정하려면 다른방식이 있겠죠..?)
#평가 예측
loss = model.evaluate(x_test, y_test) #evaluate loss
y_predict = model.predict(x_test)
import numpy as np
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test, np.round(y_predict)) #evaluate 정확도
print(f"accuracy : {acc}")
print(loss)
아까 metrics에 설정해준
정확도 기록들을 가지고 시각화도 해봤습니다.
history_loss = history.history['loss']
history_val_loss = history.history['val_loss']
history_accuracy = history.history["accuracy"]
import matplotlib.pyplot as plt
plt.figure(figsize=(9,6))
plt.plot(history_loss, c ='red', label = 'loss', marker = '.')
plt.plot(history_val_loss, c = 'blue', label = 'val_loss', marker = '.')
plt.plot(history_accuracy, c = 'green', label = 'accuracy', marker = '.')
plt.legend(loc = 'upper right')
plt.title('loss accuracy graph')
plt.xlabel = 'epoch'
plt.ylabel = 'loss'
plt.grid()
plt.show()
이렇게 분류 중 이진분류에 대해서
이해가 안되서 정리를 해봤습니다.
잘못된 점이 있으면 지적 부탁드립니다!
'인공지능 개발하기 > Machine Learning' 카테고리의 다른 글
[Tensorflow] 21. 범주형 데이터(Categorical Data)를 수치형 데이터(Numeric data)로 변환하기 (1) | 2024.01.20 |
---|---|
[Tensorflow] 20. 다중 분류(Multiclass Classification) (1) | 2024.01.13 |
[Tensorflow] 18. keras EarlyStopping() 사용해보기 (2) | 2024.01.13 |
[Tensorflow] 17. loss 값 시각화 해보기 (1) | 2024.01.13 |
[Tensorflow] 16. 데이터쪼개기 2) validation data (2) | 2024.01.13 |