728x90
반응형

 이전 포스트에서는 범주형 데이터들을 원-핫 벡터로 바꿔서 성능 향상을 이뤄봤다. 그러나 Accuracy 0.78 > 0.79667이라는 기대에 미치지 못하는 성능 향상이 일어났다.

 이번에는 하이퍼 파라미터 튜닝을 하여, 성능을 보다 올려보도록 하겠다.

 

 

하이퍼 파라미터 튜닝

  • 하이퍼 파라미터 튜닝이 무엇인지 이전 포스트(참고)에서 살짝 다뤄보았다.
  • 이전 포스트에서 원-핫 벡터를 사용한, 데이터 셋을 만들었으나, 그 성능이 생각보다 크지 않았다.
  • 데이터 셋의 상태는 실제로 더 좋아졌으나, 적절한 하이퍼 파라미터나, 적합한 모델을 만들지 못해서 발생한 문제일 수 있다.
  • 이번엔 하이퍼 파라미터를 하나하나 잡아보도록 하자.

 

 

0. 학습 이전까지 코드 정리

# Import Module
import pandas as pd
import numpy as np
import os
from tensorflow.keras.layers import Dense
from tensorflow import keras
from copy import copy
# 필요한 Data를 모두 가져온다.
def import_Data(file_path):

    result = dict()
    for file in os.listdir(file_path):

        file_name = file[:-4]
        result[file_name] = pd.read_csv(file_path + "/" + file)

    return result


# Rawdata 생성
def make_Rawdata(dict_data):

    dict_key = list(dict_data.keys())
    test_Dataset = pd.merge(dict_data["gender_submission"], dict_data["test"], how='outer', on="PassengerId")
    Rawdata = pd.concat([dict_data["train"], test_Dataset])
    Rawdata.reset_index(drop=True, inplace=True)
    
    return Rawdata


# 불필요한 컬럼 제거
def remove_columns(DF, remove_list):
    
    # 원본 정보 유지를 위해 copy하여, 원본 Data와의 종속성을 끊었다.
    result = copy(Rawdata)

    # PassengerId를 Index로 하자.
    result.set_index("PassengerId", inplace = True)

    # 불필요한 column 제거
    for column in remove_list:

        del(result[column])
        
    return result


# 결측값 처리
def missing_value(DF):

    # Cabin 변수를 제거하자
    del(DF["Cabin"])
    
    # 결측값이 있는 모든 행은 제거한다.
    DF.dropna(inplace = True)
    
    
# 원-핫 벡터
def one_hot_Encoding(data, column):

    # 한 변수 내 빈도
    freq = data[column].value_counts()

    # 빈도가 큰 순서로 용어 사전 생성
    vocabulary = freq.sort_values(ascending = False).index

    # DataFrame에 용어 사전 크기의 column 생성
    for word in vocabulary:

        new_column = column + "_" + str(word)
        data[new_column] = 0

    # 생성된 column에 해당하는 row에 1을 넣음
    for word in vocabulary:

        target_index = data[data[column] == word].index
        new_column = column + "_" + str(word)
        data.loc[target_index, new_column] = 1

    # 기존 컬럼 제거
    del(data[column])
    

# 스케일 조정
def scale_adjust(X_test, X_train, C_number, key="min_max"):
    
    if key == "min_max":
        
        min_key = np.min(X_train[:,C_number])
        max_key = np.max(X_train[:,C_number])
        
        X_train[:,C_number] = (X_train[:,C_number] - min_key)/(max_key - min_key)
        X_test[:,C_number] = (X_test[:,C_number] - min_key)/(max_key - min_key)
        
    elif key =="norm":
        
        mean_key = np.mean(X_train[:,C_number])
        std_key = np.std(X_train[:,C_number])
        
        X_train[:,C_number] = (X_train[:,C_number] - mean_key)/std_key
        X_test[:,C_number] = (X_test[:,C_number] - mean_key)/std_key
        
    return X_test, X_train
# Data Handling
############ Global Parameter ############
file_path = "./Dataset"
remove_list = ["Name", "Ticket"]
##########################################


# 0. Rawdata 생성
Rawdata_dict = import_Data(file_path)
Rawdata = make_Rawdata(Rawdata_dict)


# 1. 필요 없는 column 제거
DF_Hand = remove_columns(Rawdata, remove_list)


# 2. 결측값 처리
missing_value(DF_Hand)


