티스토리 뷰

반응형

주제

  • 센서 데이터 분류 예측
  • 문제 정의
    • 562개의 피처 데이터를 통해,타겟값인 6개의 동작 분류
    • 3일차 캐글 컴퍼티션에는 라벨 12개를 분류

목표

  • 피처 엔지니어링 실습
  • 탐색적 데이터 분석 실습
  • 머신러닝 모델링 과정 실습
  • 모델 성능 향상을 위한 추가적인 피처 엔지니어링/튜닝 실습

프로젝트 내 역할

  • pycaret을 이용한 Best model 도출
  • 시계열 피처 도출
  • smote를 이용한 upsampling
  • boxcox를 이용한 데이터 변환
  • 최종 순위 21위

1. 데이터 분석

1.1 구성

  • data01_train
    • 각 피처를 이미 전처리한 데이터. 필터 및 스케일링까지 적용되어 있으므로 따로 전처리할 필요는 없다. 
  • feature
    • 각 피처가 속한 그룹을 표시하는 데이터
  • train, test,sample - 캐글용

1.2 분석

train,test,sample은 데이터 유출 금지라서 1,2일차 데이터만 리뷰

 

가장 먼저 피처 요약표 분석

 

  • 결측값이 없다.
  • 피처가 무려 563개
  • 가이드라인은 각 피처의 중요도를 기반으로 피처를 고르도록 되어 있다. 
  • describe를 봐도 0~1의 값으로 이미 스케일링 되어 있는 값이다.

2. 데이터 전처리

앞서 설명했듯이 1~2일차 데이터는 전처리 불필요.

 

캐글 컴피티션의 경우, 시계열 데이터가 주어졌다.

센서 시계열 데이터 이므로, 기본적인 단변량을 년,월,일,시,분,초로 나누어주었다.

 

그 후에는 시간이 없어서 결측치를 그냥 drop해주었다.(아마 이게 순위가 많이 내려간 큰 요인)

 

타겟 분포를 확인했는데, 솔직히 upsampling 할 수준은 아니었으나, 라벨이 12개라는 점 때문에 upsampling을 진행했다.

해당 방식은 smote로 진행했다. smote로 진행한 이유는 단순하게 upsample 하기 가장 간단해서 그렇다.

 

from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state=42)
smote_train = train.drop('y',axis=1)
smote_label = train['y']

x_smote, y_smote = smote.fit_resample(smote_train, smote_label)

train = pd.concat([x_smote, y_smote], axis=1)

 

1~2일차에서 결과로, 해당 데이터에서는 모델을 분류하고 또 세부분류 하는 것보다 그냥 처음부터 다중분류를 하는 게 낫다는 걸 확인.

그래서 이렇게 구한 train과 y를 가지고 진행했다.

3. 머신러닝 결과

 

처음에 이 정도만 하고도 lgbm으로 0.907이 나왔다.

 

더 끌어올리고 싶어서 많은 시도를 했다.

 

예측 결과 피처로 추가 -> 더 떨어짐

예측 결과를 확률로 추가 -> 이것도 더 떨어짐

minmax scaler를 standard scaler로 변경 -> 더 떨어짐

minmax scaler 후 box_cox 변환 -> 성능 향상

 

그래서 최종적으로는 box_cox 변환한 데이터를 가지고 stack을 진행했다.

 

lgbm+knn+rf+xgb로 만든 모델이 제일 잘 나왔고, 최종 점수는 0.9244로 순위로는 21위/255명를 기록했다.

 

 

다른 사람(조)부터 배운 점

센서의 결측치를 시계열 시간순 정렬 후 -> 보간

imputer로 mice를 사용(다른 변수까지 고려해서 보간)

 

벡터 변환으로 angle 추가

파이차트로 타겟 분포 확인

 

2위 -> 각 라벨별로 중앙값을 채워주었다.

시간이 부족하므로 하나씩 넣어가면서 파라미터 튜닝

 

1위 -> 시간순 sort

label 데이터가 시간대별로 몰려있다.

그래서 각 시간대별로 아예 label을 전부 모아서 각각을 선형 보간으로 만들었다.

양쪽끝값이 나오는 건 중앙값으로.

 

다른 전처리 -> 날짜 데이터 추가

stacking까지

upsampling

시간단위 변경 => 밀리초까지 추가(생각 못했다)

 

타임스탬프가 확실히 있다면, 전체를 전부 쓰는 게 확실히 좋다.

 

깨달은 점과 인사이트

stack을 하지 않아도 성능이 잘 나오는 모델 머신은 따로 있다.

상위권의 경우 xgb가 많았다.

역시 머신러닝은 피처 엔지니어링 싸움이다. 밀리초는 진짜 상상도 못했다.

 

아래는 개인적으로 낸 결론.

 

센서 데이터로 행동을 정확하게 예측할 수 있다면, 사용자가 어떤 행동을 하는지에 대한 데이터를 더 면밀히 수집할 수 있다.

결론적으로 비즈니스에 활용하려면, 해당 모델을 활용하여 사용자의 행동 타겟팅을 할 수 있을 것이다.

반응형