Feature Scaling ์ด๋, ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ๋ ฅ ๋ณ์๋ค์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ ์ผ์ ๋ฒ์ ๋ด์ ๋จ์ด์ง๋๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ ๋งํ๋ค. Feature Scaling์ ํ๊ฒ ๋๋ฉด ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์๊ฒ ๋๋๋ฐ ๊ทธ ์ด์ ๋ ๋ฌด์์ผ๊น?
๋จผ์ 3์ฐจ์์ผ๋ก ๋ํ๋ธ ์์ค ํจ์ ๊ทธ๋ํ๋ฅผ ๋ฑ๊ณ ์ ์ ์ด์ฉํด์ 2์ฐจ์์ผ๋ก ํํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

๋ฑ๊ณ ์ ์์ ์ด์ด์ง ํ๋์ ์ ์ ์๋ ์ ๋ค์ ๋ชจ๋ ๊ฐ์ ๋์ด์ ์๋ ์ ๋ค ๋ปํ๋ค. ์ด๋ ์ค์ํ ๊ฐ๋
ํ ๊ฐ์ง๋ ํน์ ์ง์ ์์ ๊ฒฝ์ฌ๊ฐ ๊ฐ์ฅ ๊ฐํ๋ฅธ ๋ฐฉํฅ์ ๋ฑ๊ณ ์ ๊ณผ ์์ง์ด ๋๋ ๋ฐฉํฅ์ด๋ผ๋ ๊ฒ์ด๋ค. (์ฐ๋ฆฌ๋ ์ด๊ฑธ ๊ธฐ์ธ๊ธฐ ๋ฒกํฐ๋ก ๊ตฌํด์์๋ค.)
๋ง์ฝ ์ ๋ ฅ ๋ณ์์ธ ์ฐ๋ด์ ๊ฐ์ง๊ณ ๋์ด๋ฅผ ์์ธกํ๋ ์ ํ ํ๊ท๋ฅผ ํ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ค ํจ์๋ ๋ผ ํ์.
์ฐ๋ด์ ๋จ์๊ฐ ์ฒ ๋ง ๋จ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์กฐ๊ธ๋ง ๋ฐ๋์ด๋ ๊ฐ์ค ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค.
์๋ฅผ ๋ค์ด ์ฐ๋ด์ด 3000๋ง์์ผ ๋๋ฅผ ๋ณด๊ณ ์๋ค๊ณ ํ๋ฉด, ์ผ ๋๋ ๊ฐ 3000๋ง์์ธ๋ฐ, ์ผ ๋๋ ๊ฐ 9000๋ง์์ด๋ค. ์ด 1์์ 3์ผ๋ก ๋ฐ๋์์ ๋ฟ์ธ๋ฐ ์์ธก๊ฐ์ 6000๋ง์ ์ด์์ด๋ ์ฐจ์ด๊ฐ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ด ์กฐ๊ธ๋ง ๋ฐ๋์ด๋ ์
๋ ฅ ๋ณ์ ์ฐ๋ด์ ์ฒ๋ง ๋จ์ ์ ๋๋ฌธ์ ๊ฐ์ค ํจ์์ ์์ํ์ด ํฌ๊ฒ ์ฐจ์ด๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค. ์์ํ์ ํฐ ์ํฅ์ ์ค๋ค๋ ๊ฒ์ ๊ฒฐ๊ตญ ํ๊ท ์ ๊ณฑ ์ค์ฐจ, ํน์ ์์ค ํจ์์๋ ํฐ ์ํฅ์ ์ฃผ๊ฒ ๋๋ค.
๋ฐ๋ฉด ์ ํญ์ 1๊ณผ ๊ณฑํด์ง๊ธฐ ๋๋ฌธ์ ์ด ๋ฐ๋์ด๋ ๊ฐ์ค ํจ์์ ์์ํ์ด ํฌ๊ฒ ๋ฐ๋์ง๋ ์๋๋ค.
์ด๊ฑธ ๊ทธ๋ํ๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.