# 3. One-Hot encoding
one_hot_Encoding(DF_Hand, 'Pclass')
one_hot_Encoding(DF_Hand, 'Sex')
one_hot_Encoding(DF_Hand, 'Embarked')


# 4. 데이터 쪼개기
# Label 생성
y_test, y_train = DF_Hand["Survived"][:300].to_numpy(), DF_Hand["Survived"][300:].to_numpy()


# 5. Dataset 생성
del(DF_Hand["Survived"])
X_test, X_train = DF_Hand[:300].values, DF_Hand[300:].values


# 6. 특성 스케일 조정
X_test, X_train = scale_adjust(X_test, X_train, 0, key="min_max")
X_test, X_train = scale_adjust(X_test, X_train, 3, key="min_max")
# 모델 생성
model = keras.Sequential()
model.add(Dense(128, activation = "relu"))
model.add(Dense(64, activation = "relu"))
model.add(Dense(32, activation = "relu"))
model.add(Dense(16, activation = "relu"))
model.add(Dense(1, activation = "sigmoid"))

# 모델 Compile
opt = keras.optimizers.Adam(learning_rate=0.005)
model.compile(optimizer=opt,
              loss = "binary_crossentropy",
              metrics=["binary_accuracy"])

 

 

 

 

1. 적절한 Epochs 잡기

  • 혹시 과적합(Overfitting)이 발생한 것일지도 모르니 손실 값의 추이를 보자.
  • 모델은 적합한 epochs를 넘어 학습하게 된다면, train Dataset에 지나치게 맞춰져서, Test set을 제대로 분류하지 못하는 문제가 발생할 수 있다.
>>> model.fit(X_train, y_train, epochs = 500)

Epoch 95/500
24/24 [==============================] - 0s 997us/step - loss: 0.2396 - binary_accuracy: 0.8955
Epoch 96/500
24/24 [==============================] - 0s 1ms/step - loss: 0.2528 - binary_accuracy: 0.8892
Epoch 97/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1841 - binary_accuracy: 0.9220
Epoch 98/500
24/24 [==============================] - 0s 997us/step - loss: 0.2407 - binary_accuracy: 0.8902
Epoch 99/500
24/24 [==============================] - 0s 911us/step - loss: 0.2251 - binary_accuracy: 0.8925
Epoch 100/500
24/24 [==============================] - 0s 1ms/step - loss: 0.2491 - binary_accuracy: 0.8909

...

Epoch 195/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1727 - binary_accuracy: 0.9196
Epoch 196/500
24/24 [==============================] - 0s 997us/step - loss: 0.1872 - binary_accuracy: 0.9266
Epoch 197/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1782 - binary_accuracy: 0.9232
Epoch 198/500
24/24 [==============================] - 0s 954us/step - loss: 0.2125 - binary_accuracy: 0.9080
Epoch 199/500
24/24 [==============================] - 0s 867us/step - loss: 0.1910 - binary_accuracy: 0.9235
Epoch 200/500
24/24 [==============================] - 0s 954us/step - loss: 0.2054 - binary_accuracy: 0.9145

...

Epoch 296/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1784 - binary_accuracy: 0.9128
Epoch 297/500
24/24 [==============================] - 0s 1ms/step - loss: 0.2052 - binary_accuracy: 0.9170
Epoch 298/500
24/24 [==============================] - 0s 997us/step - loss: 0.2241 - binary_accuracy: 0.9151
Epoch 299/500
24/24 [==============================] - 0s 996us/step - loss: 0.2345 - binary_accuracy: 0.9055
Epoch 300/500
24/24 [==============================] - 0s 1ms/step - loss: 0.2218 - binary_accuracy: 0.9008

...

Epoch 395/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1688 - binary_accuracy: 0.9271
Epoch 396/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1840 - binary_accuracy: 0.9213
Epoch 397/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1711 - binary_accuracy: 0.9204
Epoch 398/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1995 - binary_accuracy: 0.9167
Epoch 399/500
24/24 [==============================] - 0s 1ms/step - loss: 0.2236 - binary_accuracy: 0.9166
Epoch 400/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1880 - binary_accuracy: 0.9280

...

