magicode
article thumbnail

머신러닝을 공부하면서 많이 만날 수 있는 문제 중 하나가 오버피팅이다.

오버피팅은 학습데이터를 지나치게 많이 학습시켜 학습데이터에는 딱 맞지만 테스트 데이터에는 맞지 않는 경우를 말한다.

반대로 언더피팅은 학습데이터의 양이 너무 적어 충분한 학습을 하지 못해 테스트 데이터로 예측하지 못하는 경우를 말한다.

 

위 그래프를 보면 파란 점들이 데이터고 노란 선이 예측값이다.

첫번째 그래프의 경우 언더피팅되어 데이터에 따른 예측값이 적절하지 않다.

두번째 그래프의 경우 적절하게 학습되어 데이터에 따른 예측값이 대체적으로 잘 맞는다.

세번째 그래프는 오버피팅되어 데이터에 너무 치중되어있어 예측값이 데이터에 따라 급격하게 변동한다.

 

머신러닝은 학습을 시키는 것이기 때문에 대부분 언더피팅보다는 학습을 너무 많이 시켜서 발생하는 오버피팅 문제가 많이 일어난다.

그렇다면 오버피팅을 해결하기 위해서는 어떻게 해야할까?

 

오버피팅 해결방법

1.  표준화, 정규화

정규화를 통해 값의 분산을 줄인다.

 

데이터를 볼 때 각 컬럼별 데이터값의 범위가 너무 차이나면 예측하기 어렵다.

예시)

어떤 상품을 구매한 구매자 나이별 구매량을 예측해본다고 하자.

나이 구매수량 구매금액
20대 100개 1,000,000원
40대 200개 4,000,000원

이런 경우 숫자만 놓고 보면 20, 100, 1000000 / 40, 200, 4000000 으로 범위 차이가 너무 많이 난다.

이 때 이 값들을 제한된 범위 내에 일괄적으로 맞춰주는 것을 피처 스케일링이라고 한다.

 

표준화 (StandardScaler)

각각의 피쳐에 대해 평균이 0, 분산이 1인 값으로 변환해준다.

표준화 전에는 나이 평균이 30, 구매수량 평균이 150, 구매금액 평균이 2,500,000이라면

표준화 이후에는 나이 평균 0, 구매수량 평균 0, 구매금액 평균 0으로 변경된다.

분산도 마찬가지다.

# 원본 데이터 불러오기
origin = pd.read_csv('경로')

# 원본데이터가 데이터프레임 형식이 아니라면 데이터프레임 형식으로 변환
origin_df = pd.DataFrame(data=origin, columns=origin.columns)

# 데이터프레임에서 타겟값 제거
origin_df.drop(['타겟컬럼명'], axis=1 , inplace=True)

# StandardScaler 객체생성
scaler = StandardScaler()

# StandardScaler 적용
scaler.fit(origin_df)
origin_scaler = scaler.transfrom(origin_df)

# StandardScaler 적용하면 형식이 변환되어서 다시 데이터프레임으로 변환
origin_scaler = pd.DataFrame(data=origin_scaler, columns=origin_df.columns)

 

정규화 (MinMaxScaler)

정규화는 모든 데이터값을 0~1 사이의 범위값으로 변환해준다.

위 예시에서 나이 20, 구매수량 100만 두고 보면 나이 0.2, 구매수량 1로 변환한다고 보면 된다.

코드는 표준화랑 크게 다를 바 없다. 객체 생성만 MinMaxScaler()로 해주면 된다.

# 원본 데이터 불러오기
origin = pd.read_csv('경로')

# 원본데이터가 데이터프레임 형식이 아니라면 데이터프레임 형식으로 변환
origin_df = pd.DataFrame(data=origin, columns=origin.columns)

# 데이터프레임에서 타겟값 제거
origin_df.drop(['타겟컬럼명'], axis=1 , inplace=True)

# MinMaxScaler 객체생성
scaler = MinMaxScaler()

# StandardScaler 적용
scaler.fit(origin_df)
origin_scaler = scaler.transfrom(origin_df)

# StandardScaler 적용하면 형식이 변환되어서 다시 데이터프레임으로 변환
origin_scaler = pd.DataFrame(data=origin_scaler, columns=origin_df.columns)

 

2. 교차검증

교차 검증을 통해 다양하게 학습하여 과적합 모델 생성 예방

K-폴드 교차검증을 통해 수행하는데 보통 cross_val_score() 메서드 사용

교차검증과 하이퍼 파라미터 튜닝을 한번에 하고자 할 때는 GridSearchCV 사용

 

교차검증은 본 블로그 '파이썬 머신러닝 03. 평가'에서 확인가능

2021.07.19 - [머신러닝] - 파이썬 머신러닝 03. 평가

profile

magicode

@AI magic

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!