14. 데이터 분석하기사람 움직임 분류(22.07.22)
[결정 트리 분석 + 산점도/선형 회귀 그래프]
목표: 센서 데이터를 분석하여 사람의 움직임에 대한 분류 모델을 생성 -> 움직임 유형 예측
결정 트리란?: 스스로 데이터 안에서 if/else 기반으로 규칙을 찾아 학습하여 트리 구조의 분리 규칙을 생성.
결정 트리-> 규칙 조건을 나타내는 규칙 노드, 결정된 클래스 값이 표시된 리프 노드로 구성.
규칙노드가 많을수록 분할이 많아져서 트리의 깊이가 증가하여 어떤 피처를 규칙으로 분할할 것인가가 중요.
분할된 하위 그룹에 있는 데이터의 균일도를 최대로 높게 만드는 규칙을 찾아서 규칙 노드로 구성
데이터의 균일도를 계산하는 방법: 정보 이득 지수, 지니계수
정보이득지수란?: (1-엔트로피) -> 결정 트리는 정보 이득 지수가 높은 피처를 분할기준으로 사용.
엔트로피란?: 데이터 집합의 혼잡도
다른 데이터가 섞여있으면 균일도가 떨어져서 혼잡도가 높아지면 엔트로피가 높음.
같은 데이터가 섞여있으면 균일도가 높아지면 혼잡도가 떨어지면 엔트로피가 낮아짐.
지니계수란?: 소득의 불균형 정도, 데이터의 순도를 나타내기 위해 사용 -> 결정 트리는 지니계수가 낮은 피처를 분할기준으로 사용.
지니계수가 높음: 순도가 낮은 데이터 집합 = 균일도가 낮은집합
지니계수가 낮음:순도가 높은 데이터 집합 = 균일도가 높은 집합
1. 데이터 수집
UCI Machine Learning Repository 접속 -> human activity recognition 검색 -> 검색 목록 중 첫 번째 클릭 -> data folder클릭 -> UCI HAR Dataset.zip 다운
from sklearn.datasets import load_breast_cancer
b_cancer=load_breast_cancer()
2. 데이터 탐색
우리는 activity_labels.txt에서 볼 수 있는 6가지의 움직임에 대한 분류를 시행할 것이다.
feature_name_df=pd.read_csv('data/UCI_HAR_Dataset/UCI_HAR_Dataset/features.txt',sep='\s+',header=None,names=['index','feature_name'],engine='python')
feature_name_df.head()
feature_name_df.shape
feature_name=feature_name_df.iloc[:,1].values.tolist()
feature_name[:5]
다음으로 데이터셋 파일에 있는 xtrain, xtest, ytrain, ytest을 불러와준다.
x_train=pd.read_csv('data/UCI_HAR_Dataset/UCI_HAR_Dataset/train/x_train.txt',sep='\s+',engine='python',header=None)
x_test=pd.read_csv('data/UCI_HAR_Dataset/UCI_HAR_Dataset/test/x_test.txt',sep='\s+',engine='python',header=None)
y_train=pd.read_csv('data/UCI_HAR_Dataset/UCI_HAR_Dataset/train/y_train.txt',sep='\s+',header=None,names=['action'],engine='python')
y_test=pd.read_csv('data/UCI_HAR_Dataset/UCI_HAR_Dataset/test/y_test.txt',sep='\s+',header=None,names=['action'],engine='python')
x_train.columns=feature_name_df['feature_name']
x_test.columns=feature_name_df['feature_name']
다음으로는 레이블 이름이 있는 파일인 activitylabels.txt.에서 labelname만 추출하여 리스트에 저장
label_name_df=pd.read_csv("data/UCI_HAR_Dataset/UCI_HAR_Dataset/activity_labels.txt",sep='\s+',header=None,names=['index','label'],engine='python')
label_name=label_name_df.iloc[:,1].values.tolist()
label_name
2. 분석 모델 구축 및 결과 분석
6개의 움직임을 분류하기 위한 결정트리 모델을 구축해보자.
from sklearn.tree import DecisionTreeClassifier
dt_har=DecisionTreeClassifier(random_state=156)
dt_har.fit(x_train,y_train)
y_pred=dt_har.predict(x_test)
[01행]: sklear 패키지에서 결정트리 패키지를 불러온다.
[02행]: 매번 똑같은 결과를 보기위해 random state를 고정하고 결정트리객체를 생성한다.
[03행]: 학습데이터를 통해 결정트리를 훈련시킴
[04행]:학습된 모델에 테스트셋을 넣어 y_pred 산출
이제 결과를 분석해보자.
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y_test,y_pred)
print("결정트리 예측 정확도:{0:.4f}".format(accuracy))
print("결정트리 현재 하이퍼 파라미터: \n",dt_har.get_params())
결과를 출력해보면 아래와 같이 정확도는 85프로이며 현재 사용된 하이퍼 파라미터는 아래와 같다.
이러한 정확도는 하이퍼 파라미터를 수정하여 개선시킬 수 있는데, 최적의 파라미터를 찾기위해 GridSearchCV모듈을 사용해보자.
from sklearn.model_selection import GridSearchCV
params={
'max_depth':[6,8,10,12,16,20,24],
'min_samples_split':[8,16,24]
}
grid_cv=GridSearchCV(dt_har,param_grid=params,scoring='accuracy',cv=5,return_train_score=True)
grid_cv.fit(x_train,y_train)
cv_results_df=pd.DataFrame(grid_cv.cv_results_)
cv_results_df[['param_max_depth','param_min_samples_split','mean_test_score','mean_train_score']]
print("최고 평균 정확도:{0:.4f}, 최적 하이퍼 매개변수:{1}".format(grid_cv.best_score_,grid_cv.best_params_))
이 GridSearchCV를 통해 산출된 하이퍼파라미터들을 사용하여 다시 모델을 생성해보자.
best_dt_har=grid_cv.best_estimator_
best_y_pred=best_dt_har.predict(x_test)
best_accuracy=accuracy_score(y_test,best_y_pred)
print("best 결정 트리 예측 정확도:{0:.4f}".format(best_accuracy))
accuracy가 향상된 것을 볼 수 있다.
마지막으로 시각화해보자.
import seaborn as sns
import matplotlib.pyplot as plt
feature_importance_values=best_dt_har.feature_importances_
feature_importance_values_s=pd.Series(feature_importance_values,index=x_train.columns)
feature_top10=feature_importance_values_s.sort_values(ascending=False)[:10]
plt.figure(figsize=(10,5))
plt.title('Feature Top 10')
sns.barplot(x=feature_top10,y=feature_top10.index)
plt.show()
[03~05행]: 최종 결정트리 모델의 featureimportances를 저장하고 시각화하기위해 series형태로 변환하고 상위 10개를 feature top10에 저장.
[06~10행]: feature top10을 시각화
'데이터분석실습 > 데이터 과학 기반의 파이썬 빅데이터 분석' 카테고리의 다른 글
파이썬 빅데이터 분석 Day 16 (0) | 2023.10.26 |
---|---|
파이썬 빅데이터 분석 Day 15 (1) | 2023.10.26 |
파이썬 빅데이터 분석 Day 13 (0) | 2023.10.26 |
파이썬 빅데이터 분석 Day 12 (1) | 2023.10.26 |
파이썬 빅데이터 분석 Day 11 (0) | 2023.10.26 |