
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋ฐ์ดํฐ ํ์ง์ ๋ ์ข์ฐ๋๋ค.
โGarbage in, garbage outโ โ ์ ์ฒ๋ฆฌ๊ฐ ์๋ง์ด๋ฉด ์๋ฌด๋ฆฌ ์ข์ ๋ชจ๋ธ๋ ์ธ๋ชจ์๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(Data Preprocessing)๋ ์์(raw) ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ์ด ํ์ตํ ์ ์๋ ํํ๋ก ๋ง๋๋ ๋จ๊ณ๋ค.
์ด ๊ฐ์์์๋ Python๊ณผ R์ ๋ณํํด ๋ค์ ๊ณผ์ ์ ํ์ตํ๋ค.
| ์ฃผ์ ๋จ๊ณ | ํต์ฌ ๊ฐ๋ | ์์ |
|---|---|---|
| ๊ฒฐ์ธก์น ์ฒ๋ฆฌ | ํ๊ท /์ค์๊ฐ ๋์ฒด, ์ญ์ | ๋์ด ์ปฌ๋ผ์ ๊ฒฐ์ธก์น๊ฐ ์๋ ๊ฒฝ์ฐ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒด |
| ๋ฒ์ฃผํ ์ธ์ฝ๋ฉ | ์ซ์ํ ๋ณํ | โFranceโ, โGermanyโ โ [1, 2] |
| ๋ฐ์ดํฐ ๋ถ๋ฆฌ | Train/Test ๋ถํ | 80:20 ๋น์จ๋ก ํ์ต์ฉ๊ณผ ๊ฒ์ฆ์ฉ ๋ฐ์ดํฐ ๋ถ๋ฆฌ |
| ์ค์ผ์ผ๋ง | ํ์คํ(Standardization) / ์ ๊ทํ(Normalization) | ํค(cm)์ ๋ชธ๋ฌด๊ฒ(kg) ๋จ์์ฐจ ์ ๊ฑฐ |
์ด ๊ณผ์ ์ ๋ชจ๋ ๋จธ์ ๋ฌ๋ ํ์ดํ๋ผ์ธ์ ๊ธฐ๋ฐ์ด๋ค.
์ด ์ค 2๋จ๊ณ ์ ์ฒ๋ฆฌ๋ ๋๋จธ์ง ๊ณผ์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ ๋จ๊ณ๋ค.
์ค์ต์์๋ Pandas์ NumPy๋ฅผ ์ฌ์ฉํด CSV ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ๋ค.
import numpy as np
import pandas as pd
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, :-1].values # ๋
๋ฆฝ๋ณ์
y = dataset.iloc[:, -1].values # ์ข
์๋ณ์
๐ก .iloc[:, :-1] โ ๋ง์ง๋ง ์ด์ ์ ์ธํ ์ ์ฒด ์ด ์ ํ
๐ก .iloc[:, -1] โ ๋ง์ง๋ง ์ด(๊ฒฐ๊ณผ ๋ณ์) ์ ํ
read.csv()์ pd.read_csv() ๋น๊ต๋ฐ์ดํฐ์๋ ์ข
์ข
๊ฐ์ด ๋น์ด ์๋ ์
(NA, NaN)์ด ์กด์ฌํ๋ค.
์ด๋๋ก ๋ชจ๋ธ์ ๋ฃ์ผ๋ฉด ํ์ต์ด ์คํจํ๋ค.
dataset.dropna(inplace=True)
๋จ์ : ์ ๋ณด ์์ค์ด ํผ
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])
| ์ ๋ต | ์ค๋ช | ์์ |
|---|---|---|
mean | ํ๊ท ์ผ๋ก ๋์ฒด | ์์นํ ์ปฌ๋ผ |
median | ์ค์๊ฐ์ผ๋ก ๋์ฒด | ์ด์์น๊ฐ ๋ง์ ๊ฒฝ์ฐ |
most_frequent | ์ต๋น๊ฐ์ผ๋ก ๋์ฒด | ๋ฒ์ฃผํ ๋ฐ์ดํฐ |
R์์๋ na.omit(), mutate() + ifelse(is.na())๋ก ์ฒ๋ฆฌ.
๋ชจ๋ธ์ ์ซ์๋ง ์ธ์ํ๋ฏ๋ก, ๋ฌธ์์ด๋ก ๋ ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์ซ์๋ก ๋ณํํด์ผ ํ๋ค.
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X[:, 0] = le.fit_transform(X[:, 0])
์:
["France", "Germany", "Spain"] โ [0, 1, 2]
๋จ์ : ์ซ์๊ฐ ํฌ๋ค๊ณ ์์ ์๋ฏธ๊ฐ ์๊น โ ํ๊ท๋ชจ๋ธ์ ๋ถ์ ์
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = np.array(ct.fit_transform(X))
๊ฒฐ๊ณผ:
France Germany Spain
1 0 0
0 1 0
0 0 1
๐ก ์์ ๋์ ๋๋ฏธ ๋ณ์(dummy variable)๋ก ๊ตฌ๋ถ
๐ก ํ๊ท ๋ชจ๋ธ์์๋ ์ฒซ ์ด(๊ธฐ์ค๊ฐ)์ ์ญ์ ํด ๋ค์ค๊ณต์ ์ฑ ๋ฐฉ์ง
๋ชจ๋ธ์ ์ผ๋ฐํ ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ค.
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=1
)
| ์ฉ๋ | ๋น์จ | ์ค๋ช |
|---|---|---|
X_train, y_train | 80% | ๋ชจ๋ธ ํ์ต |
X_test, y_test | 20% | ๋ชจ๋ธ ๊ฒ์ฆ |
๐ก random_state๋ฅผ ๊ณ ์ ํด ์ฌํ์ฑ ํ๋ณด
R์์๋ sample.split() ํจ์๋ก ๋์ผํ ์์
์ํ.
๊ฐ ํน์ฑ์ด ๋ค๋ฅธ ๋จ์๋ฅผ ๊ฐ์ง๋ฉด ๋ชจ๋ธ์ด ํน์ ๋ณ์์ ํธํฅ๋๋ค.
์๋ฅผ ๋ค์ด, โ์ฐ๋ด(๋ง์)โ์ โ๋์ด(์ธ)โ๋ณด๋ค ๊ฐ์ด ํจ์ฌ ์ปค์ ํ์ต์ ์ํฅ์ ๊ณผ๋ํ๊ฒ ๋ฏธ์น๋ค.
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train[:, 3:] = sc.fit_transform(X_train[:, 3:])
X_test[:, 3:] = sc.transform(X_test[:, 3:])
๊ณต์:
โ ํ๊ท 0, ํ์คํธ์ฐจ 1๋ก ๋ณํ
๋ชจ๋ ๊ฐ์ 0~1 ์ฌ์ด๋ก ๋ง์ถค.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
ํธ๋ฆฌ ๊ธฐ๋ฐ ๋ชจ๋ธ(Decision Tree, Random Forest)์ ์ค์ผ์ผ๋ง ๋ถํ์
๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ(KNN, SVM, PCA ๋ฑ)์ ํ์
| ๋จ๊ณ | Python | R |
|---|---|---|
| ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ | pd.read_csv() | read.csv() |
| ๊ฒฐ์ธก์น ์ฒ๋ฆฌ | SimpleImputer | mutate() + ifelse() |
| ์ธ์ฝ๋ฉ | OneHotEncoder | factor() |
| ๋ฐ์ดํฐ ๋ถ๋ฆฌ | train_test_split() | sample.split() |
| ์ค์ผ์ผ๋ง | StandardScaler | scale() |
# Step 1. Import
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
# Step 2. Load dataset
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
# Step 3. Handle missing values
imputer = SimpleImputer(strategy='mean')
X[:, 1:3] = imputer.fit_transform(X[:, 1:3])
# Step 4. Encode categorical data
ct = ColumnTransformer([('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = np.array(ct.fit_transform(X))
# Step 5. Split dataset
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Step 6. Feature scaling
sc = StandardScaler()
X_train[:, 3:] = sc.fit_transform(X_train[:, 3:])
X_test[:, 3:] = sc.transform(X_test[:, 3:])
์ด ํ ํ๋ฆฟ์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ค ๋ฐ์ดํฐ์ ์ด๋ผ๋ ๊ฐ๋จํ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๋ ๋จธ์ ๋ฌ๋์ ์ถ๋ฐ์ ์ด์ ํต์ฌ ๋จ๊ณ๋ค.
๊ฒฐ์ธก์น, ์ธ์ฝ๋ฉ, ๋ถ๋ฆฌ, ์ค์ผ์ผ๋ง์ ์๋ํํ๋ฉด ๋ชจ๋ธ ํ์ต ๊ณผ์ ์ด ์์ ํ๋๊ณ , ์ฌํ์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๐ ํต์ฌ ์์ฝ
| ๋จ๊ณ | ์ฃผ์ ๋ชฉ์ | Python ๋๊ตฌ |
|---|---|---|
| ๊ฒฐ์ธก์น ์ฒ๋ฆฌ | ๋ถ์์ ํ ๋ฐ์ดํฐ ๋ณด์ | SimpleImputer |
| ์ธ์ฝ๋ฉ | ๋ฒ์ฃผํ โ ์ซ์ํ ๋ณํ | OneHotEncoder |
| ๋ฐ์ดํฐ ๋ถ๋ฆฌ | ์ผ๋ฐํ ํ๊ฐ | train_test_split |
| ์ค์ผ์ผ๋ง | ๋ณ์ ๋จ์ ์ ๊ทํ | StandardScaler |