오늘은 미니프로젝트5 3일차로 다른 주제를 가지고 머신러닝을 진행했습니다.
오늘은 다른 데이터를 가지고 머신러닝을 진행했습니다. 컬럼수가 563개로 지금까지 데이터의 행은 많았지만 오늘처럼 많은 양의 컬럼을 다뤄본 적은 처음이였던 것 같습니다.
# 변수의 특성 중요도 계산하기
def plot_feature_importance(importance, names, result_only = False, topn = 'all'):
feature_importance = np.array(importance)
feature_name = np.array(names)
data={'feature_name':feature_name,'feature_importance':feature_importance}
fi_temp = pd.DataFrame(data)
#변수의 특성 중요도 순으로 정렬하기
fi_temp.sort_values(by=['feature_importance'], ascending=False,inplace=True)
fi_temp.reset_index(drop=True, inplace = True)
if topn == 'all' :
fi_df = fi_temp.copy()
else :
fi_df = fi_temp.iloc[:topn]
#변수의 특성 중요도 그래프로 그리기
if result_only == False :
plt.figure(figsize=(10,100))
sns.barplot(x='feature_importance', y='feature_name', data = fi_df)
plt.xlabel('importance')
plt.ylabel('feature name')
plt.grid()
return fi_df
해당 함수는 변수 중요도를 확인할 수 있는 코드입니다.
f_importance = model.feature_importances_
f_name = train_x.columns
fi_df = plot_feature_importance(f_importance, f_name)
모델 학습이 끝났다면해당 코드를 통해 각 변수 중요도를 확인할 수 있습니다.
# 변수 중요도 기준으로 상위 n개와 하위 m개의 변수 선정
n = 5 # 상위 n개의 변수
m = 5 # 하위 m개의 변수
# 상위 n개와 하위 m개의 변수를 포함한 데이터프레임 생성
top_n_features = fi_df.head(n)['feature_name'].tolist()
bottom_m_features = fi_df.tail(m)['feature_name'].tolist()
selected_features = top_n_features + bottom_m_features + ['Activity']
df_selected = data[selected_features]
# 변수(feature)와 target(Activity) 간의 관계를 kdeplot으로 그리기
import seaborn as sns
import matplotlib.pyplot as plt
for feature in selected_features[:-1]:
sns.kdeplot(data=df_selected, x=feature, hue='Activity', common_norm=False)
plt.xlabel(feature)
plt.ylabel('Density')
plt.title(f'KDE Plot of {feature} by Activity')
plt.show()
각 변수별로 중요도 상위 하위 컬럼을 가지고 타겟 값과의 관계를 그래프로 그렸습니다.
컬럼이 많은 데이터를 처음 다뤄봤는데 각 컬럼별로 비슷한 특징을 띠는 경향을 가지고 있는 것을 확인할 수 있었습니다. 각 컬럼별로 서로 연관이 있다면 해당 컬럼들을 한 컬럼으로 묶어주는 것도 좋은 방법이라고 생각했습니다.
변수중요도 또한 낮은 변수 중요도라면 과감하게 한번 지워서 모델링을 다시 진행해보면 좋을 것 같다고 생각했습니다.
시각화하는 것에 조금 더 익숙해져야겠습니다!
컬럼이 많은 데이터에 대해 학습해서 재밌었습니다.
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.