[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
2import 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
7tdp = 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
4tdp = 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
5from 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
2X_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
11from 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
2submit = 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의 경우 LogisticRegression()
의 random_state
parameter 고정 값에 따라 달라져서 0.79666과 0.79600이 별도로 나오는 현상이 발생했다. 아무튼 위와 같이 test data에 대한 모델의 예측 정확도, 성능을 확인할 수 있었다.