Epoch 495/500
24/24 [==============================] - 0s 954us/step - loss: 0.1608 - binary_accuracy: 0.9270
Epoch 496/500
24/24 [==============================] - 0s 997us/step - loss: 0.1601 - binary_accuracy: 0.9334
Epoch 497/500
24/24 [==============================] - 0s 954us/step - loss: 0.1428 - binary_accuracy: 0.9540
Epoch 498/500
24/24 [==============================] - 0s 998us/step - loss: 0.1522 - binary_accuracy: 0.9360
Epoch 499/500
24/24 [==============================] - 0s 1ms/step - loss: 0.1431 - binary_accuracy: 0.9410
Epoch 500/500
24/24 [==============================] - 0s 911us/step - loss: 0.1581 - binary_accuracy: 0.9440
<tensorflow.python.keras.callbacks.History at 0x1e9a8427790>
  • 손실 값의 추이를 보니, 거의 차이가 없는 것을 볼 수 있다.
  • 과적합이 의심되므로, epochs를 100으로 줄여서 다시 학습해보자.
>>> model.fit(X_train, y_train, epochs = 100)

Epoch 1/100
24/24 [==============================] - 1s 1ms/step - loss: 0.5505 - binary_accuracy: 0.7738
Epoch 2/100
24/24 [==============================] - 0s 1ms/step - loss: 0.3769 - binary_accuracy: 0.8455
Epoch 3/100
24/24 [==============================] - 0s 2ms/step - loss: 0.3293 - binary_accuracy: 0.8878
Epoch 4/100
24/24 [==============================] - 0s 2ms/step - loss: 0.3400 - binary_accuracy: 0.8485
Epoch 5/100
24/24 [==============================] - 0s 1ms/step - loss: 0.3340 - binary_accuracy: 0.8688

...

Epoch 96/100
24/24 [==============================] - 0s 963us/step - loss: 0.2319 - binary_accuracy: 0.9013
Epoch 97/100
24/24 [==============================] - 0s 1ms/step - loss: 0.2237 - binary_accuracy: 0.9102
Epoch 98/100
24/24 [==============================] - 0s 953us/step - loss: 0.2326 - binary_accuracy: 0.9151
Epoch 99/100
24/24 [==============================] - 0s 997us/step - loss: 0.2412 - binary_accuracy: 0.8963
Epoch 100/100
24/24 [==============================] - 0s 1ms/step - loss: 0.2346 - binary_accuracy: 0.9002
<tensorflow.python.keras.callbacks.History at 0x119d9265790>
>>> pred = model.predict(X_test).reshape(X_test.shape[0])
>>> pred = np.where(pred > 0.5, 1, 0)
>>> accuracy = 1 - (np.where((pred - y_test) == 0, 0, 1).sum()/len(y_test))
>>> print("Accuracy:", accuracy)

Accuracy: 0.81
  • epochs만 100으로 줄였을 뿐인데, Accuracy가 0.79667에서 0.81로 상승하였다.

 

 

 

 

2. 적절한 모델 만들기

  • 연구자의 감에 의존하는 부분이라고도 할 수 있으나, 적절한 모델 작성은 전혀 다른 결과를 가져온다.
  • 이번엔 DropoutBatchnormalization을 추가하여 모델을 학습시켜보자.
  • 위 두 내용은 꽤 심도 깊은 내용이므로 추후 자세히 설명하겠으나, 이번엔 아주 간략하게 설명하고 넘어가 보겠다.

 

Dropout

  • Dropout은 Overfitting, model combination 문제를 해결하기 위해 등장한 개념으로, 신경망의 뉴런을 랜덤 하게 부분적으로 생략시킨다.
  • 간단하게 말하자면, 신경망을 망각시킨다고 생각하는 게 좋다.

 

Bachnormalization:

  • 배치 정규화라 불린다.
  • 활성화 함수의 활성화 값이나 출력 값을 정규분포로 만들어줘, Noise를 추가하는 개념으로, 학습을 할 때마다 활성화 값이나 출력 값을 정규화하므로, 초기화(가중치 초깃값) 문제의 영향을 덜 받게 해 준다.
  • 학습률(Learning Rate)을 높게 설정할 수 있으므로, 학습 속도가 개선된다.
  • Overfitting 위험을 줄일 수 있다.
  • 가중치 소실(Gradient Vanishing) 문제를 해결해준다.

 