์ผ์ชฝ ๊ทธ๋ํ๋ Feature Scaling์ ํ๊ธฐ ์ ์ธ๋ฐ, ์ด ์กฐ๊ธ๋ง ์ปค์ ธ๋ ์์ค ํจ์์ ๋ฑ๊ณ ์ ์ด ๋น ๋ฅด๊ฒ ๋ฐ๋๋ค. ์ฆ, ์ ๋ฏผ๊ฐํ๋ค. ๋ง์ ์ง์ ์์ ๊ฒฝ์ฌ๊ฐ ๊ฐ์ฅ ๊ฐํ๋ฅธ ๋ฐฉํฅ์ ์ต์์ ์ ํฅํ๋ ๋ฐฉํฅ์ด ์๋๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์งํํด๋ ์ง๊ทธ์ฌ๊ทธ ๋ชจ์์ผ๋ก ๊ฒฝ์ฌ ํ๊ฐํ๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ์๋ ด๊น์ง์ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
๋ฐ๋ฉด ์ค๋ฅธ์ชฝ ๊ทธ๋ํ๋ Feature Scaling์ ํ๊ธฐ ๋๋ฌธ์ ๊ณผ ์ 0๊ณผ 1์ฌ์ด์ ๋น์ทํ ์๋ค์ด ๊ณฑํด์ง๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์์ค ํจ์์ ๋น์ทํ ์ํฅ์ ์ฃผ๊ฒ ๋๋ค. ์ฆ, ์ด๋ค ์ง์ ์ด๋ ๊ฒฝ์ฌ๊ฐ ๊ฐ์ฅ ๊ฐํ๋ฅธ ๋ฐฉํฅ์ด ์ต์์ ์ ํฅํ๋ ๋ฐฉํฅ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฌ ํ๊ฐ์ ๋ ๋นจ๋ฆฌ ํ ์ ์๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ ด์ ๋ ๋นจ๋ฆฌ ํ ์ ์๊ฒ ๋๋ค.
์ด๋ฌํ Feature Scaling์ ํฌ๊ฒ Normalization๊ณผ Standardization ์ผ๋ก ๋๋๋ค.
์ ๊ทํ๋ ์ซ์์ ํฌ๊ธฐ๋ฅผ 0๊ณผ 1์ฌ์ด๋ก ๋ง๋ ๋ค. ์ ๊ทํ ์ค ๊ฐ์ฅ ์ง๊ด์ ์ธ Min-Max Normalization ์ ๋ํด ์์๋ณด์.
Min-Max Normalization์ ์ต๋ ์ต์๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ 0๊ณผ 1์ฌ์ด๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ ๊ทํ๋ฅผ ํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ , ์ ๊ทํ๋ฅผ ํ ๋ฐ์ดํฐ๋ฅผ , ๋ฐ์ดํฐ์ ์ต๋๊ฐ์ , ๋ฐ์ดํฐ์ ์ต์๊ฐ์ ์ด๋ผ ํ๋ค๋ฉด Min-Max Normalization์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๊ฑธ ์ด์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ 0๊ณผ 1 ์ฌ์ด ๋ฒ์์ ์ซ์๋ค๋ก ํฌ๊ธฐ ์กฐ์ ์ฆ, scaling ํด์ค ์ ์๋ค.
scikit-learn ์ผ๋ก ํ ๋ฒ ์ค์ต์ ํด๋ณด์.
from sklearn import preprocessing
import pandas as pd
import numpy as np
nba_player_of_the_week_df = pd.read_csv('../data/NBA_player_of_the_week.csv')
height_weight_age_df = nba_player_of_the_week_df[['Height CM', 'Weight KG', 'Age']]
scaler = preprocessing.MinMaxScaler()
normalized_data = scaler.fit_transform(height_weight_age_df)
normalized_df = pd.DataFrame(normalized_data, columns=['Height', 'Weight', 'Age'])
์ด ๊ฐ์ ๋ฐ์ดํฐ ์ ํ๊ท ์ ์ด๋ผ ํ๋ฉด ํ์ค ํธ์ฐจ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
ํต๊ณํ์์ ํ์ค ํธ์ฐจ๋ ๋ฐ์ดํฐ๋ค์ด ํ๊ท ๊ฐ์์ ์ผ๋ง๋ ๋ฒ์ด๋ ์๋์ง๋ฅผ ๋ํ๋ธ๋ค. ํ๊ท ์ ๊ฐ๊น์ด ๊ฐ๋ค์ด ๋ง์์๋ก ํ์ค ํธ์ฐจ๊ฐ ์๊ณ , ํ๊ท ๊ณผ ์ฐจ์ด๊ฐ ๋ง์ด ๋๋ ๊ฐ๋ค์ด ๋ง์์๋ก ํ์ค ํธ์ฐจ๊ฐ ํฌ๋ค.
ํ์คํ๋ ์ด๋ฐ ํ์ค ํธ์ฐจ๋ฅผ ์ด์ฉํ ๊ฒ์ผ๋ก ๊ณต์์ ์๋์ ๊ฐ๋ค.
๋ ํ์คํ ํ ํ์ ๋ฐ์ดํฐ, ๋ ํ์คํ ํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค.
ํ์คํ๋ฅผ ์ฌ์ฉํ๋ฉด ํญ์ ๋ฐ์ดํฐ๋ค์ ํ๊ท ์ 0, ํ์ค ํธ์ฐจ๋ 1์ด ๋๋ค. ์ด๋ ๊ฒ ํ์คํ๋ฅผ ํด ์ค ๋ฐ์ดํฐ๋ฅผ ํต๊ณํ์์๋ z-score๋ผ๊ณ ๋ ํ๋๋ฐ, z-score๋ ๋ฐ์ดํฐ๊ฐ ํ๊ท ๊ฐ์์ ๋ช ํ์ค ํธ์ฐจ๋งํผ ๋จ์ด์ ธ ์๋์ง๋ฅผ ๋ปํ๋ค.
scikit-learn ์ผ๋ก ํ ๋ฒ ์ค์ต์ ํด๋ณด์.
from sklearn import preprocessing
import pandas as pd
import numpy as np
nba_player_of_the_week_df = pd.read_csv('../data/NBA_player_of_the_week.csv')
height_weight_age_df = nba_player_of_the_week_df[['Height CM', 'Weight KG', 'Age']]
scaler = preprocessing.StandardScaler()
normalized_data = scaler.fit_transform(height_weight_age_df)
normalized_df = pd.DataFrame(normalized_data, columns=['Height', 'Weight', 'Age'])
๋จธ์ ๋ฌ๋์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
๋ง์ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ธํ ๋ฐ์ดํฐ, ์ฆ ์ ๋ ฅ ๋ณ์์ ๊ฐ์ด ์์นํ ๋ฐ์ดํฐ์ฌ์ผ ํ๋๋ฐ, ๋ง์ฝ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ผ๋ฉด ์ด๋ป๊ฒ ํ ๊น?
๊ฐ์ฅ ๋จผ์ ๋๋ ์๊ฐ์ ๊ทธ๋ฅ ๊ฐ ์นดํ
๊ณ ๋ฆฌ๋ง๋ค 1, 2, 3, ... ๋ฑ์ ์ซ์๋ฅผ ๋ถ์ด๋ ๊ฒ์ด๋ค. ๊ทผ๋ฐ ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด ์นดํ
๊ณ ๋ฆฌ๋ง๋ค ํฌ๊ณ ์๋ค๋ ๊ฐ๋
์ด ์๊ฒจ๋ฒ๋ฆฐ๋ค. ์๋ฅผ ๋ค์ด ์ด ๋ฐฉ์์ ํ์กํ์ ์ ์ฉํ๋ค๋ฉด Aํ์ 1์ด๋๊น ๊ฐ์ฅ ์๊ณ , Oํ์ 4๋๊น ๊ฐ์ฅ ํฌ๊ณ , ๋ฑ๋ฑ์ ๊ฐ๋
์ด ์๊ธฐ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.
๋จธ์ ๋ฌ๋์ ์ด๋ฌํ ์๋ฑํ ๊ฐ๋
๊น์ง ํ์ตํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ์์ ์ข์ง ์๋ค.
๋ฐ๋ผ์ One-hot Encoding ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ข๋ค. One-hot encoding์ ๊ฐ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ํ๋์ ์๋ก์ด ์ด๋ก ๋ง๋ค์ด ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋ ์ฌ์ง์ ํตํด ๋ณด๋ ๊ฒ์ด ์ดํด๊ฐ ๋น ๋ฅด๋ค.

