티스토리 뷰

머신러닝

[데이터전처리_1] Feature Scaling

느린 개미 2018. 10. 16. 22:39
반응형

아래 내용은 인프런 : 밑바닥부터 시작하는 머신러닝 입문 과정의 최성철 교수님 강의의 feature scaling 부분을 수강하고, 나름대로 한번 정리를 하여 더 오래 기억하고자 작성한 사항입니다.

일부 추가, 삭제, 수정한 사항들도 있습니다.

1. Feature Scaling 이란?

  • raw data 를 전처리하는 과정
  • 키와 몸무게를 가지고 100m 달리기에 걸리는 시간을 예측한다고 하면, 키와 몸무게는 unit 이 다르기 때문에, 더 큰 값을 가진 키 값이 결과값에 더 큰 영향을 미칠 수도 있다.
  • 이 때문에 raw data 를 전처리하는 과정이 필요하다.
  • 방법론적으로 크게 Min-Max Normalization , Standardization (Z-score Normalization) 두가지가 있다.

1) Min-Max Normalization

  • 데이터를 일반적으로 0~1 사이의 값으로 변환시켜준다.
  • 식) (X - X의 최소값) / (X의 최대값 - X의 최소값)
  • 데이터의 최소값, 최대값을 알 경우 사용한다.
In [31]:
# code from - https://stackoverflow.com/questions/24645153/pandas-dataframe-columns-scaling-with-sklearn

import pandas as pd
import numpy as np

df = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
df
Out[31]:
ABC
014.00103.02big
190.20107.26small
290.95110.35big
396.27114.23small
491.21114.68small
In [32]:
df["A"]
Out[32]:
0    14.00
1    90.20
2    90.95
3    96.27
4    91.21
Name: A, dtype: float64
In [33]:
df["A"] - df["A"].min()
Out[33]:
0     0.00
1    76.20
2    76.95
3    82.27
4    77.21
Name: A, dtype: float64
In [34]:
(df["A"] - df["A"].min()) / (df["A"].max() - df["A"].min())
Out[34]:
0    0.000000
1    0.926219
2    0.935335
3    1.000000
4    0.938495
Name: A, dtype: float64

2) Standardization

  • 기존 변수에 범위를 정규 분포로 변환한다.
  • 식) (X - X의 평균값) / (X의 표준편차)
  • 데이터의 최소값, 최대값을 모를 경우 사용한다.
In [35]:
df["B"].mean(), df["B"].std()
Out[35]:
(109.90799999999999, 4.901619120249964)
In [36]:
df["B"] = ( df["B"] - df["B"].mean() )  \
/ (df["B"].std() )
In [37]:
df
Out[37]:
ABC
014.00-1.405250big
190.20-0.540230small
290.950.090174big
396.270.881749small
491.210.973556small
In [38]:
def feture_scaling(df, scaling_strategy="min-max", column=None):
    if column == None:
        column = [column_name for column_name in df.columns]
    for column_name in column:
        if scaling_strategy == "min-max":
            df[column_name] = ( df[column_name] - df[column_name].min() ) /\
                            (df[column_name].max() - df[column_name].min()) 
        elif scaling_strategy == "z-score":
            df[column_name] = ( df[column_name] - \
                               df[column_name].mean() ) /\
                            (df[column_name].std() )
    return df
In [39]:
df = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
df
Out[39]:
ABC
014.00103.02big
190.20107.26small
290.95110.35big
396.27114.23small
491.21114.68small
In [40]:
feture_scaling(df,column=["A","B"])
Out[40]:
ABC
00.0000000.000000big
10.9262190.363636small
20.9353350.628645big
31.0000000.961407small
40.9384951.000000small

3) 주의사항

  • 실제 사용할 때는 반드시 정규화 parameter(최대최소, 평균/표준편차)등을 기억하여 새로운 값에 적용해야한다.
In [41]:
# code from - http://sebastianraschka.com/Articles/2014_about_feature_scaling.html

import pandas as pd
import numpy as np

df = pd.io.parsers.read_csv(
    'https://raw.githubusercontent.com/rasbt/pattern_classification/master/data/wine_data.csv',
     header=None,
     usecols=[0,1,2]
    )

df.columns=['Class label', 'Alcohol', 'Malic acid']

df.head()
Out[41]:
Class labelAlcoholMalic acid
0114.231.71
1113.201.78
2113.162.36
3114.371.95
4113.242.59
In [42]:
df = feture_scaling(df, "min-max", column=['Alcohol', 'Malic acid'])
df.head()
Out[42]:
Class labelAlcoholMalic acid
010.8421050.191700
110.5710530.205534
210.5605260.320158
310.8789470.239130
410.5815790.365613

4) Feature scaling with sklearn

  • sklearn 도 feature scale 지원
  • MinMaxScaler 와 StandardScaler 모두 지원한다.
In [43]:
from sklearn import preprocessing

df = pd.io.parsers.read_csv(
    'https://raw.githubusercontent.com/rasbt/pattern_classification/master/data/wine_data.csv',
     header=None,
     usecols=[0,1,2]
    )
df.columns=['Class label', 'Alcohol', 'Malic acid']
df.head(7)
Out[43]:
Class labelAlcoholMalic acid
0114.231.71
1113.201.78
2113.162.36
3114.371.95
4113.242.59
5114.201.76
6114.391.87
  • fit(규칙생성과정) -> transform(규칙적용과정) 의 과정을 거침
  • 한번에 여러 column 을 처리 가능

- StandardScaler

In [44]:
from sklearn import preprocessing
std_scaler = preprocessing.StandardScaler().fit(df[["Alcohol",'Malic acid']] )
In [45]:
df_std = std_scaler.transform(df[["Alcohol", "Malic acid"]])
df_std[:5]
Out[45]:
array([[ 1.51861254, -0.5622498 ],
       [ 0.24628963, -0.49941338],
       [ 0.19687903,  0.02123125],
       [ 1.69154964, -0.34681064],
       [ 0.29570023,  0.22769377]])

- MinMaxScaler

In [46]:
minmax_scaler = preprocessing.MinMaxScaler().fit(df[["Alcohol",'Malic acid']] )
In [47]:
df_minmax = minmax_scaler.transform(df[["Alcohol", "Malic acid"]])
In [48]:
df_minmax[:5]
Out[48]:
array([[ 0.84210526,  0.1916996 ],
       [ 0.57105263,  0.2055336 ],
       [ 0.56052632,  0.3201581 ],
       [ 0.87894737,  0.23913043],
       [ 0.58157895,  0.36561265]])
In [ ]:
 


반응형

'머신러닝' 카테고리의 다른 글

[데이터전처리_3] Category Data 처리  (0) 2018.10.17
[데이터전처리_2] missing value 처리  (0) 2018.10.17
Pandas 너 뭐니?_두번째  (0) 2018.06.26
Pandas 너 뭐니?_첫번째  (0) 2018.06.10
numpy 를 이해해보자  (2) 2018.06.01