Data Preprocessing

Daum·2021년 6월 15일
0

Machine Learning

목록 보기
6/7
post-thumbnail

📝 Data Preprocessing

📎 category_encoders

1) 인코딩

#install as:
pip install category_encoders

from category_encoders import OneHotEncoder
enc = OneHotEncoder()
enc.fit_transform(X_train)
종류특징
OneHotEncoder순위·순서가 없는 범주형 변수일 때 사용
OrdinalEncoder순위·순서가 있는 범주형 변수일 때 사용
TargetEncoder높은 카디널리티의 범주형 변수일 때 사용

2) 결측치 제거 혹은 대체

df.isnull() # 결측치 확인
df.isnull().sum() # 컬럼별 결측값 개수 확인
df.fillna(0) # 결측값을 0으로 대체
df.fillna(df.mean()) # 결측값을 변수별 평균으로 대체
df.dropna() # 결측값이 포함된 행 제거

from sklearn.impute import SimpleImputer
imp = SimpleImputer(strategy='mean') # strategy(대체값 파라미터)= mean, median, most_frequent, constant
imp.fit_transform(X_train)

3) 이상치 제거

import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.datasets import load_iris

# 데이터셋 불러오기
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['target'] = iris.target

# boxplot으로 이상치가 있는지 판단
sns.boxplot(y = "sepal width (cm)", data = df);

# outlier 제거
def get_outlier(df, column, weight):
  quantile_25 = np.percentile(df[column].values, 25)
  quantile_75 = np.percentile(df[column].values, 75)

  IQR = quantile_75 - quantile_25
  IQR_weight = IQR * weight
  
  lowest = quantile_25 - IQR_weight
  highest = quantile_75 + IQR_weight
  
  outlier = df[column][ (df[column] < lowest) | (df[column] > highest) ].index
  return outlier

outlier = get_outlier(df, 'sepal length (cm)', 1.5)
df.drop(outlier, axis=0, inplace=True)

4) 데이터의 정규화

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit_transform(X_train)
종류설명
StandardScaler각 feature의 평균을 0, 분산을 1로 변경
MinMaxScaler최소/최대값이 각각 0, 1이 되도록 변경
MaxAbsScaler최대 절대값이 1이 되도록 변경
RobustScaler중앙값(median)과 IQR(interquartile range)을 사용하여 변경

5) 데이터 밸런스

하이퍼 파라미터 조정

# Random Forest 모델
RandomForestClassifier(class_weight='balanced') # class_weight [default=None]

# XGBoost 모델
XGBClassifier(scale_pos_weight='balanced') # scale_pos_weight [default=1]

Up-sampling

데이터 자체를 증가시키는 방법이다.

df_majority = df[df.balance==0]
df_minority = df[df.balance==1]

df_minority_upsampled = resample(df_minority, replace=True, n_samples=df_majority.shape[0], random_state=123)
df_upsampled = pd.concat([df_majority, df_minority_upsampled])

Down-sampling

데이터 자체를 감소시키는 방법이다.

df_majority = df[df.balance==0]
df_minority = df[df.balance==1]
df_majority.shape, df_minority.shape

df_majority_downsampled = resample(df_majority, replace=False, n_samples=df_minority.shape[0], random_state=123)
df_downsampled = pd.concat([df_majority_downsampled, df_minority])

🔥 중요

data에 imbalance가 존재하는 경우, 단순 accuracy_score을 확인하는 것이 아닌 AUC, sensitivity, specificity를 확인해야 한다.

def evaluate(model, X, y):
    predictions = model.predict(X)
    accuracy = accuracy_score(predictions, y)
    tn, fp, fn, tp = confusion_matrix(y, predictions).ravel()
    sensitivity = tp / (tp+fn)
    specificity = tn / (tn+fp)
    auc = roc_auc_score(y, predictions)
    
    print("AUC: ", auc)
    print("Sensitivity: ", round(sensitivity,2))
    print("Specificity: ", round(specificity,2))

    return round(accuracy,2)

evaluate(clf_0, X, y)

6) Feature Engineering

머신러닝 알고리즘을 작동하기 위해 데이터에 대한 도메인 지식을 활용하여 특징(Feature)를 만들어내는 과정이다.

🔥 Pipelines

중복 코드를 최소화여 쉽게 연결할 수 있다.

pipe = make_pipeline(
    OneHotEncoder(), 
    SimpleImputer(), 
    StandardScaler(), 
    LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)

pipe.named_steps # 스텝별 파라미터 등 정보 확인

0개의 댓글