728x90
반응형

퍼셉트론 모델

📍 퍼셉트론(Perceptron)
- 인공신경망의 한 종류
- 주로 이진분류 또는 다중분류에 사용되는 초기 인공신경망 모델
- 종속변수가 연속형인 회귀에서는 사용되지 않음(분류에서만 사용)
- 퍼셉트론에는 단층 퍼셉트론과 다층 퍼셉트론이 있음 - 주로 다층 퍼셉트론이 성능이 좋음

📍 단층 퍼셉트론(Single-Layer perceptron, SLP), 인공신경망 층
- 입력층과 출력층으로만 구성되어 있음
- 주로 이진 분류에 사용됨(성능이 낮은 경우, 다층 퍼셉트론으로 사용)
- 선형 활성화 함수(linear)를 사용

📍 다층 퍼셉트론(Multi-Layer perceptron, MLP), 심층신경망 층
- 입력층, 은닉층(1개 이상), 출력층으로 구성됨
- 주로 다중 분류에 사용됨(이진분류도 가능)
- 단층 퍼셉트론보다 높은 성능을 나타냄
- 여러 층(입력, 은닉, 출력)으로 이루어져 있다고 해서 "다층"이라고 칭함
- 은닉층에는 비선형 활성화 함수를 사용함(linear를 제외한 나머지, Sigmoid, RelU 등)
- 발전된 모델들이 현재 사용되는 모델들이며 계속 나오고 있음

 

퍼셉트론 분류데이터 사용

  • 라이브러리 정의
    import padnas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    
    ''' 단층 퍼셉트론 모델 '''
    from sklearn.linear_model import Perceptron
    ''' 다층 퍼셉트론 모델 '''
    from sklearn.neural_network import MLPClassifier
    ''' 최적의 하이퍼파라미터 찾기 '''
    from sklearn.model_selection import GridSearchCVR
    ''' 성능평가 '''
    from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
    ''' 시각화 '''
    import matplotlib.pyplot as plt
    import seaborn as sns
  • 데이터 불러들이기
  • 독립변수와 종속변수로 분류하기
  • 정규화하기
  • 훈련 : 검증 : 테스트 = 6 : 2 : 2 로 분리하기
    4가지 모두 이전과 동일하므로 코드 생략

단층 퍼셉트론

  • 단층 퍼셉트론 모델 생성하기
    perceptron_model = Perceptron(random_state=42)
    perceptron_model


  • 하이퍼파라미터 튜닝할 매개변수 범위 설정
    param_grid = {
        ### 학습률 : 보폭
        "alpha" : [0.0001, 0.001, 0.01],
        ### 반복 횟수(epoch)
        "max_iter" : [100, 500, 1000]
    }
    param_grid


  • GridSearchCV 객체 생성
    grid_search = GridSearchCV(perceptron_model, param_grid, cv=3, scoring="accuracy")
    grid_search


  • 최적의 하이퍼파라미터 찾기
    grid_search.fit(X_train, y_train)​
  • 최적의 하이퍼파라미터 출력
    grid_search.best_params_


  • 최적의 모델
    best_model = grid_search.best_estimator_
    best_model​


  • 최적의 모델로 훈련시키기
    best_model.fit(X_train, y_train)​
  • 훈련 및 검증 정확도 확인하기
    score_train = best_model.score(X_train, y_train) 
    score_val = best_model.score(X_val, y_val) 
    score_train, score_val​
    과대/과소는 일어나지 않았지만, 모델자체의 성능이 낮음

  • 정밀도, 재현율, f1, 매트릭스 확인
    ''' 정밀도, 재현율, f1, 매트릭스 확인 '''
    ''' 예측하기 '''
    y_pred = best_model.predict(X_test)
    
    ''' 정밀도 '''
    pre = precision_score(y_test, y_pred)
    
    ''' 재현율 '''
    re = recall_score(y_test, y_pred)
    
    ''' f1-score '''
    f1 = f1_score(y_test, y_pred)
    
    ''' 평가 매트릭스(혼동행렬) '''
    cm = confusion_matrix(y_test, y_pred)
    pre, re, f1, cm

    보통 재현율과 f1은 유사하게 나옴.
    재현율 = 1은 위험한 오류가 없다는 뜻.
    f1이 낮게 나온것은 긍정적 오류가 존재한다는 뜻
    매트릭스 상에서 0을 0으로 맞춘게 하나도 없음 > 문제

  •  혼동행렬 시각화 - 방법 1
    plt.figure(figsize=(8, 4))
    plt.title("Confusion_matrix")
    sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",
                xticklabels=["0", "1"], yticklabels=["0", "1"])
                ### cbar=False 설정시 오른쪽 막대 바 사라짐
    plt.show()


  • 혼동행렬 시각화 - 방법 2
    from sklearn.metrics import ConfusionMatrixDisplay
    disp = ConfusionMatrixDisplay(confusion_matrix =cm)
    disp.plot()



다층 퍼셉트론

  • 다층 퍼셉트론 모델 생성하기
    mlp_model = MLPClassifier(random_state=42)
    mlp_model
  • 튜닝할 하이퍼파라미터 설정하기
    param_grid = {
        ### hidden_layer_sizes : 은닉계층 정의
        # - (10,) : 은닉계층 1개 사용, 출력크기 10개를 의미함
        # - (10, 10) : 은닉계층 2개 사용, 각각의 출력 크기가 10개라는 의미
        # - (10, 11, 12) : 은닉계층 3개 사용, 각각의 출력 크기는 10, 11, 12
        "hidden_layer_sizes" : [(10,), (50,), (100,)],
        "alpha" : [0.0001, 0.001, 0.01],
        "max_iter" : [1000]
    }
    param_grid​


  • GridSearchCV 객체 생성
    grid_search_mlp = GridSearchCV(mlp_model, param_grid, cv=3, scoring="accuracy")
    grid_search_mlp


  • 최적의 하이퍼파라미터
    grid_search_mlp.fit(X_train, y_train)​
  • 최적의 하이퍼파리미터 출력
    grid_search_mlp.best_params_


  • 최적의 모델
    best_model_mlp =grid_search_mlp.best_estimator_
    best_model_mlp​


  • 훈련 및 검증 정확도 확인하기
    score_train = best_model_mlp.score(X_train, y_train) 
    score_val = best_model_mlp.score(X_val, y_val) 
    score_train, score_val​


  • 정밀도, 재현율, f1, 매트릭스 확인
    ''' 예측하기 '''
    y_pred = best_model_mlp.predict(X_test)
    
    ''' 정밀도 '''
    pre = precision_score(y_test, y_pred)
    
    ''' 재현율 '''
    re = recall_score(y_test, y_pred)
    
    ''' f1-score '''
    f1 = f1_score(y_test, y_pred)
    
    ''' 평가 매트릭스(혼동행렬) '''
    cm = confusion_matrix(y_test, y_pred)
    pre, re, f1, cm​


  •  혼동행렬 시각화
    plt.title("Confusion_matrix")
    sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",
                xticklabels=["0", "1"], yticklabels=["0", "1"])
    ### cbar=False 설정시 오른쪽 막대 바 사라짐
    plt.show()

728x90
반응형

+ Recent posts