에이블 스쿨 10주차(10.9 ~ 10.13) - 4기 AI트랙
이제 크리스마스 전까지 연휴가 없다 !!!! 버텨야 한다 (◞‸◟)
10주차는 AI모델 해석/평가 수업이 1-2일차로 진행되었고 미니프로젝트 4차가 시작되었다.
이후 일정도 미니프로젝트의 연속이라 복습을 단단히 했어야 했다.
AI모델 해석/평가
구분 | 모델 전체 | 개별 데이터 |
특정 모델 | 트리기반 모델 - 변수중요도 회귀계수 |
White box 모델 - 의사결정 트리 |
모든 모델 | PFI PDP(평균선) |
ICE plot SHAP |
Feature Importance
: 트리기반 모델(Decision Tree, Random Forest, XGB 등)에서 주로 사용
* 변수 중요도는 최적의 모델에서 확인 (성능이 낮은 모델에서는 의미 x)
예제 실습) Boston 데이터 이용
- Decision Tree 모델 생성
- 튜닝 전 모델의 변수 중요도 결과와 튜닝 후(GridSearchCV 사용) 변수 중요도 결과 비교
PFI(Permutation Feature Importance)
: 일반 모델에서 변수 중요도를 파악하는 방법
- feature 중요도를 파악하기 위해 해당 feature을 무작위로 섞어 모델의 성능이 어떻게 변하는지 측정
- 회귀모델에선 R2, 분류모델에선 Accuracy
* 다중 공선성이 있는 변수 ➛ 왜곡된 결과 초래 가능성 있음
pfi = permutation_importance(model, x_val_s, y_val, n_repeats=10)
# model, x, y 입력
# n_repeats : 반복 횟수
# scoring 회귀/분류 모델에 따라 r2/accuracy로 설정(default)
# output - importances, importances_mean, importances_sdt
ICE(Individual Conditional Expectation) plot
: 변수 중요도 평가에서 사용되는 시각화 기술
- 특정 feature를 선택하여 해당 feature 값을 변화시키면서 각 관측치에 대한 모델 예측 값의 변화 시각화
- feature가 모델에 어떤 영향력을 미치는지 파악하는데 유용
예제 실습) Bonston 데이터 이용
- 20개의 행에 대해서 lstat(하위계층 비율)의 영향력 그래프(ice plot)
PDP(Partial Dependence Plots)
: 여러 행에 대한 ICE plot에서의 평균
- 하나의 feature 값을 변화시키면서 해당 feature가 모델에 미치는 영향 시각화
예제 실습) Boston 데이터 이용
- 라이브러리 함수 이용하여 lstat(하위계층 비율) PDP 그리기
from sklearn.inspection import PartialDependenceDisplay
var = 'lstat'
PartialDependenceDisplay.from_estimator(model, data, [var], kind="both")
# 모델, 분석할 대상, 데이터셋, kind = 'both' : ice와 pdp 같이
plt.grid()
plt.show()
예제 실습) Boston 데이터 이용
- 두 변수 조합으로 분석하기 - lstat(하위계층 비율), rm(주택당 방 수)
▶ 방 갯수가 많고(7.5 이상) 하위계층 비율이 적을 때(10 이하) 집 값(medv)이 가장 높을 것으로 예측(노란색 영역)
▶ 하위계층 비율이 15 이상이고 방 개수가 7보다 적은 경우(보라색 영역) 집 값(medv)이 가장 낮을 것으로 예측
SHAP(Shapley Additive exPlanations)
: 모델이 예측한 결과에 대해 각 feature의 기여를 계산하여 해당 feature의 영향력 확인
예제 실습)
1) 학습하기(RandomForest 모델 이용)
model = RandomForestRegressor()
model.fit(x_train, y_train)
2) 해석하기(Shapley value 만들기)
explainer1 = shap.TreeExplainer(model)
shap_values1 = explainer1.shap_values(x_train)
3) 시각화 하기(force_plot 이용)
shap.initjs() # javascript 시각화 라이브러리
shap.force_plot(explainer1.expected_value, shap_values1[0, :], x_train.iloc[0,:])
# 전체평균, shpley_values , input 입력
▶ 아래 값들은 실제 값(rm = 5.5963, crim = 0.08873, lstat = 13.45 ...)
▶ 19.95(굵은 글씨) - 예측 값
▶ base_value - 예측 값의 전체 평균
▶ 빨간 부분 - 상승 요인, 파란 부분 - 하락 요인
미니프로젝트 4차
1-2일차는 서울시 공공 데이터를 이용한 생활인구를 예측하는 것을 주제로 데이터 전처리, 분석, 모델링(머신러닝, 딥러닝) 실습을진행하였다. 언어지능딥러닝 프로젝트는 다음주에 진행이 될 것 같고 그 전에 복습하는 프로젝트 느낌이었다.
하지만 2일차 마지막 날에 알게 된 데이터 전처리 방식... 개별 실습을 진행하면서 이렇게 하는 게 맞는 건지 의문이 여러 번 들기도 했지만 내 방식대로 전처리와 모델링을 해보고 팀원들의 의견도 들으면서 다른 방식으로도 진행해 볼 수 있었다.
1일차
주어진 서울시 생활인구 데이터로 17 - 21년도의 데이터는 training set으로 22년도의 데이터는 test set으로 이용하였다. 시계열 데이터이기 때문에 datetime으로 데이터 형태를 변경한 뒤 필요한 열도 추가해 주었다.
이 데이터를 가지고 분포를 확인하며 간단한 분석을 진행해 볼 수 있었다. target 변수라고 생각한 총생활인구수 변수를 기준으로 시각화를 해보았는데 코랩에서 한글 폰트가 제대로 나오지 않았다. 혼자 헤매다가 시간이 쫓길 것 같아서 다른 부분 먼저 계속 진행하다가 쉬는 시간에 팀원에게 물어봐서 해결할 수 있었다.
짱짱걸 팀원 ദ്ദി -᷄ ᴗ -᷅ ) 덕분에 배울 수 있어서 너무 좋다.
➥ 총 생활인구수는 training set, test set 둘 다 비슷하게 33000 - 40000대에 많이 존재하는 걸 볼 수 있었다
➥ 총생활인구수 분포를 보면서 시간대 별로 인구수가 어떻게 분포되는지 궁금해서 확인해 본 그래프이다.
➥ 출근시간이라고 생각되는 8 - 10시와 점심시간인 12-14시 정도에 생활인구수가 조금 더 많은 걸 파악할 수 있었다.
➥ 하지만 퇴근시간에는 딱히? 더 많아 보이진 않아서 의아한 점이 있었다.
데이터를 전처리하면서 불필요한 열을 제거하는 것에 관해 고민을 많이 하다가 결국 겹치는 시간 데이터만 삭제하고 성별, 나잇대별 생활인구수 칼럼을 다 살려서 진행해 보았다. 이후에 팀원분들과 토의할 때 이야기를 들어보니, 어떤 분은 성별, 나잇대 별로 나누어 전처리를 진행한 분도 있었고 총생활인구수가 결국 성별, 나잇대별 인구수를 합한 값이니 필요 없다고 생각하여 다 제거하신 분도 있었다.
추가적으로 shift()와 rolling()을 활용하여 전날 총생활인구수와 하루이동평균생활인구수 열을 만들고 이로 인해 생긴 결측치도 처리해 주었다. 최종적으로 만들어진 데이터를 이용하여 train_x, trian_y, test_x, test_y로 나누어 저장하여 데이터 전처리를 마무리하였다.
2일차
전처리를 완료한 데이터를 가지고 본격적으로 모델링을 진행해 보았다.
LinearRegression 모델링을 먼저 진행하고 평가한 결과 성별, 나잇대별 생활인구수 칼럼을 다 살려서 진행한 데이터로는 rmse 값이 0.001과 같이 낮게 나오고 R2 또한 0.99로 매우 높게 나와서 전처리에 관해 다시 생각해 보게 되었다..
하지만 처음에는 그냥 잘 나온 값이라고 여겨 이 데이터를 가지고 RandomForest와 XGBoost, SVR 모델링도 추가적으로 진행했다. R2는 0.9 이상 값을 확인할 수 있었는데 RMSE가 매우 매우 높게 나와서 선형회귀만큼 잘 나온 편은 아니었다. 만든 모델들을 가지고 변수 중요도를 확인해 보니 남자 35-39세 인구수의 중요도가 가장 높게 나왔는데 이 결과를 보고 분석하는 것이 어려웠다. 또한, 딥러닝 모델링을 간단히 진행해 보니 loss 값이 매우 크게 나오다가 급격히 줄어들고 다시 왔다 갔다 했다... 어디서부터 잘 못된 건가 싶기도 하고 머리가 아팠다 ㅜ
이렇게 혼자 개별 실습을 마무리하고 팀원들의 의견을 들어보니 데이터 전처리에서 시간 관련 데이터를 제외하고 성별, 나잇대별 생활인구수 칼럼들을 다 제외하는 것이 맞았다. 이후에 전처리를 다시 하여 모델링을 진행해 보니 LinearRegression 모델의 RMSE는 좀 높게 나왔고 R2는 0.74 정도의 결과를 도출해 낼 수 있었다. 다른 모델들 또한 비슷한 결과였고 변수 중요도에서는 전날 총생활인구수와 하루이동평균인구수, hour, year, month 순으로 확인할 수 있었다.
'교육 > KT 에이블스쿨' 카테고리의 다른 글
[KT AIVLE School(에이블스쿨)] - 12주차 후기(AICE 시험 대비, 미니프로젝트 5차) (22) | 2023.10.28 |
---|---|
[KT AIVLE School(에이블스쿨)] - 11주차 후기(미니프로젝트 4차) (2) | 2023.10.21 |
[KT AIVLE School(에이블스쿨)] - 9주차 후기(언어지능 딥러닝) (14) | 2023.10.08 |
[KT AIVLE School(에이블스쿨)] - 8주차 후기(언어지능 딥러닝) (4) | 2023.09.30 |
[KT AIVLE School(에이블스쿨)] - 7주차 후기(시각지능 딥러닝, 미니프로젝트 3차) (32) | 2023.09.25 |