Logistic Regression Practice 1

[ML] LR을 활용한 분류 문제 (1)

Week#6 / Reference: Prof.Choi / based on Colab, Kaggle

Overview

은하계 분류

본 데이터 셋은 관측 후 형태에 따라 분류된 은하계로 구성되어 있으며, 세종대학교 최유경 교수님의 은하계 분류 kaggle competition를 출처로 둔다.

Description

다음과 같이 3가지 종류의 은하 데이터 셋이 제공된다.

  • Spiral - 일반적으로 알려진 나선 형태의 은하
  • Edge - 은하는 나선 은하지만 관측 방향에 의해 뾰족한 형태를 띄는 은하
  • Smooth - 은하는 은하 디스크의 두께가 얇지 않고 두껍게 보이는 은하

편의를 위해 각 은하계 사진은 1D Feature 로 가공되어 제공된다. 2D 영상을 1D로 표현하기 위한 방법은 다음과 같다.

각 사진은 ImageNet으로 pretrain된 VGG16을 활용하여 1-Dim 의 벡터로 제공된다. 이 벡터는 종단 두 개의 FC Layer를 통해 나온 4,096 차원의 벡터에 PCA를 사용해 64차원으로 가공되어 제공된다.

학습 데이터는 총 6,000개, 평가 데이터는 총 1,500개이며 학습데이터에 해당되는 분류 정보도 포함한다.

Preparation

  • kaggle install

    1
    2
    3
    !pip uninstall -y kaggle
    !pip install --upgrade pip
    !pip install kaggle==1.5.6
    
  • API token upload

    1
    2
    3
    !mkdir -p ~/.kaggle
    !cp kaggle.json ~/.kaggle/
    !chmod 600 ~/.kaggle/kaggle.json
    
  • Import libraries

    1
    2
    import numpy as np
    import pandas as pd
    

Data Loading

Competition의 Data 탭에서 필요한 데이터를 가져온다.

  • Import dataset from Kaggle

    1
    2
    !kaggle competitions download -c 2021-ml-p4
    !unzip 2021-ml-p4.zip
    
  • Input data

    1
    2
    3
    4
    5
    6
    7
    tdp = pd.read_csv('train_desc_pca.csv')
    tl = pd.read_csv('train_label.csv')
    test = pd.read_csv('test_desc_pca.csv')
    # pandas dataframe으로 불러올 때는 column명이 학습에 사용되지 않도록 잘 처리해주어야 함
      
    X = tdp # label을 제외한 features 정보 X에 저장
    y = tl.drop('Id', axis=1) # 'Id' column drop 후 label값만 저장
    
    1
    2
    3
    4
    tdp = np.asarray(pd.read_csv('train_desc_pca.csv'))
    tl = np.asarray(pd.read_csv('train_label.csv'))
    test = np.asarray(pd.read_csv('test_desc_pca.csv'))
    # 아니면 위와 같이 load과정에서 numpy array로 바로 변환해도 됨
    

Data Preprocessing

  • Normalization

    차후 성능 테스트 결과 본 전처리는 하지 않는 게 더 좋다는 결론이 났으므로 fitting과정에서는 기존의 train data로 진행했다.

    1
    2
    3
    4
    5
    from sklearn.preprocessing import MinMaxScaler # 정규화 method import
    msc = MinMaxScaler()
      
    X_sc = msc.fit_transform(X,y) # X를 fit할 때 y도 함께 넣어줌으로써 경향성 조절
    test_sc = msc.transform(test) # test는 (X,y)의 경향에 맞춘다
    
  • Data framing

    1
    2
    X_sc = pd.DataFrame(X_sc,columns=X.columns)
    test_sc = pd.DataFrame(test_sc,columns=test.columns)
    
  • Fitting / Scoring

    Logistic regression의 함수 parameter 조절을 통해 다양한 규제강도에 따른 실험을 할 수 있다.

    • L₁, L₂ 규제화
    • C = 1/𝜆 를 통한 규제화
    • Test data의 label을 알 수 없을 경우, train data 일부를 validation data로 구성하여 test

    규제강도가 클수록 추정된 계수들의 절대값이 작아진다. L₁ 규제화의 경우 규제 강도가 클수록 “Sparce”, 계수에 0이 많아진다. 즉, 계수에 대응하는 특성변수를 제거하는 역할을 담당한다고 볼 수 있다. 본 코드에서는 C 값을 조절하며 정확도를 향상시켜 보았다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from sklearn.linear_model import LogisticRegression
    # clf = LogisticRegression(random_state=1, C=1.6, max_iter=300)
      
    clf = LogisticRegression(solver='sag')
    # solver = sag&saga are faster for large datasets (manual 참고)
    # solver = liblinear is for small datasets
    # 잘 모르겠을 때는 sklearn manual을 항상 참고하도록 하자
      
    clf.fit(X, y) # 학습 적용
      
    result = clf.predict(test) # 예측 적용
    
  • Submission

    1
    2
    submit = pd.read_csv('sample_submit.csv')
    submit['Category'] = result
    
    1
    submit.to_csv('submit.csv',index=False)
    
    1
    !kaggle competitions submit -c 2021-ml-p4 -f submit.csv -m "Message"
    

Result

score

Score의 경우 LogisticRegression()random_state parameter 고정 값에 따라 달라져서 0.79666과 0.79600이 별도로 나오는 현상이 발생했다. 아무튼 위와 같이 test data에 대한 모델의 예측 정확도, 성능을 확인할 수 있었다.