본문 바로가기
학습노트/Python

[강의노트] Python - 머신러닝 - 예측모델링 프로세스 (1)

by kime2 2024. 1. 31.
스파르타코딩클럽의 강의를 참고하여 정리하였습니다

 

예측모델링 프로세스

스파르타코딩클럽

데이터 전처리

1. 이상치(outlier)

이상치: 보통 관측된 데이터 범위에서 많이 벗어난 아주 작은/큰 값

 

1-1. 이상치 발견 방법

1)  ESD(extreme studentized deviation)을 이용한 이상치 발견

  • 데이터가 정규분포를 따른다고 가정할 때, 평균에서 표준편차의 3배 이상 떨어진 값
  • 모든 데이터가 정규분포를 따르지 않음(데이터 크기가 비대칭일때->log변환, 샘플 크기가 작을 때)
import numpy as np
mean = np.mean(data)
std = np.std(data)
upper_limit = mean + 3*std
lower_limit = mean - 3*std

 

2) IQR(inter quantile range)을 이용한 이상치 발견

  • EDS와 동일하게 데이터가 작거나 샘플 사이즈가 작은 경우 제한
Q1 = df['column'].quantile(0.25)
Q3 = df['column'].qunatile(0.75)
IQR = Q3 - Q1
uppper_limit = Q3 + 1.5*IQR
lower_limit = Q1 - 1.5*IQR

스파르타코딩클럽

 

  • Q1: 25%, Q2:50%, Q3: 75%
  • IQR = Q3 - Q1
  • 상한 이상치: Q3 + 1.5*IQR
  • 하한 이상치: Q1 - 1.5*IQR

1-2. 이상치 처리 방법

1) bloolean indexing을 통한 데이터 삭제

  • df[df['column'] > limit_value]

2. 결측치 (Missing Value)

  • 의미: 존재하지 않는 데이터

2-1. 결측치 발견 방법

 

2-2. 결측치 처리 방법

(1) 수치형 데이터

  • 평균값 대치: 대표적인 대치 방법
  • 중앙값 대치: 데이터에 이상치가 많아 편균이 대표성이 없다면 사용

(2) 범주형 데이터

  • 최빈값 대치

(3) 사용 함수

간단한 삭제 및 대치 알고리즘 사용

3. 범주형 데이터 전처리-인코딩(encoding)

정해진 규칙에 따라 변환하는 과정

 

3-1. 레이블 인코딩(Label Encoding)

  • 문자열 범주형 값을 고유한 숫자로 할당
  • 예: 1등급 -> 1 / 2등급->2 /. 등급 -> 3
  • 장점: 모델이 처리하기 쉬운 수치형 데이터로 변환
  • 단점: 실제로는 그렇지 않은데, 순서 간 크기에 의미가 부여되어 모델이 잘못 해석할 수 있음

 

3-2. 원-핫 인코딩(one-hot-encoding)

  • 정의:  각 범주를 이진 형식응로 변환
  • 예: 빨강 -> [1,0,0] / 노랑 -> [0,1,0] / 초록 -> [0,0,1]
  • 장점: 각 범주가 독립적으로 표현되어, 순서사 중요도를 잘못 학습하는 것을 방지(for 명목형 데이터)
  • 단점: 범주 개수가 많을 경우 차원이 크게 증가, 모델의 복잡도 증가, 과적합 유발

# CSR 데이터 데이터프레임으로 만들기
csr_df = pd.DataFrame(csr_data.toarray(), columns = oe.get_feature_names_out())
# 기존 데이터프레임에 붙이기(옆으로)
pd.DataFrame([titaninc_df,csr_df], axis = 1)

 

4. 수치형 데이터 전처리-스케일링(scaling)

머신러닝의 학습에 사용되는 데이터들은 서로 단위값이 다르기 때문에 보정필요

 

4-1) 표준화(Standardization)

  • 각 데이터에 평균을 빼고 표준편차로 나누어 편균을 0, 표준편차를 1로 조정하는 방법
  • 장점: 이상치가 있거나, 분포에 치우쳐져 있을 때 유용, 모든 특성의 스케일을 동일하게 맞춤(알고리즘에 적합)
  • 단점: 데이터의 최소-최대 값이 정해지지 않음 

 

