DX

3-2 [실습] 다층 퍼셉트론(MLP) 모델로 2D 데이터 분류하기

이채님하 2021. 12. 13. 12:15

import numpy as np
from visual import *
from sklearn.neural_network import MLPClassifier

from elice_utils import EliceUtils
elice_utils = EliceUtils()

import warnings
warnings.filterwarnings(action='ignore')

np.random.seed(100)
    
# 데이터를 읽어오는 함수입니다.
    
def read_data(filename):   ### filename에 경로 입력
    
    X = []   ### 트레인 데이터
    Y = []   ### 레이블
    
    with open(filename) as fp:
        N, M = fp.readline().split()
        N = int(N)
        M = int(M)
        
        for i in range(N):
            line = fp.readline().split()
            for j in range(M):
                X.append([i, j])
                Y.append(int(line[j]))
    
    X = np.array(X)
    Y = np.array(Y)
    
    return (X, Y)

'''
1. MLPClassifier를 정의하고 hidden_layer_sizes를
   조정해 hidden layer의 크기 및 레이어의 개수를
   바꿔본 후, 학습을 시킵니다.
'''

def train_MLP_classifier(X, Y):
    
    clf = MLPClassifier(hidden_layer_sizes=(100,100))   ### classifier 모델 선언
    
    clf.fit(X,Y) ### 학습 - fit 함수 사용 트레인데이터와 레이블 넣으면 학습
    
    return clf

'''
2. 테스트 데이터에 대한 정확도를 출력하는 
   함수를 완성합니다. 설명을 보고 score의 코드를
   작성해보세요.
'''

def report_clf_stats(clf, X, Y):
    
    hit = 0
    miss = 0
    
    for x, y in zip(X, Y):
        if clf.predict([x])[0] == y:
            hit += 1
        else:
            miss += 1
    
    score = hit / len(X) * 100. # 테스트 셋에 대한 스코어 계산 (실습2. 참고) hit을 학습데이터의 길이로 나누고 100곱함 (뒤에 마침표 필요)
    
    print("Accuracy: %.1lf%% (%d hit / %d miss)" % (score, hit, miss))

'''
3. main 함수를 완성합니다.

   Step01. 학습용 데이터인 X_train, Y_train과
           테스트용 데이터인 X_test, Y_test를 각각
           read_data에서 반환한 값으로 정의합니다. 
           
           우리가 사용할 train.txt 데이터셋과
           test.txt 데이터셋은 data 폴더에 위치합니다.
           
   Step02. 앞에서 학습시킨 다층 퍼셉트론 분류 
           모델을 'clf'로 정의합니다. 'clf'의 변수로는
           X_train과 Y_train으로 설정합니다.
           
   Step03. 앞에서 완성한 정확도 출력 함수를
           'score'로 정의합니다. 'score'의 변수로는
           X_test와 Y_test로 설정합니다.
'''

def main():
    
    X_train, Y_train = read_data('data/train.txt')   ### 데이터 불러오기
    
    X_test, Y_test = read_data('data/test.txt')
    
    clf = train_MLP_classifier(X_train, Y_train)    # 학습된 모델 불러오기
    
    score = report_clf_stats(clf, X_test, Y_test)  ### 스코어 함수 부르고, 학습한 모델(clf), 테스트 데이터 넣기    
    visualize(clf, X_test, Y_test)

if __name__ == "__main__":
    main()