A, B, O, AB ๋ผ๋ ํ์กํ ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ ์นดํ ๊ณ ๋ฆฌ ๊ฐ๊ฐ์ ์ด๋ก ๋ง๋ ํ ์ฃผ์ด์ง ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํ์กํ์ธ์ง์ ๋ฐ๋ผ ์๋ก์ด ์ด๋ค์ ๊ฐ์ 0 ๋๋ 1๋ก ์ฑ์์ One-hot vector๋ก ํํํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ฒ์ฃผํ ๋ฐ์ดํฐ์๊ฒ ํฌ๊ณ ์์ ๊ด๊ณ๊ฐ ์๊ธฐ๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด, One-hot Encoding์ ์ฌ์ฉํ์ฌ ๋ฒ์ฃผํ ๋ฐ์ดํฐ์๊ฒ ํฌ๊ณ ์์์ ์๋ฑํ ๊ด๊ณ๊ฐ ์๊ธฐ๋ ๊ฑธ ๋ฐฉ์งํ๋ฉด์๋ ์์นํ ๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ ์ค ์ ์๋ ๊ฒ์ด๋ค.
pandas ๋ฅผ ์ด์ฉํด One-hot Encoding์ ์ค์ตํด๋ณด์.
import pandas as pd
titanic_df = pd.read_csv('../data/titanic.csv')
titanic_sex_embarked = titanic_df[['Sex', 'Embarked']] # One-hot Encoding ํ ์ปฌ๋ผ๋ง ๋ฐ๋ก ์ถ์ถ
one_hot_encoded_df = pd.get_dummies(titanic_sex_embarked, dtype=int) # One-hot Encoding ์งํ
์์์๋ One-hot Encoding์ ํ ์ปฌ๋ผ์ ๋ฐ๋ก ๋ถ๋ฆฌํ ๋ค์์ ์งํ์ ํ์๋๋ฐ, ์ ์ฒด ๋ฐ์ดํฐ titanic_df ์์ ๋ฐ๋ก One-hot Encoding ํ๋ ๋ฐฉ๋ฒ์ ์๋์ฒ๋ผ ํ๋ฉด ๋๋ค.
one_hot_encoded_df = pd.get_dummies(data=titanic_df, columns=['Sex', 'Embarked'])
์ถ์ฒ: ์ฝ๋์