728x90

UCI 대학교에서 휴대폰 데이터로 사용자 행동 인식에 대한 데이터셋을 공개하고 있다.

 

Human Activity Recognition Using Smartphones Data Set

archive.ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones

 

 

대강 훑어보면

 

데이터는 1만개, 속성수는 561개 ...,

 

분류하려는 행동 갯수는 6개로 걷기, 계단 올라가기, 계단 내려가기, 앉아있기, 서있기, 눕기 정도가 있다.

 

데이터들은 갤럭시 S2의 가속도/자이로계에서 선각속도 등 정보들을 50Hz로 받았다고 한다.

 

전체 데이터 중 70%가 훈련용, 30%는 테스트 용이라고 하내..

 

 

 

일단 속성수만 해도 장난아니게 많다..

 

csv형태도 아니다보니

 

피처명 파일이랑 데이터 파일이 별도로 나누어져 있다.

 

 

피처 목록

 

 

훈련용 데이터들

- 독립 변수 데이터들과 종속 변수 데이터도 분리되있고

 

- 피처 데이터도 장난아니게 길다. 뒤에 보니 이 데이터는 ,가 아니라 \n으로 행이 구분되있는것같다.

 

 

 

 

 

 

일단 피처명들부터 읽어야하는데

 

피처 인덱스와 피처명이 스페이스로 구분되어있고, 해더가 존재하지 않는다.

 

 

일단 이 데이터들을 읽고 보자

 

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

path = "./res/UCI HAR Dataset/features.txt"

features_df = pd.read_csv(path,sep="\s+",
                         header=None, names=["column_index", "column_name"])

features_df.head()

 

 

여기서 column_name은 피처 데이터를 읽을때 컬럼으로 필요하니 리스트로 변환하자

feature_names = features_df["column_name"].values.tolist()
print(type(feature_names))
print(feature_names)

 

 

 

 

이제 훈련, 테스트 데이터를 읽자
* 아까 본 피처 데이터들은 스페이스로 구분되어있었으니 세퍼레이터를 지정하자

+ 라벨 데이터도 읽고

path = "./res/UCI HAR Dataset/"

X_train = pd.read_csv(path+"train/X_train.txt",sep="\s+", names=feature_names)
X_test = pd.read_csv(path+"test/X_test.txt",sep="\s+", names=feature_names)


y_train = pd.read_csv(path+"train/y_train.txt", sep="\s+", header=None,
                     names="action")

y_test = pd.read_csv(path+"test/y_test.txt", sep="\s+", header=None,
                     names="action")

 

 

 

데이터도 많고 속성 갯수도 장난아니다보니, info도 평소 보던거랑 조금 다르게 나온다.

 

 

라벨 데이터는 속성이 1개 뿐이고, 대부분 행동들 갯수가 균일하게 나온다.

y_train["action"].value_counts()

 

 

일단 기본 결정트리로 학습하고 성능을 살펴보자

 

기본 설정대로 한 경우 0.857482 정도의 성능이 나온다.

 

 

이번에 그리드 탐색 교차 검증으로 최적 하이퍼 파라미터를 찾아보려고 한다.

 

이전 글에서 파람 썻던걸 참고해서 사용해보자

ref: throwexception.tistory.com/1038

 

데이터는 많지만 다음과 같이 파라미터들을 지정해서 동작시켜보면 ..

 

데이터 수도 많은데다 파라미터도 다양하게 주다보니 조금 오래걸린다.

from sklearn.model_selection import GridSearchCV

param = {
    "max_depth" : [10, 20, None],
    "min_samples_leaf" : [1, 6],
    "max_features" : [100, None]
}


gs = GridSearchCV(dt,param_grid=param,cv=5, refit=True)
gs.fit(X_train, y_train)

 

 

최적의 하이퍼 파라미터와 성능

 

 

 

다른 경우들을 비교해보면 0.84~ 0.85대 정도 나오고 있다.

gs_result_df = pd.DataFrame(gs.cv_results_)
gs_result_df[["params", "mean_test_score", "mean_train_score"]]

 

 

 

분류에서 가장 중요한 변수들을 살펴보자

best_dt = gs.best_estimator_
feature_importances = best_dt.feature_importances_
ftr_importances = pd.Series(feature_importances, index=X_train.columns)

ftr_top10 = ftr_importances.sort_values(ascending=False)[:10]

plt.title("Feature importance top 10")
sns.barplot(x=ftr_top10, y=ftr_top10.index)

300x250

+ Recent posts