# module 추가 Import
from tensorflow.keras.layers import (Dense, Dropout, BatchNormalization)
# 모델 생성
model = keras.Sequential()
model.add(BatchNormalization())
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.10))
model.add(Dense(64, activation = 'relu'))
model.add(Dropout(0.10))
model.add(Dense(32, activation = 'relu'))
model.add(Dropout(0.10))
model.add(Dense(16, activation = 'relu'))
# 마지막 Dropout은 좀 크게 주자
model.add(Dropout(0.50))
model.add(Dense(1, activation = 'sigmoid'))

# 모델 Compile
opt = keras.optimizers.Adam(learning_rate=0.005)
model.compile(optimizer=opt,
              loss = "binary_crossentropy",
              metrics=["binary_accuracy"])
>>> model.fit(X_train, y_train, epochs = 100)

Epoch 1/100
24/24 [==============================] - 1s 2ms/step - loss: 0.6060 - binary_accuracy: 0.6829
Epoch 2/100
24/24 [==============================] - 0s 2ms/step - loss: 0.4085 - binary_accuracy: 0.8484
Epoch 3/100
24/24 [==============================] - 0s 2ms/step - loss: 0.3800 - binary_accuracy: 0.8719
Epoch 4/100
24/24 [==============================] - 0s 2ms/step - loss: 0.3713 - binary_accuracy: 0.8580
Epoch 5/100
24/24 [==============================] - 0s 2ms/step - loss: 0.3626 - binary_accuracy: 0.8666
Epoch 6/100

...

Epoch 96/100
24/24 [==============================] - 0s 1ms/step - loss: 0.3144 - binary_accuracy: 0.8592
Epoch 97/100
24/24 [==============================] - 0s 2ms/step - loss: 0.3060 - binary_accuracy: 0.8716
Epoch 98/100
24/24 [==============================] - 0s 2ms/step - loss: 0.2887 - binary_accuracy: 0.8794
Epoch 99/100
24/24 [==============================] - 0s 1ms/step - loss: 0.2879 - binary_accuracy: 0.8695
Epoch 100/100
24/24 [==============================] - 0s 2ms/step - loss: 0.2805 - binary_accuracy: 0.8969
<tensorflow.python.keras.callbacks.History at 0x1fa4c5b0220>
>>> pred = model.predict(X_test).reshape(X_test.shape[0])
>>> pred = np.where(pred > 0.5, 1, 0)
>>> accuracy = 1 - (np.where((pred - y_test) == 0, 0, 1).sum()/len(y_test))
>>> print("Accuracy:", accuracy)

Accuracy: 0.8200000000000001
  • 성능이 소폭 상승하긴 하였으나, 손실 값이 이전보다 떨어진 폭이 작다.
  • 혹시나, 손실 값을 더 떨어뜨릴 수 있을지도 모르니, epochs를 올려보자.
  • Dropout과 Batchnormalization 둘 모두 overfitting 문제를 해결해주므로, 현재 필요한 epochs보다 낮은 상태일 가능성이 있다.
>>> model.fit(X_train, y_train, epochs = 200)

Epoch 1/200
24/24 [==============================] - 1s 2ms/step - loss: 0.6264 - binary_accuracy: 0.6648
Epoch 2/200
24/24 [==============================] - 0s 2ms/step - loss: 0.4572 - binary_accuracy: 0.8413
Epoch 3/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3927 - binary_accuracy: 0.8649
Epoch 4/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3488 - binary_accuracy: 0.8736
Epoch 5/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3500 - binary_accuracy: 0.8776

...

Epoch 196/200
24/24 [==============================] - 0s 2ms/step - loss: 0.2589 - binary_accuracy: 0.8917
Epoch 197/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3108 - binary_accuracy: 0.8813
Epoch 198/200
24/24 [==============================] - 0s 2ms/step - loss: 0.2486 - binary_accuracy: 0.9010
Epoch 199/200
24/24 [==============================] - 0s 1ms/step - loss: 0.2808 - binary_accuracy: 0.9001
Epoch 200/200
24/24 [==============================] - 0s 1ms/step - loss: 0.2638 - binary_accuracy: 0.9069
<tensorflow.python.keras.callbacks.History at 0x1b772b801f0>
>>> pred = model.predict(X_test).reshape(X_test.shape[0])
>>> pred = np.where(pred > 0.5, 1, 0)
>>> accuracy = 1 - (np.where((pred - y_test) == 0, 0, 1).sum()/len(y_test))
>>> print("Accuracy:", accuracy)
Accuracy: 0.8266666666666667
  • 정확도가 0.82667로 소폭 성능이 상승한 것을 볼 수 있다.

 

 

 

 

