A ship in harbor is safe, but that is not what ships are built for.

STUDY/Machine Learning

Ch01. 데이터 전처리(Data Preprocessing)

플리피나리 2025. 1. 31. 22:47
반응형

전체 데이터 = Training data + Test data

  • Training data → Build the model
  • Test data → Test the model(예상값과 실제값 비교)

상항에 따라 다르지만 일반적인 데이터 split 비율은 8:2 이다.

 

 

What is Feature Scaling

  • 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작
  • 한 열에 대해서만 적용 가능
  • 정규화(Normalization)
    • (열 내 모든 값 - 열의 최소값)/(열의 최대값 - 열의 최소값)
    • 모든 결과는 0과 1 사이
    • 모든 열 간 단위와 의미가 다르고, 무엇보다 값들의 편차의 단위가 서로 달라 열 간 중요도를 착각하기 쉬울 수 있어 정규화를 진행
  • 표준화(Standardization)
    • (열 내 모든 값 - 열의 평균값)/(열의 표준편차)
    • 모든 결과는 -3과 +3 사이

 

 

클래스 : 빌드할 대상의 모델 or 청사진 → 집을 짓는 방법을 취합한 주택 건축 계획

객체 : 클래스의 인스턴스 → 주택 건축 계획에 따라 건축된 주택

메서드 : 특정 작업을 수행하기 위해 객체에 사용하는 도구 → 주택의 현관 열기

 

 

Data Preprocessing with Python

1. Importing the libraries

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
  • matplotlib 라이브러리의 pyplot 모듈 import
  • numpy 배열처리, matplotlib 표, pandas 데이터 불러오기

 

2. Importing the dataset

dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, :-1].values  //모든 행, but 마지막 열 제외
y = dataset.iloc[:, -1].values  //모든 행, but 마지막 열만

print(X)
print(y)

  • read_csv로 csv 파일을 데이터 프레임으로 변환
  • Feature Matrix(= Independent variable Matrix) : 결과를 결정 짓는 모든 요소
  • Dependent variable Matrix : 예측하고자 하는 결과
  • iloc로 인덱스를 이용해 원하는 값 반환
  • 이때 values를 붙이면 ndarray, 안 붙이면 dataframe이나 series

 

3. Taking care of missing data

//sklearn 라이브러리, impute 모듈, SimpleImputer 클래스
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer.fit(X[:, 1:3])  //문자열 제외, 숫자만
X[:, 1:3] = imputer.transform(X[:, 1:3])  //결측값 변환 후 재저장
print(X)

  • 결측값은 해당 row를 삭제하거나 다른 값으로 대체 → 여기서는 열의 평균값으로 대체
  • nan = Not a Number → float 타입
  • 평균값, 중간값 등 여러 값으로 대체 가능
  • SimpleImputer 클래스의 fit 메서드 : 지정한 dataset에서 결측값을 찾아줌
  • SimpleImputer 클래스의 transform 메서드 : 결측값을 대체값으로 변환

 

4. Encoding categorical data

1) Encoding the Independent Variable

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = np.array(ct.fit_transform(X))
print(X)

  • 일반적으로 범주형 변수와 종속 변수 간 상관관계를 추출하기 어려움
  • 따라서 범주형 변수 → 숫자로 변환
  • 정수형으로 변환할 경우 값들의 순서가 중요하다고 머신러닝이 판단할 수 있음
  • 따라서 범주가 3개이면 3비트, 5개이면 5비트로 표현하는 원핫 인코딩 방식을 이용 → 100(독일), 010(프랑스), 001(미국)
  • ColomnTransformer는 여러 transformer을 column에 더 쉽게 적용하도록 한 클래스
  • ColumnTransformers 클래스는 fit과 tansform 과정을 한번에 처리하는 fit_transform 메서드가 존재
  • 이후 머신러닝 처리를 위해 ndarray로 변환

 

2) Encoding the Dependent Variable

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
print(y)

  • y는 종속변수이기 때문에 ndarray로 변환할 필요 X

 

5. Splitting the dataset into the Training set and Test set

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
  • training과 test dataset은 서로 전혀 연관이 없는 데이터야 함
  • feature scaling을 먼저 할 경우 전체 dataset의 평균과 표준편차에 영향을 받기 때문에 무조건 데이터 분리 먼저 진행
  • train_test_split은 특징 벡터와 종속 변수 벡터 각각을 train과 test 로 분리하기 때문에 총 4개 값이 반환
  • random_state : 데이터 분할시 셔플이 이루어지는데 이를 위한 seed 값

 

6. Feature Scaling

from sklearn.preprocessing import StandardScaler
sc = StandScaler()
X_train[:, 3:] = sc.fit_transform(X_train[:, 3:])
X_test[:, 3:] = sc.transform(X_test[:, 3:])

print(X_train)
print(X_test)

  • 표준화 VS 정규화 : 일반적인 경우 표준화, 데이터가 정규분포를 따를 경우 정규화
  • 원핫 인코딩한 범주형 변수는 Feature Scaling 적용 X → 이미 범위화가 되어있음
  • 숫자형 변수에만 Feature Scaling 적용
  • fit은 특성의 평균과 표준편차, transform은 실제 적용하는 것
  • 이때 test dataset에도 training dataest에 사용한 것과 동일한 scaler를 사용해야 함 → fit_transform을 실행할 경우 scaler를 재생성하기 때문
반응형