yangwonsuck / PROJECT_CODE

0 stars 0 forks source link

결정 트리 -사용자 행동 인식 데이터 세트 #4

Open yangwonsuck opened 3 years ago

yangwonsuck commented 3 years ago

import pandas as pd import matplotlib.pyplot as plt %matplotlib inline

features.txt 파일에는 피처 이름 index와 피처명이 공백으로 분리되어 있음. 이를 DataFrame으로 로드.

feature_name_df=pd.read_csv('features.txt',sep='\s+',header=None,names=['column_index','column_name'])

피처명 index를 제거하고, 피처명만 리스트 객체로 생성한 뒤 샘플로 10개만 추출

feature_name=feature_name_df.iloc[:,1].values.tolist() print('전체 피처명에서 10개만 추출:',feature_name[:10])

feature_dup_df=feature_name_df.groupby('column_name').count() print(feature_dup_df[feature_dup_df['column_index']>1].count()) feature_dup_df[feature_dup_df['column_index']>1].head()

import pandas as pd

def get_new_feature_name_df(old_feature_name_df): feature_dup_df=pd.DataFrame(data=old_feature_name_df.groupby('column_name').cumcount(),columns=['dup_cnt']) feature_dup_df=feature_dup_df.reset_index() new_feature_name_df=pd.merge(old_feature_name_df.reset_index(),feature_dup_df,how='outer') new_feature_name_df['column_name']=new_feature_name_df[['column_name','dupcnt']].apply(lambda x : x[0]+''+str(x[1])if x[1] >0 else x[0] , axis=1) new_feature_name_df=new_feature_name_df.drop(['index'],axis=1) return new_feature_name_df

def get_human_dataset():

#각 데이터 파일은 공백으로 분리되어 있으므로 read_csv 에서 공백 문자를 sep으로 할당.
feature_name_df=pd.read_csv('features.txt',sep='\s+',header=None,names=['column_index','column_name'])
#중복된 피처명을 수정하느 get_new_feature_name_df()를 이용, 신규 피처명 DataFrame 생성.
new_feature_name_df=get_new_feature_name_df(feature_name_df)
#DataFrame에 피처명을 칼럼으로 부여하기 위해 리스트 객체로 다시 변환
feature_name=new_feature_name_df.iloc[:, 1].values.tolist()
#학습 피처 데이터세트와 테스트 피처 데이터를 DataFrame으로 로딩. 칼럼명은 feature_name 적용
X_train=pd.read_csv('./train/X_train.txt',sep='\s+',names=feature_name)
X_test=pd.read_csv('./test/X_test.txt',sep='\s+',names=feature_name)
#학습 레이블과 테스트 레이블 데이터를 DataFrame으로 로딩하고 칼럼명은 action으로 부여
y_train=pd.read_csv('./train/y_train.txt',sep='\s+',header=None,names=['action'])
y_test=pd.read_csv('./test/y_test.txt',sep='\s+',header=None,names=['action'])

#로드된 학습/테스트용 DataFrame을 모두 반환
return X_train,X_test,y_train,y_test

X_train,X_test,y_train,y_test=get_human_dataset()

print('## 학습 피처 데이터셋 info()') print(X_train.info()) print(y_train['action'].value_counts())

from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score

예제 반복 시마다 동일한 예측 결과 도출을 위해 random_state 설정

dt_clf=DecisionTreeClassifier(random_state=156) dt_clf.fit(X_train,y_train) pred=dt_clf.predict(X_test) accuracy=accuracy_score(y_test,pred) print('결정 트리 예측 정확도: {0:.4f}'.format(accuracy))

DecisionTreeClassifier의 하이퍼 파라미터 추출

print('DecisionTreeClassifier 기본 하이퍼 파라미터:\n',dt_clf.get_params())

from sklearn.model_selection import GridSearchCV

params={ 'max_depth' : [6,8,10,12,16,20,24] }

grid_cv=GridSearchCV(dt_clf,param_grid=params,scoring='accuracy',cv=5,verbose=1) grid_cv.fit(X_train,y_train) print('GridSearchCV 최고 평균 정확도 수치: {0:.4f}'.format(grid_cv.bestscore)) print('GirdSearchCV 최적 하이퍼 파라미터:',grid_cv.bestparams)

GridSearchCV 객체의 cvresults 속성을 DataFrame으로 생성.

cv_results_df=pd.DataFrame(grid_cv.cvresults)

max_depth 파라미터 값과 그때의 테스트 세트,학습 데이터 세트의 정확도 수치 추출

cv_results_df[['param_max_depth','mean_test_score']]

max_depths=[6,8,10,12,16,20,24]

max_depth 값을 변화시키면서 그때마다 학습과 테스트 세트에서의 예측 성능 측정

for depth in max_depths: dt_clf=DecisionTreeClassifier(max_depth=depth,random_state=156) dt_clf.fit(X_train,y_train) pred=dt_clf.predict(X_test) accuracy=accuracy_score(y_test,pred) print('max_depth={0} 정확도: {1:.4f}'.format(depth,accuracy))

param={ 'max_depth':[8,12,16,20], 'min_samples_split':[16,24], }

grid_cv=GridSearchCV(dt_clf,param_grid=params,scoring='accuracy',cv=5,verbose=1) grid_cv.fit(X_train,y_train) print('GridSearchCV 최고 평균 정확도 수치: {0:.4f}'.format(grid_cv.bestscore)) print('GridSearchCV 최적 하이퍼 파라미터:',grid_cv.bestparams)

best_df_clf=grid_cv.bestestimator pred1=best_df_clf.predict(X_test) accuracy=accuracy_score(y_test,pred1) print('결정 트리 예측 정확도:{0:.4f}'.format(accuracy))

import seaborn as sns

ftr_importances_values=best_df_clf.featureimportances

Top 중요도로 정렬을 쉽게 하고, 시본(seaborn)의 막대그래프로 쉽게 표현하기 위해 series 변환

ftr_importances=pd.Series(ftr_importances_values,index=X_train.columns)

중요도값 순으로 Series를 정렬

ftr_top20=ftr_importances.sort_values(ascending=False)[:20] plt.figure(figsize=(8,6)) plt.title('Feature importances Top 20') sns.barplot(x=ftr_top20,y=ftr_top20.index) plt.show()