[Sklearn] 전처리 (pre-processing)
전처리 (pre-processing)
데이터를 분석에 적합하게 가공/변형/처리/클리닝
train / validation 세트 나누기
feature와 label을 정의한 후, 적절한 비율로 train / validation set을 나눈다.
feature = ['Pclass', 'Sex', 'Age', 'Fare']
label = ['Survived']
test_size: validation set에 할당할 비율 (20% → 0.2)
shuffle: 셔플 옵션 (기본:True)
random_state: 랜덤 시드값
from sklearn.model_selection import train_test_split
x_train, x_valid, y_train, y_valid = train_test_split(train[feature], train[label],
test_size=0.2, shuffle=True, random_state=30)
1. 결측치 (Imputer)
1개의 column을 처리하는 경우: train['Age'].fillna(train['Age'].mean())
2개 이상의 column을 한 번에 처리할 때: imputer
결측치 확인: train.isnull().sum()
① 수치형 (Numerical Column) 데이터에 대한 결측치 처리
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
result = imputer.fit_transform(train[['Age', 'Pclass']])
train[['Age', 'Pclass']] = result
② 범주형 (Categorical Column) 데이터에 대한 결측치 처리
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='most_frequent')
result = imputer.fit_transform(train[['Embarked', 'Cabin']])
train[['Embarked', 'Cabin']] = result
2. Label Encoding
문자(categorical)를 수치(numerical)로 변환
NaN 값이 포함되어 있다면, LabelEncoder가 정상 동작하지 않는다.
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
train['Sex_num'] = le.fit_transform(train['Sex'])
male → 1, female → 0 으로 변환되었다.
LabelEncoder로 변환한 문자 배열을 나타낸다.
수치로 변환한 것을 다시 문자로 변환할 수 있다.
3. 원 핫 인코딩 (One Hot Encoding)
데이터를 기계학습을 시키면, 기계는 데이터 안에서 관계를 학습한다.
독립적인 데이터는 별도의 column으로 분리하고, 각각의 컬럼에 해당 값에만 True 나머지는 False를 갖는다.
column을 분리해 카테고리형에서 수치형으로 변환하면서 생기는 수치형 값의 관계를 끊어주어서 독립적인 형태로 바꾸어 준다.
카테고리(계절, 항구, 성별, 종류, 한식/일식/중식 등)의 특성을 가지는 column에 대해서 적용한다.
먼저, Label Encoding을 통해 문자를 수치로 변환한다.
문자로 구성된 column의 상위 6개 데이터
수치로 구성된 column의 상위 6개 데이터
get_dummies 함수를 이용하여 원 핫 인코딩을 진행한다.
4. 정규화 (Normalize)
column간에 다른 min/max 값을 가지는 경우, 정규화를 통해 최솟값/최댓값의 척도를 맞추어 주는 것
0~1 사이의 분포로 조정
movie = {'naver': [2, 4, 6, 8, 10],
'netflix': [1, 2, 3, 4, 5]
}
movie = pd.DataFrame(data=movie)
MinMaxScaler을 이용하여 정규화를 진행한다.
5. 표준화 (Standard Scaling)
평균이 0과 표준편차가 1이 되도록 변환
x = np.arange(10)
x[9] = 1000 # outlier 추가
x.mean(), x.std() # (103.6, 298.8100399919654)
StandardScaler을 이용하여 표준화를 진행한다.
from sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler()
scaled = standard_scaler.fit_transform(x.reshape(-1, 1))
scaled.mean(), scaled.std() # (4.4408920985006264e-17, 1.0)
round(scaled.mean(), 2), scaled.std() # (0.0, 1.0)