🚩 대외활동/KT 에이블스쿨

[KT AIVLE School] KT에이블스쿨 5기 - 3차 미니프로젝트

dlalwl_jpg 2024. 5. 14. 10:28

🗓️ 일정

3차 미니 프로젝트 :3/27 ~ 3/29

 

 KT에이블스쿨 미니프로젝트란?

미니 프로젝트는 이론, 실습 강의가 끝난 후 배운 강의를 토대로 실제 사례에 적용해보는 시간이다. 

해결해야 할 미션, 데이터, 도메인 정보, 가이드가 제공되면 개별 실습을 통해 스스로 문제를 해결한 후, 조별 실습을 통해 공동과제를 수행한다. 그리고 전체 발표 시간을 가져 다양한 솔루션을 공유한다.


📑 1일차

주제 및 미션

3차 미니 프로젝트 주제는 스마트폰 기반의 센서 데이터를 활용해 동작을 분류 하는 모델을 완성하는 것이다.

이번 프로젝트에서는 사용하는 데이터의 양이 많아 아래와 같이 미션을 진행하는 가이드가 주어졌고, 1일차에는 단계1까지 진행하였다.

3차 미니프로젝트 가이드

💡도메인 이해

이번 주제는 인간 행동 인식 (HAR: Human Activity Recognition) 기술과 관련되어 있다. 인간 행동 인식이란 다양한 센서를 활용하여 사람의 모션에 관련된 정보를 수집하고 해석하여 행동을 인식하는 기술이다. 흔히 애플워치를 착용하고 있는 사람의 행동을 예측에 이에 맞는 서비스를 제공하는 사례가 있다. 인간 행동 인식에 대한 데이터 추출 방법에 대해서도 살펴보았다. 

사용한 데이터는 UCI의 Human Activity Recognition이다.

 https://archive.ics.uci.edu/dataset/240/human+activity+recognition+using+smartphones

 

UCI Machine Learning Repository

This dataset is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0) license. This allows for the sharing and adaptation of the datasets for any purpose, provided that the appropriate credit is given.

archive.ics.uci.edu

위 데이터를 바탕으로 인간 행동 인식 데이터의 수집 과정과 데이터의 구조를 살펴보면서 데이터에 대해 이해하는 시간을 가졌다.

 

📊데이터 분석

data프레임에는 Active라는 변수로 사람의 행동에 대해 6가지로 분류되어 있다. 먼저 행동변수인 6개의 변수들의 분포를 막대그래프, 원그래프, 군집화 등 다양한 시각화 방법으로 살펴보았다.

변수의 분포 시각

특히, T-SNE 기법을 이용하여 차원 축소 후 군집 데이터 시각화 분석을 처음 해보았다.

이 방법은 T-분산 확률적 이웃 임베딩(t-SNE)으로도 불리는데, 각 데이터 포인트에 2차원 또는 3차원 지도의 위치를 ​​제공하여 고차원 데이터를 시각화하는 통계적 방법으로 저차원에서 시각화를 위해 고차원 데이터를 임베딩하는 데 적합한 비선형 차원 축소 기술이다.

T-분산 확률적 이웃 임베딩(t-SNE)을 이용한 군집시각화

T-SNE의 결과를 통해 LAYING변수의 경우, 센서가 지표면과 평평한 상태에서 움직이지 않는 경향으로 따로 분류가된다는 것을 알 수 있다. STANDING 변수와 SITTING변수의 경우, 센서가 움직이지 않는 상태에서 서있기와 앉기는 단순 높낮이의 차이만 보이기에 비슷하게 분류가 된다는 것을 알 수 있다. WALKING, WALKING_DOWNSTAIRS, WALKING_UPSTAIRS의 경우, 동적인 활동으로 지표면으로 부터의 높낮이에 따라 차이가 나기 때문에 크게 비교할 수가 없기에 같이 분류가 된다는 것을 확인할 수 있다.

 

Active변수에 따라 데이터 분석을 진행한 이후, 이제 Active변수를 정적행동과 동적행동으로 구분하여 분석을 진행하였다.

