본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
공부하는 습관을 들이자/Python_ML

[#3]데이터 전처리

by 꿀먹은데이터 2022. 1. 1.

데이터 인코딩

from sklearn.preprocessing import LabelEncoder

items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']

#LabelEncoder를 객체로 생성한 후, fit()과 transform()으로 레이블 인코딩 수행
encoder=LabelEncoder()
encoder.fit(items)
labels=encoder.transform(items)
print('인코딩 변환값:',labels)

print('인코딩 클래스:',encoder.classes_)

print('디코딩 원본값:',encoder.inverse_transform([4,5,2,0,1,1,3,3]))

원-핫 인코딩(One-Hot Encoding)

각 속성을 분리하여 어떤 특성을 갖고 있는지 0과 1로만 표현하는 방법이다.

https://www.kaggle.com/alexisbcook/categorical-variables

from sklearn.preprocessing import OneHotEncoder
import numpy as np

items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']

#먼저 숫자 값으로 변환을 위해 LabelEncoder로 변환
encoder = LabelEncoder()
encoder.fit(items)
labels=encoder.transform(items)
labels=labels.reshape(-1,1)

#원-핫 인코딩을 적용
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels=oh_encoder.transform(labels)
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원 : ',oh_labels.shape)

import pandas as pd
df= pd.DataFrame({'item':['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']})
pd.get_dummies(df)
#get_dummies() : 숫자형 값으로 변환 안하고 바로 변환 가능하다.

피쳐 스케일링과 정규화

StandardScaler

from sklearn.datasets import load_iris
import pandas as pd
#붓꽃 데이터 세트를 로딩하고 dataframe으로 변환
iris = load_iris()
iris_data=iris.data
iris_df = pd.DataFrame(data=iris_data,columns=iris.feature_names)

print('평균 값')
print(iris_df.mean())
print('분산 값')
print(iris_df.var())

표준화

표준화 공식

from sklearn.preprocessing import StandardScaler
#StandardScaler객체 생성
scaler=StandardScaler()
#StandardScaler로 data set 변환, fit()과 transform() 호출
scaler.fit(iris_df)
iris_scaled=scaler.transform(iris_df)
#transform()시 스케일 변환된 dataset가 numpy ndarray로 반환되어 dataframe으로 변환한다.
iris_df_scaled = pd.DataFrame(data=iris_scaled,columns=iris.feature_names)
print('평균 값')
print(iris_df_scaled.mean())
print('분산 값')
print(iris_df_scaled.var())

MinMaxScaler

정규화

from sklearn.preprocessing import MinMaxScaler
#MinMaxScaler 객체 생성
scaler=MinMaxScaler()
scaler.fit(iris_df)
iris_scaled=scaler.transform(iris_df)

#transform()시 스케일 변환된 dataset가 numpy ndarray로 반환되어 dataframe으로 변환한다.
iris_df_scaled = pd.DataFrame(data=iris_scaled,columns=iris.feature_names)
print('Min 값')
print(iris_df_scaled.min())
print('Max 값')
print(iris_df_scaled.max())

Notice scaling of train data and test data

from sklearn.preprocessing import MinMaxScaler
import numpy as np

#train data 0 to 10  , test data 0 to 5 -> dataset
train_array = np.arange(0,11).reshape(-1,1)
test_array = np.arange(0,6).reshape(-1,1)
scaler= MinMaxScaler() #feature_range 의 default값 : 0~1 변환
scaler.fit(train_array) # min 0 ,max 10 설정
train_scaled= scaler.transform(train_array) #1/10 scale로 데이터 변환 10 ->1로

print("원본 train_array 데이터 :",np.round(train_array.reshape(-1),2))
print("scale된 train_array 데이터: ",np.round(train_scaled.reshape(-1),2))

#MinMaxScaler에 test_array를 fit()하면 min 0 max 5 설정
scaler.fit(test_array)
test_scaled =scaler.transform(test_array) #원본 5 -> 1변환

print("원본 test_array 데이터 :",np.round(test_array.reshape(-1),2))
print("scale된 test_array 데이터: ",np.round(test_scaled.reshape(-1),2))

학습 데이터와 테스트 데이터의 스케일링이 맞지 않는다. 

그러므로 학습 데이터와 테스트 데이터의 서로 다른 원본값이 동일한 값으로 변환된다.

scaler = MinMaxScaler()
scaler.fit(train_array)
train_scaled = scaler.transform(train_array)
print("원본 train_array 데이터 :",np.round(train_array.reshape(-1),2))
print("scale된 train_array 데이터: ",np.round(train_scaled.reshape(-1),2))

test_scaled = scaler.transform(test_array)
print("원본 test_array 데이터 :",np.round(test_array.reshape(-1),2))
print("scale된 test_array 데이터: ",np.round(test_scaled.reshape(-1),2))

이처럼 fit()을 test data에 적용하면 안되며 train data로부터 fit()이 적용된 scaler 객체를 이용해 transform()으로 변환해야 한다.

'공부하는 습관을 들이자 > Python_ML' 카테고리의 다른 글

[2-4]타이타닉 생존자 예측  (0) 2022.01.05
[2. (2) 교차 검증]  (0) 2021.12.30
[2. (1) 붓꽃 품종 예측하기]  (0) 2021.12.29
부스팅 알고리즘  (0) 2021.12.29