이번 포스팅에서는 시계열 데이터를 어떻게 전처리 해야하는지를 알아보겠습니다.
시간현실 반영
- 미래의 시간패턴을 미리 반영하는건 비현실적, 이는 과적합(Overfitting)을 유발한다.
- 이전 실습에서 R값(결정계수)이 1이 나왔던 것은 미래시간을 안다고 가정하고 feature-enginering을 끝내고 단순히 트레인/테스트 셋으로 나누었고 test셋에도 시간정보가 들어갔기 때문, 즉 test영역의 시간은 모른다고 하는게 맞는 것이다.
예측 정확성 향상
1) Train ↑ + Test ↑
2) Train <<< Test ⟺ 조건수(Condition Number) 감소
- 조건수 : 작은 변화의 비율에 대해 함수가 얼마나 변화할 수 있는지에 대한 argument measure
조건수 감소 목적:
(비수학적 이해) : 독립변수들의 절대적 수치크기나 서로간의 의존도가 분석결과에 주는 영향을 줄이고 독립변수의 상대적인 비교효과 반영
(수학적 이해) : 공분산 행렬의 변동성을 줄여 분석결과의 변동을 줄임
- 공분산 행렬의 변동성 : 모델링 계수추정시 영향을 주는 역행렬에 오차가 미치는 영향
원리
- X의 컬럼수 기억하고 컬럼수에 따라 condition number를 체크한다.
- X의 condition number가 작을수록 과대적합의 확률이 낮아지게됨
- condition number가 작을 수록 독립된 갯수가 늘어나기 때문에 과적합이 되지않고 train보다 test의 정확성이 더 잘 나올 수 있는 방향으로 간다.
# 조건수가 작을 때
# X 데이터
import numpy as np
A = np.eye(4)
print
# Y 데이터
Y = np.ones(4)
# 계수 추정
np.linalg.solve(A, Y) #선형계수모델에서 가중치 계산
# X 데이터 오차반영
A_new = A + 0.0001 * np.eye(4)
A_new
# 계수 추정
np.linalg.solve(A_new, Y)
# 조건수 확인
print('조건수 확인')
np.linalg.cond(A)
# 조건수가 클 때
# X 데이터
from scipy.linalg import hilbert #임의의 함수를 가지고옴
A = hilbert(4)
# Y 데이터
Y = np.ones(4)
# 계수 추정
np.linalg.solve(A, Y)
# X 데이터 오차반영
A_new = A + 0.0001 * np.eye(4)
A_new
# 계수 추정
np.linalg.solve(A_new, Y)#굉장히 많이 바뀌었음
# 조건수 확인
np.linalg.cond(A)
조건수 감소 방법(분석 결과 안정성 확보 방법):
1) 변수들의 단위차이로 숫자의 스케일들이 크게 다른 경우, 스케일링(Scaling)으로 해결 가능
2) 독립변수들 간에 상관관계가 높은 "다중공선성" 존재할 경우,
Variance Inflation Factor(VIF)나 Principal Component Analysis(PCA)를 통한 변수선별로 해결 가능
3) 독립변수들 간 의존성이 높은 변수들에 패널티를 부여하는 정규화(Resularization)로 해결 가능
변수간 스케일 차이 조정(Scaling)
목적:
(하드웨어): PC 메모리를 고려하여 오버플로우(Overflow)나 언더플로우(Underflow)를 방지
(소프트웨어): 독립 변수의 공분산 행렬 조건수(Condition Number)를 감소시켜 최적화 안정성 및 수렴 속도 향상
1) Standard Scaler:
- 기본 스케일로 평균을 제외하고 표준편차를 나누어 변환
- 각 변수(Feature)가 정규분포를 따른다는 가정이기에 정규분포가 아닐 시 최선이 아닐 수 있음
sklearn.preprocessing.StandardScaler().fit()
sklearn.preprocessing.StandardScaler().transform()
sklearn.preprocessing.StandardScaler().fit_transform()
2) Min-Max Scaler:
- 가장 많이 활용되는 알고리즘으로 최소~최대값이 0~1 또는 -1~1 사이의 값으로 변환
- 분포의 모형을 그대로 지켜줌 각 변수(Feature)가 정규분포가 아니거나 표준편차가 매우 작을 때 효과적
- outlier에 취약하다는 의미, 표준편차가 커지면 취약해짐
sklearn.preprocessing.MinMaxScaler().fit()
sklearn.preprocessing.MinMaxScaler().transform()
sklearn.preprocessing.MinMaxScaler().fit_transform()
3) Robust Scaler:
- 최소-최대 스케일러와 유사하지만 최소/최대 대신에 IQR(Interquartile Range) 중 25%값/75%값을 사용하여 변환
- 이상치(Outlier)에 영향을 최소화하였기에 이상치가 있는 데이터에 효과적이고 적은 데이터에도 효과적인 편
sklearn.preprocessing.RobustScaler().fit()
sklearn.preprocessing.RobustScaler().transform()
sklearn.preprocessing.RobustScaler().fit_transform()
4) Normalizer:
- 각 변수(Feature)를 전체 𝑛 개 모든 변수들의 크기들로 나누어서 변환(by Cartesian Coordinates)
- 각 변수들의 값은 원점으로부터 반지름 1만큼 떨어진 범위 내로 변환
sklearn.preprocessing.Normalizer().fit()
sklearn.preprocessing.Normalizer().transform()
sklearn.preprocessing.Normalizer().fit_transform()
다중공선성(Multicollinearity) 제거
다중공선성(Multicollinearity) 발생하는 경우
- 독립변수의 일부가 다른 독립변수의 조합으로 표현될 수 있는 경우
- 독립변수들이 서로 독립이 아니라 상호상관관계가 강한 경우
- 독립변수의 공분산 행렬(Covariance Matrix) 벡터공간(Vector Space)의 차원과 독립변수의 차원이 같지 않는 경우(Full Rank가 아니다=condition number 가 크다)
=> 다중공선성이 있으면 독립변수 공분산 행렬의 조건수(Condition Number)가 증가
=> 조건수(Condition Number)가 증가하면 분석결과 과적합(Overfitting)이 발생할 가능성 증가
Variance Inflation Factor(VIF) 변수선택
- VIF는 독립변수를 다른 독립변수들로 선형회귀한 성능을 의미하며, 이를 통해 상호 가장 의존적인 독립변수를 제거
- 의존성이 낮은(분산이 작은) 독립변수들을 선택하거나, 의존성이 높은(분산이 높은) 독립변수들을 제거할 수 있음
- VIF는 한변수를 다른 변수의 조합으로 표현한것(모든 케이스에 대해 회귀분석 진행),
- 어떤변수가 다른변수들과의 선형결합으로 표현이 된다면 적합력이 좋아져서 R-Squared값(결정계수)로 표현이 될 것
- 즉, 어떤 변수가 다른변수들로 복제가 된다면, 독립변수가 아니며, 결정계수가 높을수록 해당 변수는 독립변수가 아닐 확률이 높은 것이다.
- 따라서 결정계수가 높아지면 VIF가 높아지며 높은 VIF값을 가진 변수는 종속성이 높기 때문에 제거 대상이 된다.
Principal Component Analysis(PCA) 변수선택
PCA는 다차원인 독립변수 행렬을 서로 독립인 소차원의 독립변수 행렬로 바꾸는 알고리즘으로, 이를 통해 상호 의존성을 제거한다.
성능을 높아지나 설명력이 부족해짐
해당 포스팅은 패스트캠퍼스의 <파이썬을 활용한 시계열 데이터 분석 A-Z 올인원 패키지> 강의를 듣고 정리한 내용입니다
'Data Analysis & ML > 시계열분석' 카테고리의 다른 글
[시계열분석] 시계열 데이터 전처리 실습(Python)(2) - 다중공선성 제거 (0) | 2021.03.08 |
---|---|
[시계열분석] 시계열 데이터 전처리 실습(Python)(1) - 시간현실반영 및 Scaling (0) | 2021.03.08 |
[시계열분석] 잔차진단 실습(Python) - 잔차진단 시각화 및 분석(bike-sharing-demand dataset) (0) | 2021.03.05 |
[시계열분석] 기본 모델링 실습(Python) - OLS 모델링 및 분석 성능 평가(bike-sharing-demand dataset) (0) | 2021.03.05 |
[시계열분석] 잔차진단(2) - 잔차진단 방향(정상성/정규분포/자기상관/등분산성) (0) | 2021.03.04 |