is_dynamic변수를 추가하여 정적행동(STANDING, SITTING, LAYING)이면 0, 동적행동(WALKING, WALKING_DOWNSTAIRS, WALKING_UPSTAIRS)이면 1로 구분하였다.

그 다음, 정적행동과 동적행동으로 구분하는데 중요한 변수를 찾기 위해 feature 변수들에 대한 분석을 하였다. 행동을 구분하는 feature변수는 총 561개 있는데 너무 많으므로 randomforest 모델링을 이용해 중요한 변수 상위 5개만 선정하였다. 

먼저 target을 is_dynamic로 하고 randomforest를 이용해 정적, 동적 변수를 구분하는 모델을 만들어 변수중요도를 추출한 결과, 아래와 같이 추출되었다.

randomforest를 이용한 feature의 중요 변수 상위 5개

이후 is_stading, is_walking 등의 변수들을 추가하여 개별 행동 변수별 추가 분석을 진행하였다.

is_standing, is_walking, is_laying의 개별 행동 변수중요도 분석 결과

🚀 모델링

EDA가 끝난 후, 딥러닝을 통해 정적행동과 동적행동을 분류하는 모델을 만들었다.

정적행동과 동적행동을 분류하는 딥러닝 진행 과정 및 예측 결과


📑 2일차

주제 및 미션

1일차에 단계1까지 진행하였고, 2일차에는 이어서 단계2를 진행하였다. 1일차에 정적행동과 동적행동을 분류하는 딥러닝까지 만들었고, 이어서 분류된 행동을 상세 분류하는 정적행동 상세 분류 모델과 동적행동 상세 분류 모델을 각각 만들었다. 그리고 함수를 이용하여 단계1과 단계2의 과정을 하나로 통합하였다.

3차 미니프로젝트 가이드

🚀 모델링

먼저, 정적행동과 동적행동의 모델의 x는 상세행동(Laying, Sitting, Standing, Walking, Walking-Up, Walking-Down)과 정적행동, 동적행동을 0과 1로 분류한 변수인 is_dynamic을 제외한 것으로 설정하였고, y는 상세행동인 Activity로 설정하였다. 그리고 y가 범주형이므로 LabelEncoder를 진행하여 수치형으로 변환하였다. 이렇게 데이터를 분리하고 정적행동과 동적행동을 상세분류하는 딥러닝 모델을 만들었다.

정적행동 상세 분류 딥러닝 모델
동적행동 상세 분류 딥러닝 모델

각 모델을 만들고 지금까지 과정을 한 개로 합치고 실제값을 넣어 테스트하여 heatmap으로 시각화까지 진행하였다. 모델의 정확도는 0.9816가 나왔다.

def har_predict_pipeline(new_data, binary_model, dynamic_model, static_model):
    
    # 평가 데이터셋에서 X와 y분리
    X = new_data.drop('Activity',axis=1)
    y_test = new_data['Activity']
    test_l_enc = LabelEncoder()
    y_test = test_l_enc.fit_transform(y_test)

    # 정적, 동적행동 분류
    dynamic_pred = binary_model.predict(X) > 0.5
    final_preds = np.zeros((X.shape[0],))
    
    # 동적 행동 데이터에 대한 인덱스
    # flatten으로 1차원으로 변경하고 True에 대한 인덱스 저장
    dynamic_indices = np.where(dynamic_pred.flatten() == True)[0]
    # 정적 행동 데이터에 대한 인덱스 
    # flatten으로 1차원으로 변경하고 False에 대한 인덱스 저장
    static_indices = np.where(dynamic_pred.flatten() == False)[0]
    
    # 동적행동 상세 분류
    if len(dynamic_indices) > 0:
        dynamic_activities_pred = dynamic_model.predict(X.iloc[dynamic_indices])
        dynamic_activities_pred = np.argmax(dynamic_activities_pred, axis=1)
        # 동적 행동 라벨이 정적 행동보다 3부터 시작하기 때문에 동적 행동에 대한 예측값에 3을 더하여 원래 라벨과 맞춰줌
        dynamic_activities_pred += 3  
        final_preds[dynamic_indices] = dynamic_activities_pred

    # 정적행동 상세 분류
    if len(static_indices) > 0:
        static_activities_pred = static_model.predict(X.iloc[static_indices])
        static_activities_pred = np.argmax(static_activities_pred, axis=1)
        final_preds[static_indices] = static_activities_pred
        
    
    # final_preds와 실제 라벨 y_test를 비교하여 정확도 계산
    accuracy = accuracy_score(y_test, final_preds)
    print(f'Accuracy: {accuracy:.4f}')
    
    # 혼동 행렬 계산
    cm = confusion_matrix(y_test, final_preds)
    class_names = test_l_enc.classes_
    
    # 혼동 행렬 시각화
    plt.figure(figsize=(10, 7))
    sns.heatmap(cm, annot=True, fmt="d", cmap='Blues', xticklabels=class_names, yticklabels=class_names)
    plt.xlabel('Predicted')
    plt.ylabel('True')
    plt.title('Confusion Matrix')
    plt.show()

    return final_preds

 

