5주차 딥러닝 (2)

정지원·2024년 3월 22일
0

에이블 스쿨 복습

목록 보기
25/51
post-thumbnail

라이브러리

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.metrics import *
from sklearn.preprocessing import MinMaxScaler

from keras.models import Sequential
from keras.layers import Dense
from keras.backend import clear_session
from keras.optimizers import Adam

딥러닝 전에는 데이터 준비가 필요하다 (전처리)
데이터준비, 가변수화, 데이터 분할, 스케일링 필요

데이터준비

target = '변수'
x = data.drop(target, axis = 1)
y = data.loc[:, target]

가변수화

cat_cols = ['변수1','변수2', '변수3']
x = pd.get_dummies(x, columns = cat_cols, drop_first = True)

데이터분할

x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=.3, 
												random_state = 20)

스케일링

scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_val = scaler.transform(x_val)

이진분류

  • 예측하려는 target 변수가 범주형으로 두 가지의 클래스가 존재하는 경우 이진분류를 사용한다.
  • 이진분류는 활성함수로 sigmoid를 사용함 -> 0과 1로 변환
  • loss는 binary_crossentropy를 사용함
# 메모리 정리
clear_session()

# Sequential 모델
model = Sequential([Dense(16, input_shape=(n,), activation='relu'),
                     Dense(8, activation='relu'),
                     Dense(1, activation='sigmoid')])

# 모델요약
model.summary()

# 컴파일 및 학습
# loss = 'binary_crossentropy'
model.compile( optimizer=Adam(learning_rate= 0.01), loss ='binary_crossentropy')
hist = model.fit(x_train, y_train, epochs = 50, validation_split=.2 ).history

# 예측 및 검증
pred = model.predict(x_val)
pred = np.where(pred >= 0.5, 1, 0) 값이 0.5이상 이면 1, 아니면 0

print(classification_report(y_val, pred))

다중분류

  • 예측하려는 target 변수가 범주형으로 세 가지이상의 클래스가 존재하는 경우 다중분류 사용한다.
  • 다중분류는 활성함수로 softmax를 사용함 -> 범주별 확률 값으로 변환
  • loss는
    • 정수 인코딩 - sparse_categorical_crossentropy를 사용
    • One-hot Encoding - categorical_crossentropy를 사용

      이런식으로 클래스가 3개 이상인 것에 사용

방법1-정수 인코딩

정수 인코딩 - sparse_categorical_crossentropy

  • Node수 = y번주 수
from sklearn.preprocessing import LabelEncoder

# 선언
int_encoder = LabelEncoder()

# 인코딩
data['변수'] = int_encoder.fit_transform(data['변수'])
  • loss = sparse_categorical_crossentropy
  • pred_1 = pred.argmax(axis=1) : 주어진 축(axis=1)에서 가장 큰 값의 인덱스 반환
clear_session()

model = Sequential([Dense(8 ,input_shape=(nfeatures,), activation='relu'),
                     Dense(8, activation='relu'),
                     Dense(3, activation='softmax')]) 
                   # 클래스의 수, 아웃풋이 3 setosa, versicolor, virginica
model.summary()

# 컴파일 및 학습
# loss='sparse_categorical_crossentropy'
model2.compile(optimizer=Adam(learning_rate=0.01), loss='sparse_categorical_crossentropy')

hist = model2.fit(x_train, y_train, epochs=100, validation_split=.2, verbose=0).history

# 예측 및 검증
# argmax(axis=1)
pred = model.predict(x_val)
pred_1 = pred.argmax(axis=1)

print(confusion_matrix(y_val, pred_1))
print(classification_report(y_val, pred_1))

방법2-One Hot Encoding

One-hot Encoding - categorical_crossentropy

2차원 구조 입력

from sklearn.preprocessing import OneHotEncoder

# OneHotEncoder 선언
oh_encoder = OneHotEncoder()

# 데이터를 원핫인코딩하여 변환(input: 2차원)
encoded_y1 = oh_encoder.fit_transform(data[['변수]']])

# 변환된 데이터 확인
print(encoded_y1.toarray())

정수 인코딩이 선행되어야함

from keras.utils import to_categorical

# 이미 정수 인코딩된 y를 이용하여 적용
encoded_y2 = to_categorical(data['인코딩된 변수'], 3)
print(encoded_y2)

y에 대해서도 원핫 인코딩 후 모델링

y_c = to_categorical(y.values, 3) # one-hot인코딩

x_train, x_val, y_train, y_val = train_test_split(x, y_c, test_size = .3, random_state = 2022)

분류 문제 평가방법

confusion Matrix

  • 혼동행렬은 모델의 분류 성능을 평가하기 위한 행렬이다 (분류모델에 사용)

  • 예측결과와 실제값 간의 관계를 나타냄

    • True Positive (TP): 실제 양성인 샘플을 양성으로 올바르게 예측한 경우
    • False Positive (FP): 실제 음성인 샘플을 양성으로 잘못 예측한 경우
    • False Negative (FN): 실제 양성인 샘플을 음성으로 잘못 예측한 경우
    • True Negative (TN): 실제 음성인 샘플을 음성으로 올바르게 예측한 경우

calssification report

  • 분류모델의 성능을 요약하는데 사용된다.

    • Precision(정밀도): 모델이 양성 클래스라고 예측한 샘플 중 실제로 양성 클래스인 비율입니다. 즉, "양성"으로 예측한 것 중에 실제로 양성인 것의 비율을 나타냅니다.

    • Recall(재현율): 실제 양성 클래스에 속한 샘플 중에서 모델이 정확하게 양성으로 예측한 비율입니다. 즉, 모든 실제 양성 샘플 중에서 모델이 식별한 비율을 나타냅니다.

    • F1-score: 정밀도와 재현율의 조화 평균입니다. 불균형한 클래스 분포에서 모델의 성능을 요약하는 데 유용합니다.

    • Support: 각 클래스에 대한 실제 샘플 수입니다.

=> 모델의 성능을 이해하고 다른 모델이나 하이퍼파라미터 조정과 같은 개선을 위한 방향을 찾을 수 있ek.

profile
뒤늦게 프로그래밍을 시작한 응애

0개의 댓글