머신러닝

Data Preprocessing,Feature Scaling and OneHotEncoding 머신러닝에 필요한 데이터 처리

HooSL 2022. 3. 28. 10:36

먼저 아나콘다에 scikit learn이 설치되어야 합니다

설치가 안되었으면 다음으로 설치합니다.

$ conda install -c conda-forge scikit-learn

 

Colab환경에서 진행함으로 구글 드라이브를 import 합니다.

from google.colab import drive
drive.mount('/content/drive')

 

데이터처리에 필요한 파이브러리들을 import 합니다.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

 

데이터처리할 csv파일을 구글 드라이브에 옮긴 뒤 Colab으로 불러온 후 변수 처리합니다.

Data.csv
0.00MB

df=pd.read_csv('/content/drive/MyDrive/위치/Data.csv')

 

Nan값 처리합니다.

지금 데이터는 육안으로도 Nan값을 파악하기 쉽지만, 데이터가 많아지면 많아질수록 힘들어지기 때문에 isna를 통해 찾아냅니다.

Age컬럼에 한개 Salary컬럼에 한개

 

Nan값을 처리하는 방법은 두가지입니다.

첫번째로 Nan값을 삭제하거나,

Nan값이 하나라도 들어있는 데이터는 모두 삭제됩니다.

 

두번째로 Nan값을 평균값으로 채우는 방법입니다.

평균으로 채운 뒤 변수에 다시 저장합니다.

 

이제 X,y 데이터를 분리합니다.

이유는 Testing할 변수와 labeling할 변수입니다. (학습변수와 정답(?)변수)

X를 종속변수

y를 독립변수

X = df.loc[ : ,'Country':'Salary']
y = df['Purchased']

X에 학습변수를 담았지만 문자로 되어있는 데이터는 방정식에 대입할 수가 없습니다.

따라서 문자를 숫자로 바꿔줘야 합니다.

먼저 해당 문자열이 카테고리컬 데이터인지 확인합니다.

카테고리컬 데이터이면 정렬합니다.

 

정렬한 후의 문자열들을 앞에서 0부터 시작한 숫자로 변환합니다.

이것이 가장 기본적인 방법인데, 이를 Label Encoding이라고 합니다.

 

France : 0, Germany : 1, Spain : 2
 
3개 이상의 카테고리컬 데이터는, 레이블 인코딩으로 학습을 시키면 학습이 잘 되지 않는것을 발견됐습니다.
따라서 2개의 카테고리컬 데이터는, 레이블 인코딩을 사용해도 됩니다.
하지만 3개 이상의 카테고리컬 데이터는 One-Hot Encoding을 사용해야 성능이 좋아집니다.
 France   Germany   Spain
   1         0        0      -> 프랑스인 경우 프랑스만 1로 세팅

 France   Germany   Spain
   0         1        0      -> 독일인 경우 프랑스만 1로 세팅

 France   Germany   Spain
   0         0        1      -> 스페인인 경우 프랑스만 1로 세팅

즉 카테고리컬 데이터를 전부 컬럼으로 만들어서, 해당 컬럼의 값만 1로 셋팅하는 것을 원 핫 인코딩이라고 합니다.
 
데이터를 확인해보니, 컴퓨터가 이해할 수 있도록 바꿔야 합니다.
컴퓨터는 숫자로 처리합니다.
숫자가 아닌 데이터중에서 카테고리로 판단되는 데이터는, 숫자로 바꿔줄 수 있습니다.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer

1. 레이블 인코딩하는 방법

2. 원 핫 인코딩하는 방법

ct = ColumnTransformer( [('encoder',OneHotEncoder(),[0])] ,
                       remainder='passthrough') # remainder='passthrough' = 나머지 컬럼은 그대로 사용


X=ct.fit_transform(X) # 원핫 인코딩이 수행된 컬럼은 항상 행렬의 맨 왼쪽에 나온다.

0 이라고 쓴 이유는 X에서 원핫인코딩할 컬럼이, 컴퓨터가 매기는 인덱스로 0이기 때문에 0입니다.
만약에 Salary 컬럼도 원핫인코딩 한다고 가정한다면 [0,2] 라고 컴퓨터가 매기는 인덱스를 추가로 적어주면 됩니다.

 

Dataset을 Training용과 Test용으로 나눈다.

숫자로 다 변환된 X와 y를 학습용 데이터와 테스트용 데이터로 나눈다.

그 결과는 총 4개의 데이터가 나옵니다.

 

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=3)

Feature Scaling

Age 와 Salary 는 같은 스케일이 아니다.
Age 는 27 ~ 50 Salary 는 40k ~ 90k
유클리디언 디스턴스로 오차를 줄여 나가는데, 하나의 변수는 오차가 크고, 하나의 변수는 오차가 작으면, 나중에 오차를 수정할때 편중되게 된다. 
따라서 값의 레인지를 맞춰줘야 정확히 트레이닝 된다.


Feature Scaling 2가지 방법
표준화 : 평균을 기준으로 얼마나 떨어져 있느냐? 같은 기준으로 만드는 방법, 음수도 존재, 데이터의 최대최소값 모를때 사용.
정규화 : 0 ~ 1 사이로 맞추는 것 데이터의 위치 비교가 가능, 데이터의 최대최소값 알때 사용

from sklearn.preprocessing import StandardScaler,MinMaxScaler

# X에는 피쳐 스케일링이 필요하다.
# 따라서 X용 스탠다드 스케일러 만들어서 사용한다.
s_scaler = StandardScaler()

X_train_s=s_scaler.fit_transform(X_train)
X_test_s=s_scaler.transform(X_test)

y는 피쳐스케일링이 필요할까요?

이미 0과 1로 되어있으므로 피쳐스케일링이 필요없습니다.

 

#노멀리제이션으로 피처스케일링 한 경우
m_scaler = MinMaxScaler()

X_train_m=m_scaler.fit_transform(X_train)
X_test_m = m_scaler.transform(X_test)

# 오차 = 실제값 - 예측값  오차에러