본문 바로가기

Analytics/Study

실전#1. 데이터 분석으로 심부전증을 예방할 수 있을까(3)

EDA 이후 모델 학습을 위한 데이터 전처리 과정

(실제로는 EDA가 저렇게 스르륵 끝나지는 않지만, 아무래도 강의에서는 정돈된 데이터로 설명해야 전달하고자 하는 내용을 명확히 전달할 수 있다보니 간단히 끝났다.)
 
여튼 EDA를 잘 진행했다고 보고, 이후 과정으로 들어가면
 
간단하면서도 중요한 작업이 스케일링 작업이다.
우선 코드부터 정리해보자

from sklearn.preprocessing import StandardScaler

# 수치형 입력 데이터, 범주형 입력 데이터, 출력 데이터로 구분하기
X_num = df[['age', 'creatinine_phosphokinase', 'ejection_fraction', 'platelets', 'serum_creatinine', 'serum_sodium']]
X_cat = df[['anaemia', 'diabetes', 'high_blood_pressure', 'sex', 'smoking']]
y = df['DEATH_EVENT']

# 수치형 입력 데이터를 전처리하고 입력 데이터 통합하기
scaler = StandardScaler()
scaler.fit(X_num)
X_scaled = scaler.transform(X_num)
X_scaled = pd.DataFrame(data = X_scaled, index = X_num.index, columns=X_num.columns)
X = pd.concat([X_scaled, X_cat], axis = 1)

 
스케일링 작업을 위해서 가장 중요한 부분만 정리하면
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
이 될것이다.
 
다만 이 작업만으로 충분치 않아 위 코드에서는 추가적인 작업이 들어갔는데
이유를 설명하자면
StandardScaler는 각 변수들을 평균이 0, 표준편차가 1로 변환되도록, 즉 정규분포가 되도록 만들어주는 방법이다.
정규분포가 필요한 이유는, 변수들 간 데이터 사이즈가 각기 다른 상태에서 모델링을 들어가게된다면
실제 영향이 크지 않음에도 데이터 사이즈 자체가 매우 큰 변수가 과대해석될 수 있는
또는 그 반대로 중요한 변수가 데이터 사이즈 문제로 영향도가 없는 변수처럼 해석될 수 있기 떄문이다.
 
이런 이유로 StandardScaler 작업이 필요하였고,
대상 변수들은 수치형 변수이기에 중간에 수치형과 범주형을 구분한 것이다.
 
이어 진행되는 fit(X_num)의 의미는 X_num을 입력받아 각 변수별 평균과 표준편차를 계산하고,
transform(X_num)에서 해당 변수를 변환하는 의미이다.
이 때 fit_transform(X_num)을 사용한다면 위의 fit과 transform을 동시 실행할 수도 있다.
 

데이터의 기본 형태(age는 50~75의 범위, creatinine_phosphokinase는 111 ~ 7861로 데이터 사이즈가 다르다)
StandardScaler를 적용한 후 변환된 데이터 형태 (age, creatinine_phosphokinase 모두 -1과 1 사이의 값으로 변환되었다)



전처리 작업을 마무리?하고
(이 역시 추가작업이 필요한 경우 추가작업을 해주는것이 좋다... 로그 변환 등등 최대한 정규분포 형태로 바꿀수 있도록)
 
그 다음 과정은

학습 데이터와 테스트 데이터 분리 과정

여기서도 일단 코드부터 살펴보자

from sklearn.model_selection import train_test_split

# train_test_split() 함수로 학습 데이터와 테스트 데이터 분리하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 1)

# train 데이터 확인해보기
X_train

 

X_train을 조회했을 때 index를 참고하면, 데이터가 랜덤으로 섞인 형태임을 알 수 있다.

 

 
train_test_split는 학습용(train)과 검증용(test)으로 나눠주는 함수로,
X에 해당되는 변수들을 가지고 y(target)에 대한 학습을 진행한다.
test_size로 학습용과 검증용의 비율을 나눌 수 있는데, 위 예시에서는 30% 데이터를 검증 목적으로, 70% 데이터를 학습 목적으로 사용한다.
random_state 는 적용해도 되고, 안해도 되는데
개인적으로는 실행한 결과 비교 또는 히스토리 관리 차원에서 적용하는걸 선호한다.
 
강의에서는 데이터의 형태가 순차적인 경우 학습과 검증을 순차적으로 구분하기 위한 추가 옵션 설명이 있었는데
보통은 사용하지 않는 기능이라 여기서도 설명을 생략한다.
 
이렇게 데이터 분리까지 마치게되면
모델 학습단계로 이어지게 된다.(뭔가 빠른 진행에 당황)
 
일단 오늘의 정리는 여기까지!!
 

http://bit.ly/3Y34pE0

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.