본문 바로가기
머신러닝/공부내용

독버섯 분류 딥러닝 모델을 이용해서 분류하기

반응형

 

이전에 로지스틱 회귀와 트리 회귀로 독버섯을 구분한 프로젝트를 진행했습니다. 이 회귀 모델과 케라스를 이용해 모델을 만들었을 때 정확도 차이가 있는지 궁금해 만들게 되었습니다. 

 

이전 회귀 모델

https://allinfor.tistory.com/41 

 

독버섯 분류

학교 머신러닝 수업에서 회귀 프로젝트로 독버섯 분류한 내용입니다. 로지스틱 회귀와 트리 회귀를 통해 독버섯을 분류해봤습니다. 독버섯 데이터 독 버섯 데이터는 UCI와 캐글에 있는 mushroom-cla

allinfor.tistory.com

 

 

DNN 모델

전처리

import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np

df = pd.read_csv("mushrooms.csv")
df = df.astype("category")


from sklearn.preprocessing import LabelEncoder

le=LabelEncoder()

for column in df.columns:
    df[column] = le.fit_transform(df[column])
X = df.drop(["veil-type","bruises","gill-spacing","gill-size","stalk-shape","stalk-root","stalk-surface-above-ring","stalk-surface-below-ring","stalk-color-above-ring","stalk-color-below-ring","ring-number","ring-type","spore-print-color","veil-color"], axis=1)

Y = np.array(X["class"]).reshape(-1,1)
X = X.drop(["class"],axis=1)

X_train, X_test, y_train, y_test = train_test_split(X, Y, random_state=42, test_size=0.4)
print(X_train.shape,y_train.shape)

 

라벨인코딩을 통해 범주형 데이터를 숫자로 변환하였습니다. 그리고 회귀 모델을 만들었을 때 처럼 사람들이 버섯을 발견했을 때 알 수 있는 8가지 컬럼 말고 나머지 컬럼을 지웠습니다.

 

모델

from keras.layers import Dense
from keras.models import Sequential

model = Sequential()
model.add(Dense(32,input_dim=8,activation="relu"))
model.add(Dense(32,activation="relu"))
model.add(Dense(1,activation="sigmoid"))

model.compile(loss="binary_crossentropy",optimizer="adam",metrics=["acc"])
model.fit(X_train,y_train,epochs=300)

모델은 두개의 히든레이어가 존재하고 이진 분류이기 때문에 binary_crossentropy 를 로스 함수로 사용했습니다.

 

 

정확도 테스트

a = np.round(model.predict(X_test))
y_te = y_test
print(a)

from sklearn.metrics import f1_score,accuracy_score,recall_score
print(accuracy_score(y_te,a))
print(f1_score(y_te,a))


0.9963076923076923
0.9961710274409701

round 를 통해 모든 데이터를 반올림 한 뒤 테스트 데이터로 검증한 결과 f1-score 와 정확도가  모두 높게 나오는 것을 확인할 수 있습니다.

 

내용 정리

로지스틱 회귀로 만들었을 때 트리 회귀로 만들었을 때 보다 정확도가 더 높은 것을 확인할 수 있었습니다. 이진 분류는 binary_crossentropy 을 사용하고 출력 레이어에 시그모이드 함수를 적용해야합니다.