3. 최종 코드

  • 결측 값이 가장 많은 연령에 대하여, 평균 대체, 중윗값 대체, 사용하지 않음(Default)이 가능하게 코드를 수정하였다.
  • 변수 SibSp와 Parch는 등간 척도이므로, 연속형 척도이나, 표준화를 하지 않았다.
  • 그 값의 편차가 매우 작으므로, 미치는 영향은 작다고 판단되지만, 통일성을 위해 스케일 조정을 해주었다.
# Inport Module
import pandas as pd
import numpy as np
import os
from tensorflow.keras.layers import (Dense, Dropout, BatchNormalization)
from tensorflow import keras
from copy import copy




###################################### Function ######################################
# 필요한 Data를 모두 가져온다.
def import_Data(file_path):

    result = dict()
    for file in os.listdir(file_path):

        file_name = file[:-4]
        result[file_name] = pd.read_csv(file_path + "/" + file)

    return result


# Rawdata 생성
def make_Rawdata(dict_data):

    dict_key = list(dict_data.keys())
    test_Dataset = pd.merge(dict_data["gender_submission"], dict_data["test"], how='outer', on="PassengerId")
    Rawdata = pd.concat([dict_data["train"], test_Dataset])
    Rawdata.reset_index(drop=True, inplace=True)
    
    return Rawdata


# 불필요한 컬럼 제거
def remove_columns(DF, remove_list):
    
    # 원본 정보 유지를 위해 copy하여, 원본 Data와의 종속성을 끊었다.
    result = copy(Rawdata)

    # PassengerId를 Index로 하자.
    result.set_index("PassengerId", inplace = True)

    # 불필요한 column 제거
    for column in remove_list:

        del(result[column])
        
    return result


# 결측값 처리
def missing_value(DF, key=None):

    # Cabin 변수를 제거하자
    del(DF["Cabin"])
    
    if key == "mean":
        DF["Age"] = DF["Age"].fillna(np.mean(DF["Age"]))
        
    elif key == "median":
        DF["Age"] = DF["Age"].fillna(np.median((DF["Age"].dropna())))
    
    # 결측값이 있는 모든 행은 제거한다.
    DF.dropna(inplace = True)
    
    
# 원-핫 벡터
def one_hot_Encoding(data, column):

    # 한 변수 내 빈도
    freq = data[column].value_counts()

    # 빈도가 큰 순서로 용어 사전 생성
    vocabulary = freq.sort_values(ascending = False).index

    # DataFrame에 용어 사전 크기의 column 생성
    for word in vocabulary:

        new_column = column + "_" + str(word)
        data[new_column] = 0

    # 생성된 column에 해당하는 row에 1을 넣음
    for word in vocabulary:

        target_index = data[data[column] == word].index
        new_column = column + "_" + str(word)
        data.loc[target_index, new_column] = 1

    # 기존 컬럼 제거
    del(data[column])
    

# 스케일 조정
def scale_adjust(X_test, X_train, C_number, key="min_max"):
    
    if key == "min_max":
        
        min_key = np.min(X_train[:,C_number])
        max_key = np.max(X_train[:,C_number])
        
        X_train[:,C_number] = (X_train[:,C_number] - min_key)/(max_key - min_key)
        X_test[:,C_number] = (X_test[:,C_number] - min_key)/(max_key - min_key)
        
    elif key =="norm":
        
        mean_key = np.mean(X_train[:,C_number])
        std_key = np.std(X_train[:,C_number])
        
        X_train[:,C_number] = (X_train[:,C_number] - mean_key)/std_key
        X_test[:,C_number] = (X_test[:,C_number] - mean_key)/std_key
        
    return X_test, X_train
######################################################################################






################################## Global Variable ###################################
file_path = "./Dataset"
remove_list = ["Name", "Ticket"]
######################################################################################
# Data Handling
# 0. Rawdata 생성
Rawdata_dict = import_Data(file_path)
Rawdata = make_Rawdata(Rawdata_dict)


# 1. 필요 없는 column 제거
DF_Hand = remove_columns(Rawdata, remove_list)


# 2. 결측값 처리
missing_value(DF_Hand)


