본문 바로가기
머신러닝딥러닝/딥러닝

딥러닝(Deep learning) #10 다중 분류

by orangecode 2022. 4. 13.
728x90

다중 분류(multi classificiation)

클래스의 정보가 3개 이상인 경우, 여러개의 답 중 하나를 고르는 분류 문제를 다중분류라고 한다. 

 

seed 설정
seed = 0
numpy.random.seed(seed)
tf.set_random_seed(seed)

seed 고정 설정

random() 함수로 임의값을 설정하는 것처럼 보여도 컴퓨터안에 내장된 '내장테이블' 중 하나를 불러내어 순서대로 숫자를 보여주는 것이다. seed 설정은 랜덤테이블 중 몇 번째 테이블을 불러와 쓸 것인지를 결정하는 것이다.

 

numpy 라이브러리를 사용한 tensorflow 딥러닝 구현 시 numpy.seed와 tensorflow.seed 설정 2개 모두 설정해야한다.

 

데이터 확인 및 분석

 

 

data = pd.read_csv("C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/iris.csv", names=["sepal_length", "sepal_width", "petal_length", "petal_width", "species"])

iris.csv 파일은 header가 없는 파일이다.

데이터를 불러올 때, names=[] 사용해서 header를 붙여준다.

 

 

상관도 그래프 그리기

 

sns.pairplot(data, hue='species');
plt.show()

sns.pairplot : 상관관계를 보여주는 다양한 시각화 그래프를 보여준다.

hue="species" : 시각화 그래프의 데이터별 색을 다르게 바꿔준다.

plt.show() : 시각화 그래프 보여주기

 

데이터셋 설정하기

# 데이터셋
dataset = data.values
X = dataset[:,0:4].astype(float)
Y_obj = dataset[:,4]

data.values : 데이터 값만 가져오기, columns/index 없이 가져옴

 

X = 데이터 컬럼 0~4까지 속성, 실수(float)타입으로 설정

Y_obj = 데이터 클래스 설정, 정답(setosa/versicolor/virginica)

 

 

One-Hot Encoding

# 라벨 인코딩
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)

# 원-핫 인코딩
Y_encoded = np_utils.to_categorical(Y)

LabelEncoder() : 간단하게 문자열 값을 숫자형 카테고리 값으로 변환할 수 있는 함수. 일괄적인 숫자 값으로 변환이 되면 숫자 값이 클수록 특정 ML 알고리즘에서 가중치가 더 부여되거나 더 중요하게 인식될 가능성이 발생

 - 선형회귀 알고리즘 : LabelEncoder() 적용이 힘듬

 - Tree 계열 알고리즘 : LabelEncoder() 적용이 가능함.

 

e.fit(Y_obj) : 클래스 값을 fit

 

e.transform(Y_obj) : 'Y_obj'에 따라 encoding

 - e.transform(Y_obj) 실행

array(['Iris=setosa', 'Iris-versicolor', 'Iris-virginica'])
e.transform(Y_obj) 실행↓↓↓
array([1,2,3])

np_utils.to_categorical(Y) : 원-핫 인코딩으로 바꿔주는 함수

 - np_utils.to_categorical(Y) 실행

array([1,2,3])
np_utils.to_categorical(Y) 실행↓↓↓
array([[1., 0., 0.], [0., 1., 0,], [0., 0., 1,]])

 

 

​One-Hot Encoder VS LabelEncoder

 

 

softmax 함수

softmax 활성화 함수란 총합이 은닉층에서 넘어오는 가중합 값을 총합 = 1인 형태로 바꾸어서 계산해주는 함수

 

합계가 1인 형태로 변환 → 큰 값 강조 → 교차 엔트로피 → 원-핫테이블 [1, 0, 0]으로 전환 가능

 

모든 코드
# 다중분류 문제 해결
# 라이브러리 설정
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy
import tensorflow as tf

from sklearn.preprocessing import LabelEncoder
from tensorflow import keras
from keras.models import Sequential
from keras.layers.core import Dense
from keras.utils import np_utils

#seed 설정
seed = 0
numpy.random.seed(seed)
tf.set_random_seed(seed)

# 데이터 입력
data = pd.read_csv("C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/iris.csv", names=["sepal_length", "sepal_width", "petal_length", "petal_width", "species"])

# 상관도 그래프
sns.pairplot(data, hue='species');
plt.show()

# 데이터셋
dataset = data.values
X = dataset[:,0:4].astype(float)
Y_obj = dataset[:,4]

# 라벨 인코딩
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)

# 원-핫 인코딩
Y_encoded = np_utils.to_categorical(Y)

# softmax 활성화함수
model = Sequential()
model.add(Dense(16, input_dim=4, activation='relu'))
model.add(Dense(3, activation="softmax"))

# model compile
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])

model.fit(X, Y_encoded, epochs=60, batch_size = 5)

print('\n Accuracy: %.4f' % (model.evaluate(X, Y_encoded)[1]))
반응형

댓글