rrimyuu 님의 블로그
Applying Shap to Tensorflow 2.3.0 본문
# tensorflow 2.3.0 버전에 shap (xai) 적용하다 겪은 시행착오
*모듈 버전: python==3.8.19, tensorflow==2.3.0, numpy==1.22.0, pandas==1.0.1 (본래 1.22였음.)*
1. 최소 모듈 조건 및 에러 분석
1) python < 3.9 ; ver 3.7 or 3.8 이었는데 3.7로 하면 모듈 설치하다가 문제 생김
2) numpy > 1.22 ; shap module 조건
3) tensorflow < 2.4 ; 안 맞춰주면 explainer 선언 시 에러 남.
4) AttributeError: 'DataFrame' object has no attribute 'dtype'
-> numpy & pandas 호환 문제 때문에 발생하는 에러
-> pandas > 1.0.1 / numpy < 1.20.0 로 맞춰야 된다고 함. (https://cosmosproject.tistory.com/469)
2. AttributeError: 'DataFrame' object has no attribute 'dtype' 해결 시도
https://github.com/pandas-dev/pandas/issues/39520
1) pandas==1.2.0으로 downgrade함. -> 실패
2) pandas==1.0.1으로 downgrade함.
-> xlrd.biffh.XLRDError: Excel xlsx file; not supported 다른 에러 발생
-> xlrd 실행하려면 pandas>1.0.1이어야 함 (https://daewonyoon.tistory.com/383)
-> pandas read_excel 함수 인자에 engine='openyxl' 추가
-> 동일한 에러 발생, 즉 shap module 사용해야 돼서 numpy-pandas 버전 호환 절대 맞출 수가 없음.
3) pandas dataframe x_df -> x_df.values로 바꿔주니 해당 에러 사라짐. 하지만 다른 에러 발생함.
4) x_df = np.array(x_df)로 넣어줌. (기존 코랩 코드)
3. 코랩/ 로컬에서 돌린 결과와 상이한 것 발견
x_df = np.array(x_df)
explainer = shap.DeepExplainer(model, x_df)
shap_values = explainer.shap_values(x_df)
shap_values = np.squeeze(shap_values, axis=-1)
로 돌릴 경우 코랩에선 돌아가는데 로컬에선 에러 발생함. (데이터 배열 차이 있었던 듯)
-> ValueError: cannot select an axis to squeeze out which has size not equal to one
-> shap_values = np.squeeze(shap_values)
-> 해결됨.
-> 그러나 디버깅시 에러 뜸; Process finished with exit code -1073740791 (0xC0000409)
-> hdf5 재설치. (https://kongnamool.tistory.com/24)
-> tensorflow 날라가서 tensorflow==2.3.0 재설치함.
-> 디버깅 에러 동일함.
-> conda install tensorflow-gpu (상관 없었음.)
-> (에러 분석) tensorflow import할 때 에러남. import 지우면 디버깅 잘됨.
-> pandas 버전 (1.0.1) 때문인가 하여 재설치 / shap 날라감, 재설치 / pandas 때문 아니었음.
-> 최후의 h5py 재설치 / tensorflow 날라가서 또 재설치 / tensorflow==2.3.0 재설치하면 h5py, hdf5 등 다운그레이드 됨.
(https://m.blog.naver.com/kwanwoo5/222038172823)