mini project

다섯 번째 미니 프로젝트 - 스마트폰 센서 데이터 기반 모션 분류

민주82 2023. 4. 14. 21:15

 

인간 행동 인식

: 다양한 센서를 활용해 사람의 모션에 관련된 정보를 수집하고 해석하여 행동을 인식하는 기술

 

센서 신호 → 특징 추출 → 모델 학습 → 행동 추론

 

 

Dataset 출처

 

 

 

주어진 data.csv 파일을 열어보면 (5881, 563) 크기를 가진 데이터임을 알 수 있음!

feature가 굉장히 다양한데 다 이해해야 하는 것은 아님

→ 구조 파악에 중점을 두고 진행

 

 

tBodyAcc-mean()-X

: 가속도 센서 - 평균 - X축 방향 → X축 방향 가속도의 평균값

 

fBodyGyro-std()-Y

: 자이로스코프 센서 - 표준편차 - Y → Y축 방향 각속도의 표준편차

 

이런 식으로 의미 파악!

 

 

 

(1) EDA

중요한 feature 와 중요하지 않은 feature를 선정하기 위해 EDA 진행

 

이 단계에서는 모델링을 위해 랜덤포레스트를 사용

튜닝 없이 하이퍼파라미터의 기본값으로도 적절한 성능이라서..

 

① 

# 모델링 전처리
from sklearn.model_selection import train_test_split

# x, y로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
y = data.loc[:,target]

# train : validation 분할
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = .3, random_state = 1)

# 랜덤포레스트 모델링
model = RandomForestClassifier()
model.fit(x_train, y_train)

# 예측
y_pred = model.predict(x_val)

# 성능 평가
print(confusion_matrix(y_val, y_pred ))
print("-"*80)
print(classification_report(y_val, y_pred ))

 

acc : 0.98

 

# 변수의 특성 중요도 계산
plot_feature_importance(model.feature_importances_, x_train.columns , topn = 20)

변수 중요도 확인

 

 

 

② 정적 / 동적

 

: 6개의 feature STANDING, SITTING, LAYING, WALKING, WALKING_UPSTAIRS, WALKING_DOWNSTAIRS

동적 / 정적 행동으로 구분한 후 EDA 진행

 

STANDING, SITTING, LAYING → 0

WALKING, WALKING_UPSTAIRS, WALKING_DOWNSTAIRS → 1

 

# x, is_dynamic로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
is_dynamic = data.loc[:,target]
is_dynamic = is_dynamic.replace(['STANDING', 'SITTING', 'LAYING'], 0)
is_dynamic = is_dynamic.replace(['WALKING', 'WALKING_UPSTAIRS', 'WALKING_DOWNSTAIRS'], 1)

# train : validation 분할
x_train, x_val, y_train, y_val = train_test_split(x, is_dynamic, test_size = .3, random_state = 1)

acc : 1

 

변수 중요도 확인

 

 

③ standing 여부

 

STANDING → 1

나머지 → 0

# 1) x, is_standing로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
is_standing = data.loc[:,target]
is_standing = is_standing.replace(['SITTING', 'LAYING', 'WALKING', 'WALKING_UPSTAIRS', 'WALKING_DOWNSTAIRS'], 0)
is_standing = is_standing.replace(['STANDING'], 1)

 

acc : 0.98

 

변수 중요도 확인

 

④ sitting 여부

 

SITTING → 1

나머지 → 0

 

# 1) x, is_sitting로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
is_sitting = data.loc[:,target]
is_sitting = is_sitting.replace(['WALKING', 'WALKING_UPSTAIRS', 'WALKING_DOWNSTAIRS','STANDING', 'LAYING'], 0)
is_sitting = is_sitting.replace(['SITTING'], 1)

acc : 0.98

 

변수 중요도 확인

 

 

⑤ laying 여부

 

LAYING → 1

나머지 → 0

 

# 1) x, is_laying로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
is_laying = data.loc[:,target]
is_laying = is_laying.replace(['WALKING', 'WALKING_UPSTAIRS', 'WALKING_DOWNSTAIRS','STANDING', 'SITTING'], 0)
is_laying = is_laying.replace(['LAYING'], 1)

acc : 1

 

변수 중요도 확인

 

⑥ walking 여부

 

WALKING → 1

나머지 → 0

 

# 1) x, is_walking로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
is_walking = data.loc[:,target]
is_walking = is_walking.replace(['WALKING_UPSTAIRS', 'WALKING_DOWNSTAIRS','STANDING', 'SITTING', 'LAYING'], 0)
is_walking = is_walking.replace(['WALKING'], 1)

acc : 1

 

변수 중요도 확인

 

⑦ walking_up 여부

 

WALKING_ UPSTAIRS → 1

나머지 → 0

# 1) x, is_walking_up로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
is_walking_up = data.loc[:,target]
is_walking_up = is_walking_up.replace(['WALKING', 'STANDING', 'SITTING', 'LAYING', 'WALKING_DOWNSTAIRS'], 0)
is_walking_up = is_walking_up.replace(['WALKING_UPSTAIRS'], 1)

acc : 1

 

변수 중요도 확인

 

 

⑧ walking_down 여부

 

WALKING_ DOWNSTAIRS → 1

나머지 → 0

 

# 1) x, is_walking_down로 나누기
target = 'Activity'
x = data.drop(target, axis = 1)
is_walking_down = data.loc[:,target]
is_walking_down = is_walking_down.replace(['WALKING', 'WALKING_UPSTAIRS', 'STANDING', 'SITTING', 'LAYING'], 0)
is_walking_down = is_walking_down.replace(['WALKING_DOWNSTAIRS'], 1)

 

acc : 0.99

 

변수 중요도 확인

 

 

....데이터가 너무 좋아서 어떤 모델을 사용해도 acc가 0.9 이상은 나온다

 

 

 

 

 

그리구 마지막날 진행한 캐글

주어진 train, test 데이터는 기존에 학습에 사용했던 데이터 feature수의 반의 반도 안되는 50개

 

LGBM 모델 학습 후 변수 중요도 확인

# feature 중요도 계산
importances = model.feature_importances_

# 중요도가 높은 feature 추출
threshold = 0.9  # 중요도가 threshold 이상인 feature만 선택
selected_features = [i for i in range(len(importances)) if importances[i] > threshold]

# 선택된 feature로 데이터프레임 생성
import pandas as pd
X_selected = pd.DataFrame(x_train.columns[selected_features])
X_selected

 

 

 

.

.

 

 

데이터 셋 받구 전에 진행했던 것 처럼 변수 중요도로 상위 변수 골라내려구 했는데

변수 조절해도 다 비슷비슷한 결과라서 feature수는 건들지 않았다

 

 

 

 

 

마지막으로 새로 알게된 autogluon

 

autogluon.tabular.models - AutoGluon 0.7.0 documentation

 

autogluon.tabular.models - AutoGluon 0.7.0 documentation

Toggle Light / Dark / Auto color theme Toggle table of contents sidebar

auto.gluon.ai

 

autogluon은 다양한 알고리즘으로, customized parameter 범위내에서

최적의 알고리즘을 select 해주는 기법이라고 간단히 생각하면 될 것 같당

.. 그래서 시간이 좀 오래 걸리긴한다

 

 

이렇게 편한게 있었다니 조금 충격