최종 모델 결과에 대한 heatmap

 

🔑 결론

모델을 여러 개 만들어 하나로 합치는 과정이 매우 어려웠다. 처음에 1차로 정적행동과 동적행동으로 0과 1로 구분한 다음, 0이면 정적행동 상세 분류 모델, 1이면 동적행동 상세 분류 모델을 진행하도록 설계하였는데 오류가 발생하였다. 이를 해결하기 위해 동적 행동에 대한 예측값에 3을 더하여 원래 라벨과 맞춰주는 작업으로 다시 설계하였다. 

위와 같이 진행한 이유는 상세 분류 전에 변수들을 라벨링을 통해 숫자형으로 변환되었다. 이로 인해 정적행동은 0, 1, 2로 동적행동은 3, 4, 5로 변환되었다. 그리고 상세 분류를 할 때는정적행동, 동적행동 상세 분류 모델 모두 0, 1, 2로 예측값이 주어진다. 정적행동은 0, 1, 2의 예측값과 실제값이 동일하므로 비교가 가능하지만, 동적행동은 실제값은 3, 4, 5인데 예측값이 0, 1, 2이므로 비교할 수가 없다. 따라서 예측값에 +3을 해주어 비교를 위해 값을 일치시켜준 것이다. 

이 과정을 이해하고 작업하는데 어려움을 느꼈다. 같은 팀원의 도움을 받아 완벽히 이해할 수 있었다.

마지막 발표까지...!!

모델을 잘하고 10은조의 발표

이번 미니프로젝트를 통해 수많은 변수 중에서 중요한 변수에 선택과 집중을 해야할 필요성복잡한 문제해결과정을 단계적으로 진행하는 방법에 대해 알 수 있었다.


📑 3일차

주제 및 미션

3일차에는 1, 2일차에 했던 미션을 바탕으로 센서 데이터 기반 모션 분류를 만드는 것을 주제로 Kaggle Competition을 진행하였다. 모델 성능 평가기준은 Categorization Accuracy로 하였고, 이를 기준으로 순위를 매겼다.

kaggle


💭3차 미니프로젝트를 마치고

kaggle이 처음이었던 나는 제출한 것에 의의를 두었다.. 상위 등수의 사람들의 발표를 들으면서 측정시간 변수이 정확도에 많은 영향을 미쳤다는 것을 새롭게 알게되었고 의외였다. 나는 행동을 측정하는 시간과 관련된 변수는 행동을 예측하는데 영향이 적을 거라고 예상하여 나는 제거하고 모델을 설계하였기 때문이다. 그 결과 모델의 정확도가 매우 낮았는데 그 이유가 시간 변수의 제외의 영향이라는 것을 상위 등수 사람들의 발표를 통해 알게 되었다. 

처음 kaggle을 해봤는데 오전 10시부터 오후 4시까지 긴 시간이었지만 대회라는 생각에 집중이 잘 되어 짧게 느껴졌다. 개인 실습 외에 항상 팀원들과 함께 미션을 수행했었는데 이번 캐글을 통해 스스로 빠르게 모델을 만들기 위해 노력했다는 것에서 좋은 경험이었다.