선형회귀와 동일하게 가중치를 활용하여 예측값 도출
: Logits, 선형회귀와 똑같은 계산식을 사용하여 얻은 예측값
활성화 함수 : 시그모이드 함수 ( 0 ~ 1 )
Z값이 커질수록 1에 수렴한다.
Z값이 작아질수록 0에 수렴
손실 함수 ( Loss Function )
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score # 실제 정답과 예측값을 비교하여 모델의 정확도를 계산하는 함수
df = pd.read_csv('Iris.csv') # 데이터 불러오기
df_binary = df[df['Species'].isin(['Iris-setosa', 'Iris-versicolor'])].copy()
# isin은 순차적으로 비교하여 지정한 값이면 반환
# python3 버전 부터 .copy() 없이 하면 복사가 아니라 참조하는 듯, 원본 데이터가 변경 되지 않도록, copy() 사용
X_binary = df_binary[['PetalLengthCm', 'PetalWidthCm']]
y_binary = df_binary['Species'].map({'Iris-setosa' : 0, 'Iris-versicolor' : 1})
# df_binary의 Species의 값을 map함수 통해서 Iris-setosa를 0으로 변환, Iris-versicolor를 1로 변환
# 모델이 영어로 구분하는게 안되서 그런듯 확인해 봐야할듯
# 훈련용 데이터와 테스트용 데이터로 나누기
X_bin_train, X_bin_test, y_bin_train, y_bin_test = train_test_split(
X_binary, y_binary, test_size=0.2, random_state=42, stratify=y_binary
# stratify -> 데이터의 비율을 최대한 1ㄷ1로 맞춰줌
)
# 이진 분류 모델 학습
binary_model = LogisticRegression() # 로지스틱 회귀 모델 호출
binary_model.fit(X_bin_train, y_bin_train) # 학습 시작
bin_test_preds = binary_model.predict(X_bin_test) # 테스트 데이터를 활용해서 모델의 예측값 뽑아내는 과정인듯
print(bin_test_preds) # 테스트 데이터를 예측한 값 [1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1]
print(y_bin_test.values) # 실제 정답 데이터 [1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1]
# 예측값의 정답률 확인하기
bin_accuracy = accuracy_score(y_bin_test, bin_test_preds) # (원래값, 예측값)
print(f' 이진 분류 테스트 정확도 : {bin_accuracy:.4f}') # 이진 분류 테스트 정확도 : 1.0000
활성화 함수 : 소프트맥스 ( SoftMax )
여러개 컬럼의 예측값 중에서 가장 값이 높은 것을 선택하는 방식
예측값을 전부 더하면 1이 되는 완벽한 확률 분포를 보인다.
One-Hot Encoding
컬럼을 특정할때 0, 1, 2로 나누게 되면 잘못된 중요도로 훈련에 문제가 발생 할 수 있다.
컬럼의 갯수가 3개이면 [1,0,0], [0,1,0], [0,0,1]로 독립적인 공간으로 구분하여 발생할 수 있는 문제를 방지.
차원 수의 기하급수적 증가
손실 함수 ( Loss Function )
CCE ( Categorical Cross Entropy )
$ \text{Loss} = -\sum{c=1}^{C}y{c}\log{(\hat{y}_c)}$
SCCE ( Sparse Categorical Cross Entory )
X_multi = df[['PetalLengthCm', 'PetalWidthCm']]
y_multi = df['Species'].map({'Iris-setosa' : 0, 'Iris-versicolor' : 1, 'Iris-virginica' : 2})
# 다중 분류 훈련 세트, 테스트 세트 분리하기
X_multi_train, X_multi_test, y_multi_train, y_multi_test = train_test_split(
X_multi, y_multi, random_state=42, test_size=0.2, stratify=y_multi
)
# 다중 분류 모델 학습
multi_model = LogisticRegression()
# 교차 검증 ( K-Fold ) 수행
kf = KFold(n_splits=5, shuffle=True, random_state=42)
# n_splits -> K의 값을 지정, 데이터를 몇개로 분할하는지 지정
cv_scores = cross_val_score(multi_model, X_multi_train, y_multi_train, cv=kf)
print(f'cv_scores : {cv_scores}')
print(f'교차 검증 정확도 평균 : {cv_scores.mean():.4f}')
multi_model.fit(X_multi_train, y_multi_train)
multi_test_pred = multi_model.predict(X_multi_test)
print(f' 예측한 값 : {multi_test_pred}')
print(f' 원래 값 : {y_multi_test.values}')
multi_accuracy = accuracy_score(y_multi_test, multi_test_pred) # 예측값의 정확도
print(f'정확도 : {multi_accuracy:.4f}')