Data Wrangling에서 데이터를 로드하여 정제, 분석, 조작을 하는 데이터 렝글링에 대해 설명하고 있습니다.
특성값을 일정한 기준으로 맞추는 작업이 필요합니다. 이때 Z점수(표준점수, standard score)를 사용하여 각 데이터가 원점에서 몇 표준편차만큼 떨어져 있는지 나타내므로, 특성값의 크기와 상관없이 동일한 조건으로 비교가 가능합니다.
scikit-learn에서는 StandardScaler, MinMaxScaler, RobustScaler Normalizer를 scaler로 제공하는데, 여기서는 StandardScaler를 이용하여, 표준점수로 변환할 수 있습니다.
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
Train과 Test의 Dataset이 골고루 섞이지 않으면 Sampling Bias가 발생할 수 있으므로, 준비된 데이터 중에 일부를 떼어 train set과 test set으로 활용합니다. 아래에서는 scikit-learn의 train_test_split을 사용하는 방법을 보여줍니다.
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(
fish_data, fish_target, stratify=fish_target, random_state=42)
- stratify=fish_target: fish_target을 기준으로 섞을때 사용합니다.
- 기본값은 전체 데이터에서 25%를 test set으로 분리합니다.
Validation dataset은 모델을 학습한 후 성능 측정을 하는데 사용됩니다. 또한 이것은 Hyperparameter Optimization(HPO)에도 사용되어 집니다.
아래와 같이 scikit-learn의 train_test_split()을 2번 사용하면, test_input(Test Set)으로 20%를 분리하고, 나머지 80%를 다시 80%의 sub_input(Train Set)과 val_input(Test Set)으로 지정할 수 있습니다. Training dataset(sub_input)으로 모델을 학습(Train)을 한후에, Validation dataset(val_input)으로 성능을 측정하거나 HPO를 수행하고, Test dataset으로 최종모델의 성능을 평가합니다.
import pandas as pd
wine = pd.read_csv('https://bit.ly/wine_csv_data')
data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(
data, target, test_size=0.2, random_state=42)
sub_input, val_input, sub_target, val_target = train_test_split(
train_input, train_target, test_size=0.2, random_state=42)
print(data.shape, sub_input.shape, val_input.shape, test_input.shape)
(6497, 3) (4157, 3) (1040, 3) (1300, 3)
데이터의 분할하는 방법에 따라 결과가 결과가 달라질수 있으므로, k번 분할을 통해 교차검증(cross validation)을 하면 더 좋은 결과를 얻을 수 있습니다.
전체 dataset에서 일정한 묶음으로 나누어 처리할 수 있는 배치와 훈련의 횟수인 epoch의 선택이 중요합니다. 이때 훈련과정에서 값의 변화를 시각적으로 표현하여 파라메터에 대한 최적의 값을 찾을 수 있어야 합니다.
Dataset 1000개에 대한 배치 크기가 20이라면, sample 단위 20개마다 모델 가중치를 한번씩 업데이트 시킨다는 의미입니다. 즉, 50번 (=1000/20)의 가중치가 업데이트 됩니다. 이때 epoch가 10이고 모델크기가 20이라면, 가중치를 50번 업데이트하는것을 총 10번 반복한다는 의미입니다. 각 데이터 sample이 총 10번씩 사용되는것이므로, 결과적으로 총 500번 업데이트 됩니다.