# 3. One-Hot encoding
one_hot_Encoding(DF_Hand, 'Pclass')
one_hot_Encoding(DF_Hand, 'Sex')
one_hot_Encoding(DF_Hand, 'Embarked')


# 4. 데이터 쪼개기
# Label 생성
y_test, y_train = DF_Hand["Survived"][:300].to_numpy(), DF_Hand["Survived"][300:].to_numpy()


# 5. Dataset 생성
del(DF_Hand["Survived"])
X_test, X_train = DF_Hand[:300].values, DF_Hand[300:].values


# 6. 특성 스케일 조정
X_test, X_train = scale_adjust(X_test, X_train, 0, key="min_max")
X_test, X_train = scale_adjust(X_test, X_train, 1, key="min_max")
X_test, X_train = scale_adjust(X_test, X_train, 2, key="min_max")
X_test, X_train = scale_adjust(X_test, X_train, 3, key="min_max")
######################################################################################






######################################## Model #######################################
# 모델 생성
model = keras.Sequential()
model.add(BatchNormalization())
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.10))
model.add(Dense(64, activation = 'relu'))
model.add(Dropout(0.10))
model.add(Dense(32, activation = 'relu'))
model.add(Dropout(0.10))
model.add(Dense(16, activation = 'relu'))
# 마지막 Dropout은 좀 크게 주자
model.add(Dropout(0.50))
model.add(Dense(1, activation = 'sigmoid'))

# 모델 Compile
opt = keras.optimizers.Adam(learning_rate=0.005)
model.compile(optimizer=opt,
              loss = "binary_crossentropy",
              metrics=["binary_accuracy"])
######################################################################################
>>> model.fit(X_train, y_train, epochs = 200)

Epoch 1/200
24/24 [==============================] - 1s 2ms/step - loss: 0.6264 - binary_accuracy: 0.6648
Epoch 2/200
24/24 [==============================] - 0s 2ms/step - loss: 0.4572 - binary_accuracy: 0.8413
Epoch 3/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3927 - binary_accuracy: 0.8649
Epoch 4/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3488 - binary_accuracy: 0.8736
Epoch 5/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3500 - binary_accuracy: 0.8776

...

Epoch 196/200
24/24 [==============================] - 0s 2ms/step - loss: 0.2589 - binary_accuracy: 0.8917
Epoch 197/200
24/24 [==============================] - 0s 2ms/step - loss: 0.3108 - binary_accuracy: 0.8813
Epoch 198/200
24/24 [==============================] - 0s 2ms/step - loss: 0.2486 - binary_accuracy: 0.9010
Epoch 199/200
24/24 [==============================] - 0s 1ms/step - loss: 0.2808 - binary_accuracy: 0.9001
Epoch 200/200
24/24 [==============================] - 0s 1ms/step - loss: 0.2638 - binary_accuracy: 0.9069
<tensorflow.python.keras.callbacks.History at 0x1b772b801f0>
>>> test_loss, test_acc = model.evaluate(X_test, y_test, verbose = 2)
>>> print("Accuracy:", np.round(test_acc, 5))
10/10 - 0s - loss: 0.7177 - binary_accuracy: 0.8200
Accuracy: 0.82
  • model.evaluate(test_set, test_label, verbose=2): 위에서 직접 만들었던, Accuracy를 한 줄의 코드로 추출 가능하다.
  • test_loss는 손실 값(loss)을 의미한다.
  • test_acc는 정확도(accuracy)를 의미한다.

 

 

 지금까지 가장 기본적인 방법을 사용해서 타이타닉 데이터를 이진 분류해보았다. 최초 정확도가 0.78이 나왔으나, 최종적으로는 0.82가 나왔다.

 타이타닉 데이터를 사용한 생존자 분류 모델의 정확도는 기본적으로 Accuracy = 0.8을 기준으로 하며, 이를 얼마나 더 잘 모델링하느냐에 따라 그 결과가 Accuracy = 1.0까지 나오기도 한다.

 이보다 더 좋은 해결 방법을 참고하고자 한다면, 캐글에서 다른 사람들의 코드를 참고해보는 것도 좋은 생각이다. 그러나, 개인적으로는 이 내용을 기반으로, 더 발전시켜보기를 바란다.

 다음 포스팅에서는 타이타닉 데이터를 사용해서 더 많은 작업을 해보도록 하겠다.

728x90
반응형

+ Recent posts