๋ฐ์ดํฐ_์ ์ฒ๋ฆฌ(๋ฐ์ดํฐ ์ธ์ฝ๋ฉ, ํผ์ฒ์ค์ผ์ผ๋ง๊ณผ ์ ๊ทํ)
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(Data Preprocessing)
- ๋ฐ์ดํฐ ํด๋ฆฐ์ง
- ๊ฒฐ์๊ฐ ์ฒ๋ฆฌ(Null/NaN ์ฒ๋ฆฌ)
- ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ(๋ ์ด๋ธ, ์-ํซ ์ธ์ฝ๋ฉ)
- ๋ฐ์ดํฐ ์ค์ผ์ผ๋ง
- ์ด์์น ์ ๊ฑฐ
- Feature ์ ํ, ์ถ์ถ ๋ฐ ๊ฐ๊ณต
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ ML ์๊ณ ๋ฆฌ์ฆ๋งํผ ์ค์ํ๋ค
๋จผ์ , ๊ฒฐ์ ๊ฐ, ์ฆ Null,NaN ๊ฐ์ ํ์ฉ๋์ง ์๋๋ค. ์ด๋ฌํ Null๊ฐ์ ๊ณ ์ ๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณํํด ์ฃผ์ด์ผ ํ๋ค.
์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ฐ, ํผ์ฒ ๊ฐ ์ค Null๊ฐ์ด ์ผ๋ง ๋์ง ์์ ๊ฒฝ์ฐ์๋ ํผ์ฒ์ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒดํ ์ ์๊ณ , Null ๊ฐ์ด ๋๋ถ๋ถ์ด๋ผ๋ฉด ์คํ๋ ค ํด๋น ํผ์ฒ๋ ๋๋กญํ๋ ๊ฒ์ด ์ข๋ค. ํ์ง๋ง Null๊ฐ์ด ์ผ์ ์์ค ์ด์์ผ ๊ฒฝ์ฐ ๊ฐ์ฅ ๊ฒฐ์ ์ด ํ๋ ๋ฐ, ํด๋น ํผ์ฒ๊ฐ ์ค์๋๊ฐ ๋์ ํผ์ฒ์ด๊ณ Null์ ๋จ์ํ ํผ์ฒ์ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒดํ ๊ฒฝ์ฐ ์์ธก ์๊ณก์ด ์ฌํ ์ ์๋ค๋ฉด ์
๋ฌด ๋ก์ง๋ฑ์ ์์ธํ ๊ฒํ ํด ๋ ์ ๋ฐํ ๋์ฒด ๊ฐ์ ์ ์ ํด์ผ ํ๋ค.
์ฌ์ดํท๋ฐ์ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์์ด ๊ฐ์ ์ ๋ ฅ ๊ฐ์ผ๋ก ํ์ฉํ์ง ์๋๋ค. ๊ทธ๋์ ๋ชจ๋ ๋ฌธ์์ด ๊ฐ์ ์ธ์ฝ๋ฉ ๋ผ์ ์ซ์ํ์ผ๋ก ๋ณํํด์ผ ํ๋ค. ๋ฌธ์์ด ํผ์ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ์นดํ ๊ณ ๋ฆฌํ ํผํฐ์ ํ ์คํธํ ํผ์ฒ๋ฅผ ์๋ฏธํ๋๋ฐ, ํ ์คํธํ ํผ์ฒ๋ ํผ์ฒ ๋ฒกํฐํ(feature vectorization)๋ฑ์ ๊ธฐ๋ฒ์ผ๋ก ๋ฒกํฐํํ๊ฑฐ๋ ๋ถํ์ํ ํผ์ฒ๋ผ๊ณ ํ๋จ๋๋ฉด ์ญ์ ํ๋ ๊ฒ์ด ์ข๋ค.
๋ฐ์ดํฐ ์ธ์ฝ๋ฉ
๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์์ด ๋ฐ์ดํฐ ์์ฑ์ ์
๋ ฅ ๋ฐ์ง ์์ผ๋ฉฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ซ์ํ์ผ๋ก ํํ๋์ด์ผ ํ๋ค.
๋ฌธ์ํ ์นดํ
๊ณ ๋ฆฌํ ์์ฑ์ ๋ชจ๋ ์ซ์๊ฐ์ผ๋ก ๋ณํ/์ธ์ฝ๋ฉ ๋์ด์ผ ํ๋ค.
- ๋ ์ด๋ธ(Label) ์ธ์ฝ๋ฉ
- ์-ํซ(One-Hot) ์ธ์ฝ๋ฉ
1. ๋ ์ด๋ธ(Label) ์ธ์ฝ๋ฉ
์นดํ ๊ณ ๋ฆฌ ํผ์ฒ๋ฅผ ์ฝ๋ํ ์ซ์ ๊ฐ์ผ๋ก ๋ณํํ๋ ๊ฒ.
[TV, ๋์ฅ๊ณ , ์ ์๋ ์ธ์ง, ์ปดํจํฐ, ์ ํ๊ธฐ, ๋ฏน์] -> [0, 1, 4, 5, 3, 2]
from sklearn.preprocessing import LabelEncoder
items = ['TV','๋์ฅ๊ณ ','์ ์๋ ์ง','์ปดํจํฐ','์ ํ๊ธฐ','์ ํ๊ธฐ','๋ฏน์','๋ฏน์']
# LabelEncoder ํด๋์ค๋ฅผ encoder ๊ฐ์ฒด๋ก ์์ฑํ ํ
encoder = LabelEncoder()
# fit์ transform ์ํ ์ ํ์ ๋ง์ถฐ์ฃผ๋ ์ญํ
encoder.fit(items)
# encoder.transform( ) ์ผ๋ก label ์ธ์ฝ๋ฉ ์ํ.
labels = encoder.transform(items)
print('์ธ์ฝ๋ฉ ๋ณํ๊ฐ:', labels)
print('์ธ์ฝ๋ฉ ํด๋์ค:', encoder.classes_)
print('๋์ฝ๋ฉ ์๋ณธ ๊ฐ:', encoder.inverse_transform([0, 1, 4, 5, 3, 3, 2, 2]))
๋ฐ์ดํฐ๊ฐ ์ปค ๋ฌธ์์ด ๊ฐ์ด ์ด๋ค ์ซ์ ๊ฐ์ผ๋ก ์ธ์ฝ๋ฉ๋์๋์ง ํ์ธํ ์ ์๋ ๊ฒฝ์ฐ, LabelEncoder ๊ฐ์ฒด์ calsses_์์ฑ๊ฐ์ ํ์ธํ๋ฉด ๋๋ค. classes_ ์์ฑ์ 0๋ฒ๋ถํฐ ์์๋๋ก ๋ณํ๋ ์ธ์ฝ๋ฉ ๊ฐ์ ๋ํ ์๋ณธ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.
๋ ์ด๋ธ ์ธ์ฝ๋ฉ์ ๊ฐ๋จํ๊ฒ ๋ฌธ์์ด ๊ฐ์ ์ซ์ํ ์นดํ ๊ณ ๋ฆฌ ๊ฐ์ผ๋ก ๋ณํํ์ง๋ง, ๋ช๋ช ML ์๊ณ ๋ฆฌ์ฆ์์๋ ์ด๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ ์์ธก ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ ์ซ์ ๊ฐ์ ๊ฒฝ์ฐ ํฌ๊ณ ์์์ ๋ํ ํน์ฑ์ด ์์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ ํ ํ๊ท์ ๊ฐ์ ML ์๊ณ ๋ฆฌ์ฆ์์๋ ๋ ์ด๋ธ ์ธ์ฝ๋ฉ์ ์ ์ฉํด์๋ ์ ๋๋ค. ํธ๋ฆฌ ๊ณ์ด์ ML ์๊ณ ๋ฆฌ์ฆ์ ์ซ์์ ์ด๋ฌํ ํน์ฑ์ ๋ฐ์ํ์ง ์๋๋ค.
2. ์-ํซ(One-Hot) ์ธ์ฝ๋ฉ
์-ํซ ์ธ์ฝ๋ฉ์ ํผ์ฒ ๊ฐ์ ์ ํ์ ๋ฐ๋ผ ์๋ก์ด ํผ์ฒ๋ฅผ ์ถ๊ฐํด ๊ณ ์ ๊ฐ์ ํด๋นํ๋ ์ปฌ๋ผ์๋ง 1์ ํ์ํ๊ณ ๋๋จธ์ง ์ปฌ๋ผ์๋ 0์ ํ์ํ๋ ๋ฐฉ์. ์์ ์ค๋ช ํ ๋ ์ด๋ธ ์ธ์ฝ๋ฉ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ์ธ์ฝ๋ฉ ๋ฐฉ์
1) sklearn์์์ ์ํซ ์ธ์ฝ๋ฉ
์ฒซ๋ฒ์งธ, ์ซ์๊ฐ์ผ๋ก ๋ณํ์ ์ํด LabelEncoder๋ก ๋ณํ
๋๋ฒ์งธ, 2์ฐจ์ ๋ฐ์ดํฐ๋ก ๋ณํ(reshape ํ์ฉ)
์ธ๋ฒ์งธ, ์-ํซ ์ธ์ฝ๋ฉ์ ์ ์ฉ
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items=['TV','๋์ฅ๊ณ ','์ ์๋ ์ง','์ปดํจํฐ','์ ํ๊ธฐ','์ ํ๊ธฐ','๋ฏน์','๋ฏน์']
# ์ฒซ๋ฒ์งธ, ๋จผ์ ์ซ์๊ฐ์ผ๋ก ๋ณํ์ ์ํด LabelEncoder๋ก ๋ณํํฉ๋๋ค.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
labels
# ๋๋ฒ์งธ, 2์ฐจ์ ๋ฐ์ดํฐ๋ก ๋ณํํฉ๋๋ค.
labels = labels.reshape(-1, 1)
labels
# ๋ง์ง๋ง์ผ๋ก ์-ํซ ์ธ์ฝ๋ฉ์ ์ ์ฉํฉ๋๋ค.
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print('์-ํซ ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ')
print(oh_labels.shape)
oh_labels.toarray()
2) ํ๋ค์ค์ ์ํซ ์ธ์ฝ๋ฉ
ํ๋ค์ค์ get_dummies ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ์ํซ ์ธ์ฝ๋ฉ์ด ๊ฐ๋ฅํ๋ค.
์ฌ์ดํท๋ฐ์ One-Hot ์ธ์ฝ๋ฉ๊ณผ ๋ค๋ฅด๊ฒ ๋ฌน์ด ์นดํ
๊ณ ๋ฆฌ ๊ฐ์ ์ซ์ํ์ผ๋ก ๋ณํํ ํ์๊ฐ ์์ด ๋ฐ๋ก ๋ณํํ ์ ์๋ค.
import pandas as pd
df = pd.DataFrame({'item':['TV','๋์ฅ๊ณ ','์ ์๋ ์ง','์ปดํจํฐ','์ ํ๊ธฐ','์ ํ๊ธฐ','๋ฏน์','๋ฏน์'] })
df
pd.get_dummies(df) # pd.get_dummies ์ฒ๋ฆฌ : ๊ฒฐ์ธก๊ฐ์ ์ ์ธํ๊ณ 0๊ณผ 1๋ก ๊ตฌ์ฑ๋ ๋๋ฏธ๊ฐ์ด ๋ง๋ค์ด์ง๋ค
ํผ์ฒ ์ค์ผ์ผ๋ง(feature scailing)
์๋ก ๋ค๋ฅธ ๋ณ์์ ๊ฐ ๋ฒ์๋ฅผ ์ผ์ ํ ์์ค์ผ๋ก ๋ง์ถ๋ ์์ . ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ํ์คํ(Standardization)์ ์ ๊ทํ(Normalization)์ด ์๋ค.
- ํ์คํ๋ ๋ฐ์ดํฐ์ ํผ์ฒ ๊ฐ๊ฐ์ด ํ๊ท ์ด 0์ด๊ณ ๋ถ์ฐ์ด 1์ธ ๊ฐ์ฐ์์ ์ ๊ท ๋ถํฌ๋ฅผ ๊ฐ์ง ๊ฐ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธ. ํ์คํ์ ๊ฐ์ ์๋ ๊ฐ์์ ํผ์ฒ x์ ํ๊ท ์ ๋บ ๊ฐ์ x์ ํ์คํธ์ฐจ๋ก ๋๋ ๊ฐ์ผ๋ก ๊ณ์ฐํ ์ ์๋ค.
- ์ ๊ทํ๋ ์๋ก ๋ค๋ฅธ ํผ์ฒ์ ํฌ๊ธฐ๋ฅผ ํต์ผํ๊ธฐ ์ํด ํฌ๊ธฐ๋ฅผ ๋ณํํด์ฃผ๋ ๊ฐ๋ . ์ด๋ ๋ณ์๋ค์ ๋ชจ๋ ์ต์ 0~ ์ต๋ 1์ ๊ฐ์ผ๋ก ๋ณํํ๋ ๊ฒ์ธ๋ฐ, ๊ฐ๋ณ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ๋ชจ๋ ๋๊ฐ์ ๋จ์๋ก ๋ณ๊ฒฝํ๋ ๊ฒ. ์ด ๊ฐ์ ์๋ ๊ฐ์์ ํผ์ฒ x์ ์ต์๊ฐ์ ๋บ ๊ฐ์ ํผ์ฒ x์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐจ์ด๋ก ๋๋ ๊ฐ์ผ๋ก ๋ณํํ ์ ์๋ค.
์ฌ์ดํท๋ฐ์ ์ ์ฒ๋ฆฌ์์ ์ ๊ณต๋๋ Normalizer ๋ชจ๋๊ณผ ์ผ๋ฐ์ ์ธ ์ ๊ทํ๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค. ์ฌ์ดํท๋ฐ์ Normalizer ๋ชจ๋์ ์ ํ๋์์์์ ์ ๊ทํ ๊ฐ๋ ์ด ์ ์ฉ๋์์ผ๋ฉฐ, ๊ฐ๋ณ ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ๋ง์ถ๊ธฐ ์ํด ๋ณํํ๋ ๊ฒ์ ์๋ฏธ. ์ฆ, ๊ฐ๋ณ ๋ฒกํฐ๋ฅผ ๋ชจ๋ ํผ์ฒ ๋ฒกํฐ์ ํฌ๊ธฐ๋ก ๋๋ ์ค๋ค.
์ฌ์ดํท๋ฐ ํผ์ฒ ์ค์ผ์ผ๋ง ์ง์
1) StandardScaler
ํ์คํ๋ฅผ ์ฝ๊ฒ ์ง์ํ๊ธฐ ์ํ ํด๋์ค ์ฆ, ๊ฐ๋ณ ํผ์ฒ๋ฅผ ํ๊ท ์ด 0์ด๊ณ , ๋ถ์ฐ์ด 1์ธ ์ ๊ท ๋ถํฌ ํํ๋ก ๋ณํ
์ฌ์ด์ผ๋ฐ์์ ๊ตฌํํ RBF ์ปค๋์ ์ด์ฉํ๋ ์ํฌํธ ๋ฒกํฐ ๋จธ์ (Support Vector Machine)์ด๋ ์ ํ ํ๊ท(Linear Regression), ๋ก์ง์คํฑ ํ๊ท(Logistic Regression)๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฐ์์ ๋ถํฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ตฌํ๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ ์ ํ์คํ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์์ธก ์ฑ๋ฅ ํฅ์์ ์ค์ํ ์์๊ฐ ๋ ์ ์๋ค.
from sklearn.datasets import load_iris
import pandas as pd
# ๋ถ๊ฝ ๋ฐ์ดํฐ ์
์ ๋ก๋ฉํ๊ณ DataFrame์ผ๋ก ๋ณํํฉ๋๋ค.
iris = load_iris()
iris_data = iris.data
iris.feature_names
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
print('feature ๋ค์ ํ๊ท ๊ฐ')
print(iris_df.mean(), '\n')
print('feature ๋ค์ ๋ถ์ฐ ๊ฐ')
print(iris_df.var())
from sklearn.preprocessing import StandardScaler
# StandardScaler๊ฐ์ฒด ์์ฑ
scaler = StandardScaler()
# StandardScaler ๋ก ๋ฐ์ดํฐ ์
๋ณํ. fit( ) ๊ณผ transform( ) ํธ์ถ.
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
iris_scaled
# transform( )์ scale ๋ณํ๋ ๋ฐ์ดํฐ ์
์ด numpy ndarry๋ก ๋ฐํ๋์ด ์ด๋ฅผ DataFrame์ผ๋ก ๋ณํ
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature ๋ค์ ํ๊ท ๊ฐ')
print(iris_df_scaled.mean(), '\n')
print('feature ๋ค์ ๋ถ์ฐ ๊ฐ')
print(iris_df_scaled.var())
-> ๋ชจ๋ ์ปฌ๋ผ ๊ฐ์ ํ๊ท ์ 0์ ์์ฃผ ๊ฐ๊น์ด ๊ฐ์ผ๋ก, ๋ถ์ฐ์ 1์ ๊ฐ๊น์ด ๊ฐ์ผ๋ก ๋ณํ๋์๋ค.
2) MinMaxScaler
๋ฐ์ดํฐ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด์ ๋ฒ์ ๊ฐ์ผ๋ก ๋ณํ(์์ ๊ฐ์ด ์์ผ๋ฉด -1์์ 1 ๊ฐ์ผ๋ก ๋ณํ)
from sklearn.preprocessing import MinMaxScaler
# MinMaxScaler๊ฐ์ฒด ์์ฑ
scaler = MinMaxScaler()
# MinMaxScaler ๋ก ๋ฐ์ดํฐ ์
๋ณํ. fit() ๊ณผ transform() ํธ์ถ.
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
# transform()์ scale ๋ณํ๋ ๋ฐ์ดํฐ ์
์ด numpy ndarry๋ก ๋ฐํ๋์ด ์ด๋ฅผ DataFrame์ผ๋ก ๋ณํ
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature๋ค์ ์ต์ ๊ฐ')
print(iris_df_scaled.min(), '\n')
print('feature๋ค์ ์ต๋ ๊ฐ')
print(iris_df_scaled.max())
-> ๋ชจ๋ ํผ์ฒ์ ๊ฐ์ด 0~1 ์ฌ์ด๋ก ๋ณํ๋์๋ค.
๋๊ธ