230704_머신러닝: Feature Scaling을 활용한 데이터 전처리 및 모델링 예제와 정확도 평가

안인균·2023년 7월 4일
0
post-thumbnail

Feature Scaling 실습 예제문

메소드

🚨 사용되는 데이터는 2차원 형태여야한다. 2차원 배열, DataFrame,...

- fit(): 어떻게 변환할 지 학습
    - 2차원 배열을 받으면 0축을 기준으로 학습한다. (DataFrame으로는 컬럼기준)
- transform(): 변환
    - 2차원 배열을 받으며 0축을 기준으로 변환한다. (DataFrame으로는 컬럼기준)
- fit_transform(): 학습과 변환을 한번에 처리 
- inverse_transform(): 변환된 값을 원래값으로 복원

표준화(StandardScaler)

  • 피쳐의 값들이 평균이 0이고 표준편차가 1인 범위에 있도록 변환한다.
    • 0을 기준으로 모든 데이터들이 모여있게 된다
Newxi=Xiμσμ평균,  σ표준편차New\,x_i = \cfrac{X_i-\mu}{\sigma}\\ \mu-평균,\; \sigma-표준편차
  • sklearn.preprocessing.StandardScaler 를 이용

MinMaxScaler

  • 데이터셋의 모든 값을 0(Min value)과 1(Max value) 사이의 값으로 변환한다.

    Newxi=ximin(X)max(X)min(X)New\,x_i = \cfrac{x_i - min(X)}{max(X) - min(X)}
  • sklearn.preprocessing.MinMaxScaler 를 이용

🚨 연속형 Feature 전처리 시,
Train, (Validation), Test set 으로 분리한 후 진행한다.

Why❓ :
Validation 과 Test set 들은 앞으로 예측하게 될 새로운 데이터에 대해 어느정도의 성능인지를 파악하기 위한 평가를 하는 데이터셋들이다. 그러나 이들이 같은 scale을 가지는 지 보장할 수 없기 때문에
전체 데이터셋을 Scaling하고 Train, Validation, Test set 으로 나누는 것은 모델의 성능 파악이 어렵다.


위스콘신 유방암 데이터셋을 이용한 Feature Scaling 실행

위스콘신 유방암 데이터셋
위스콘신 대학교에서 제공한 유방암 진단결과 데이터

Feature: 종양 측정값들
모든 Feature들은 연속형(continous)이다.
target: 악성, 양성 여부
scikit-learn에서 toy dataset으로 제공한다.
load_breast_cancer() 함수 이용
# 필요 라이브러리 import
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np
import pandas as pd


# 데이터 로드
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()
X = data['data']
y = data['target']


# train validation test set 분리
X_tmp, X_test, y_tmp, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=0)

X_train, X_val, y_train, y_val = train_test_split(X_tmp, y_tmp, 
                                                  test_size=0.2, 
                                                  stratify=y_tmp, random_state=0)


# Standard Scaling
# 객체 생성
s_scaler = StandardScaler()

# 학습 및 변환
X_train_scaled1 = s_scaler.fit_transform(X_train)
X_val_scaled1 = s_scaler.transform(X_val)
X_test_scaled1 = s_scaler.transform(X_test)
# 각 feature 들의 mean 이 0에 가깝게, std 가 1에 가깝게 변환됨


# MinMax Scaling
# 객체 생성
mm_scaler = MinMaxScaler()

# 학습 및 변환
X_train_scaled2 = mm_scaler.fit_transform(X_train)
X_val_scaled2 = mm_scaler.transform(X_val)
X_test_scaled2 = mm_scaler.transform(X_test)
# X_train은 min(0) max(1) 값들로 변환되었고,
# val, test는 train의 min/max 기준으로 scaling이 진행되었기 때문에
# 초과되는 값은 1보다 크게, 미만인 값은 0보다 작게, 변환되었지만
# 그리 큰 차이를 보여주지 않아 해당 데이터셋은 MinMax Scaling으로도 모델링을 할만하다.



# SVC 모델링, accuracy 평가지표
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score


# Standard Scaling을 한 데이터셋 모델링
svm = SVC(random_state=0, C=0.1, gamma=0.1)
# 학습
svm.fit(X_train_scaled1, y_train)
## 추론
pred_train1 = svm.predict(X_train_scaled1)
pred_val1 = svm.predict(X_val_scaled1)
## 평가 - 정확도
print("train", accuracy_score(y_train,pred_train1))
print("validation", accuracy_score(y_val, pred_val1))


# MinMax Scaling 데이터셋 모델링
# 모델 생성
svm = SVC(random_state=0, C=0.1, gamma=0.1)
# 학습
svm.fit(X_train_scaled2, y_train)
# 검증
## 추론
pred_train2 = svm.predict(X_train_scaled2)
pred_val2 = svm.predict(X_val_scaled2)
## 평가 - 정확도
print("train:", accuracy_score(y_train, pred_train2))
print("validation:", accuracy_score(y_val, pred_val2))

이와 같이 Feature Scaling 과정을 확인할 수 있었습니다.

범주형 Feature, 연속형 Feature 모두 있는 데이터셋 모델링

데이터 학습-모델링 순서 :

  1. 필요 라이브러리 import
  2. Data loading
  3. 결측치 처리 - dropna() 활용
  4. input(X), output(y) 분리
  5. 범주형 feature 전처리 :
    • 🚨 이때, 범주형 feature 전처리한 데이터셋(아직 전처리를 진행하지 않은)연속형 데이터셋합쳐서 다음으로 넘어가야한다.

  6. train (validation) test set 분리 :
    • 위에서 합친 데이터셋으로 분리를 과정을 진행한다.
    • 만약, Cross Validation 방식으로 데이터를 분리하여 모델링을 한다면, Validation set 까지 나눠줄 필요는 없다.

  7. 연속형 feature 전처리
  8. 모델링

모델 저장

pickle 모듈 활용!

pickle 모듈사용

  • 객체 파일 입출력을 위한 파이썬 모듈
  • open() 시 binary mode로 설정한다.
  • 저장시 파일 확장자는 보통 pkl 이나 pickle 로 한다.
  • ex)
fw = open("data.pkl", "wb") # 객체를 pickle에 저장하기 위한 output stream 생성
fr = open("data.pkl", "rb") # 파일에 저장된 객체를 읽어오기 위한 input stream 생성
  • 메소드
    • dump(저장할 객체, fw) : 출력
    • load(fr): 입력 - 읽은 객체를 반환한다.

모델 평가 지표

정확도 (Accuracy)

  • 대표적인 분류의 평가 지표
정확도(Accuracy)=맞게예측한건수전체예측건수\large{ 정확도 (Accuracy) = \cfrac{맞게 예측한 건수} {전체 예측 건수} }
  • 전체 예측 한 것중 맞게 예측한 비율로 평가한다.
  • accuracy_score(정답, 모델예측값)

🚨 Accuracy전체 데이터에 대한 것만을 평가하고, 계산하기 때문에 한 class에 대한 평가가 힘들다.
아래와 같은 문제점들이 있고, 한계가 있다.

Accuracy 평가지표의 문제

  • 이진 분류에서 양성(Positive)에 대한 지표만 확인 할 수 없다.
    • 전체 중 몇 개가 맞았는지에 대한 평가 지표이므로 양성(Positive)만의 성능 또는 음성(Negative)만의 성능을 알 수 없다.
  • 불균형 데이터의 경우 정확한 평가지표가 될 수 없다.
    • 예: 양성과 음성의 비율이 1:9 인 경우 모두 음성이라고 하면 정확도는 90%가 된다.

0개의 댓글