데이터 분석/Python

[Sklearn] 전처리 (pre-processing)

eunki 2021. 5. 11. 17:01
728x90

전처리 (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)
728x90