오늘은 정형데이터에서 정확도를 높히기 위해 시도해 볼 수 있는 전략들을 아는 만큼 적어보려고 한다.
정형 데이터에 대해 시도 해봤던 것들.
전처리 부분
1. 결측치 처리
결측치는 데이터에 따라 빈번하게 나타나는데 결측치를 처리하는 방법은 다양하다.
- 그냥 제거하는 방법
- 중위값 , 평균값으로 대체 하는 방법
- 결측치 자체를 Y 데이터로 해서 나머지로 예측하는 방법
경험상 예측하는 방법이 성능이 좋았던 기억이 있고 그때는 Gradient Boosting 모델을 사용했다.
2. 파생 변수 생성
데이터의 열 정보를 꼼꼼히 살펴보고 파생변수로 만들 수 있는 것이 있다면 추가해주는 것이 좋다.
예측에 있어서 열이 너무없다면 많이 늘리는 것이 중요하다.
특성교차 방법 사용
변수 두개를 곱하거나 , 원 핫 벡터를 곱한 값을 새로운 파생변수로 생성하는 방법
* 특성 교차를 사용하면 비선형 문제를 해결 할 수 있다.
3. 시간 데이터 전처리
시간으로 되어있는 열은 년도, 월 , 일 , 시간 , 요일 등으로 나눠서 파생변수로 만들어주는 것이 좋다.
나눈 시간 데이터중 유의미한 데이터를 변수로 사용한다.
train['logging_timestamp'] = pd.to_datetime(train['logging_timestamp'])
train['hour'] = train['logging_timestamp'].dt.strftime('%H').astype(int)
train['day'] = train['logging_timestamp'].dt.strftime('%d').astype(int)
train = train.drop('logging_timestamp' , axis= 1)
4. 이상치 제거 ( Log 변환 )
데이터가 한쪽으로 너무 편향 되어있다면 로그를 취해주면 좋다.
로그를 적용하면 치우친 분포를 조정해주고 값들이 축소되기 때문에 이상치도 처리해줄 수 있다,
로그 변환을 했음에도 불구하고 너무 극단적인 값이 있다면 깔끔한 데이터 셋을 위해 제거해 줄 필요가 있다.
5. 불균형 데이터 처리
라벨데이터가 불균형 하다면
혹 이진분류 문제에서 True 와 False 의 value counts 가 많이 차이난다면 샘플링을 통해 데이터의 균형을 맞춰줄 필요가 있다.
샘플링 기법은 없는 데이터의 맞추는 언더 샘플링이있고 많은 데이터의 맞추는 오버 샘플링이 있다.
그 중 성능이 좋은 것은 오버 샘플링 중 SMOTE 알고리즘이다.
6. 구간화
데이터의 최소값과 최대값의 차이가 크다면 구간화를 고려해볼 필요가 있다.
구간화는 pd.qcut 과 pd.cut 그리고 np.digitize 함수들이 있고 구간화를 진행하면 이상치를 완화할 수 있고
과적합을 완화 시켜주는 효과 , 결과에 대한 해석이 용이하다는 장점이 있다.
나는 오히려 구간화를 해서 정확도가 떨어진 적이 있는 데 무조건 구간화를 하는 것은 좋지 않고 최소,최대가 차이가
많이 나거나 구간에 대한 특징이 있을 때 나눠주면 좋다.
7. 인코딩
인코딩은 고려해보는 것이 아니라 필수요소이다.
문자를 숫자로 바꿔주는 것 뿐만이아니라, label 인코딩으로 할 것인지 oneHot 인코딩으로 할 것 인지도 중요하다.
데이터에 대한 순서가 의미 있는 경우는 label로 해주는 것이 좋고, 예를 들면 학점 A학점 , B학점 A가 B보다 높다.
데이터의 순서가 의미 없는 경우는 oneHot으로 해주는 것이 좋다 , 예를 들면 강아지와 고양이
모델링
1. 스케일링
스케일링도 필수요소 중 하나이다. 사실 트리기반의 모델에서는 스케일링의 유무와 상관없이 결과값이 거의 차이가 없지만
다른 모델일 경우 스케일링은 중요하다. 스케일링은 일정 구간에 데이터를 다 몰아 넣음으로써 스케일을 조정해준다.
2. 변수 선택
변수가 너무 많을 경우 중요한 변수만 추려서 학습에 사용해 주는 것이 좋다.
여기서 많다는 것은 최소 100개 이상을 의미하고 정확도 측면에서 좋은 성능을 보여줄 수 도 있지만
계속해서 테스트를 진행함에 있어서 변수가 많으면 그 만큼 테스트 시간도 많이 늘어난다.
3. PCA
변수 선택의 일종으로 중요 변수만 뽑아내는 것이 아니라 차원을 축소시켜 잘 설명하는 변수들 몇개만 사용하는 방법이다.
변수 선택법과 같이 성능의 증가보다 변수들이 너무 많을 때 사용해주면 테스트의 용이하다.
4. K-fold 교차 검증
교차 검증은 말그대로 성능을 높히는 것이 아니라
내가 본 성능이 과연 다른 데이터로 섞었을 때도 비슷한 성능을 내는 지 확인하는 작업이다.
5. Hyperparams 최적화
여러가지 모델을 돌려보고 그 중 성능이 좋은 모델에 대해서 하이퍼파라미터 조합을 바꿔가며 성능을 높힐 수 있다.
Grid Search 와 Random Serach 패키지로 여러가지 조합을 테스트 해 볼 수 있고 최적의 조합을 찾아 낼 수 있다.
6. Auto ML
이건 말그대로 자동으로 제일 좋은 거 찾아주는 방법으로 다양한 라이브러리들이 있다.
데이터만 넣으면 가장 성능이 좋은 것을 찾아준다. pycarot 등이 있다.
7. Stacking
스테킹은 앙상블 기법의 하나로 예측 모델들의 결과를 트레이닝 셋으로 사용하는 것이다.
이게 무슨 말이냐 하면, 예측 모델을 쌓아서 실제로 예측한 값을 합치고 그 중 투표로 결정하는 것이다.
케글에서 순위를 다툴 때 많이 사용되지만 일반적으로는 사용을 하지 않는 편이다.
'Machine learning' 카테고리의 다른 글
[기계학습] Stacking (스태킹) (0) | 2021.02.03 |
---|---|
[기계학습] . Imbalanced Data ( 불균형 데이터 ) - SMOTE (0) | 2021.02.03 |
[기계학습] Kernel Support Vector Machines ( KSVMs , 커널 서포트 벡터 머신) (0) | 2021.01.12 |
[데이터 전처리]. pandas Dataframe 중복된 값 제거하기 (0) | 2020.12.04 |
[데이터 전처리]. pandas Dataframe, Series 특수문자 제거하기 (0) | 2020.12.04 |