4-2) 정규화(Normalization)

  • 정의: 데이터를 0과 1사이 값으로 조정(최소값 0, 최대값 1)
  • 장점: 모든 특성의 스케일을 동일하게 맞춤, 최소-최대 범위가 명확
  • 단점: 이상치에 영향을 많이 받을 수 있음(이상치가 없으면 유용)

 

4-3) 로버스트 스케일링 (Robust Scaling)

  • 정의: 중앙값과 IQR을 사용하여 스케일링
  • 장점: 이상치의 영향에 덜 민감
  • 단점: 표준화와 정규화에 비해 사용도가 낮음

 

 


 

데이터 전처리 - 데이터분리  for 과적합

1. 과적합(overfitting)

  • 데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터를 제대로 예측 혹은 분류하지 못하는 현상

모형이 지나치게 복잡할 때 -> 과대적함

모형이 지나치게 단순할 때 -> 과소적합

과적합의 원인 : 모델의 복잡도 / 데이터 양이 충분하지 않을 때 / 학습 반복이 많음(딥려닝) / 데이터의 불균형

 

2. 과적합의 해결 by 테스트데이터 분리

  • 학습 데이터 (train data) : 모델을 학습(fit)하기 위한 데이터
  • 테스트 데이터 (test data) : 모델을 평가 하기 위한 데이터
  • 일반적으로 합습데이터보다 테스트의 적합도가 낮아짐

 


EDA(exploratory data analysis,탐색적 데이터 분석)

데이터의 시각화, 기술통계 등의 방법을 통해 데이터를 이해하고 탐구하는 과정

 

기술통계를 통한 EDA : .describe()

tips_df.describe(include = 'all')

include = 'all' 옵션을 통해 범주형 데이터도 확인 가능

tips_df.describe() tips_df.describe(include = 'all')

 

사용데이터: Kaggle의 titanic train 데이터셋

시각화를 통한 EDA : sns

1. counplot :범주형 자료의 빈도 수 시각화

  • 목적: 범주형 데이터의 각 카테고리별 빈도수
  • x축: 범주형 자료
  • y축: (데이터x) x축 자료의 빈도수
# countplot: x축 범주형, y축 관측치
sns.countplot(data = tips_df, x = 'day')

 

2. barplot: 범주형 자료의 시각화

  • 목적: 범주형 데이터의 각 카테고리에 따른 수치 데이터의 평균 비교
  • x축: 범주형 자료
  • y축: 연속형 자료
# barplot: X축이 범주형, Y축이 연속형 값
sns.barplot(data = tips_df, x = 'sex', y = 'tip')
# 평균으로 집계하고 싶을 때 estimator = 'mean' -> 기본값

 

3. boxplot: 수치형&범주형 자료의 시각화

  • 목적:데이터의 분포, 중앙값, 사분위 수, 이상치 등을 한눈에 표현
  • x축: 수치형/범주형 자료
  • y축: 수치형 자료
sns.boxplot(data = tips_df, x = 'time',y = 'total_bill')

 

4. histogram: 수치형 자료 빈도 시각화

  • 목적: 연속형 분포를 보고 데이터가 몰려있는 구간을 파악하기
  • x축: 수치형 자료
  • y축:  (데이터x) x축 자료의 빈도수
sns.histplot(data = tips_df, x = 'total_bill')

# sns를 활용하지 않고도 표현 가능
# tips_df['total_bill'].hist()

 

5. scatterplot: 수치형끼리의 시각화

  • 목적: 두 연속형 변수간의 관계를 시작적으로 파악
  • x축: 수치형 자료
  • y축:  수치형 자료
#X축: 수치형변수
#Y축: 수치형변수
sns.scatterplot(data = tips_df, x = 'total_bill', y = 'tip')

 

6. parplot: 전제 변수에 대한 시각화

  • 목적: 한 번에 여러개의 (숫자도된)변수를 동시에 시각화 하고 싶을 때
  • x축: 수치형/범주형 자료
  • y축: 수치형/범주형 자료

sns.pairplot(data = tips_df)