드디어 P stage 시작!
목표
Pstage를 시작하면서 잡은 목표 : 거만하게 공부하지 않기, 쉬운 거라고 착각하고 넘어가지말기, 리더보드에 목매지않기
충실하게 EDA를 진행하며 insight들을 얻고, 이를 캠퍼들과 공유하기
EDA를 진행하며 matplotlib , seaborn , pandas를 손에 익히기
강의 정리
- Overview의 중요성
무작정 모델 돌리기 부터 시작하는 것보다 Overview를 보면서 어떤 데이터로 어떤 문제를 풀어야 되는 지, 어떤 어려움이 예상되는 지 방향성부터 잡고 시작하자
- 문제 정의
내가 어떤 문제를 풀어야 하는 지 , input과 output은 무엇인가? , 솔루션은 어디서 어떻게 사용되나 등
- EDA 란 ?
내가 궁금했던 데이터에 대한 걸 해결해 나가는 부분
EX ) 아 이건 남자보다 여자가 더 많을 거 같은데?
꼭 거창한 파이썬이 아니어도 좋음! 하나하나 이미지를 직접봐도 좋고, 엑셀로 봐도 좋고!
목표를 위한 행동
1. 거만하게 공부하지 않기 : 마스터님의 말대로 해보기
Overview를 직접 짜보자!
Overview
- 문제 : 마스크 착용 여부 ( 제대로 썼는지, 대충 썼는지, 안썼는지) 분류
- 착용 여부 뿐만이 아니라 성별 & 연령대도 분류
- input : 마스크 착용 사진, 미착용 사진, 혹은 이상하게 착용한 사진(코스크, 턱스크)
- output : 이미지에 맞는 18개의 class (0~17)
- DATA
- size : (384, 512)
- 전체 이미지 폴더 수 : 4500
- 한 사람당 이미지의 개수 : 7 [마스크 착용 5장, 이상하게 착용(코스크, 턱스크) 1장, 미착용 1장]
- train data : 60%
- 4500 x 7 x 0.6 = 18900 존재
- 확장자는 jpg jpeg , png 등 다양
🧐 마스크 착용 5장 , 이상한 착용 1장 , 미착용 1장에서 data imbalance 문제가 있지 않을까?
2. EDA를 통해 insight를 얻어보자.
이미지를 직접 한 장 한 장 까보자!
Train
- 하나의 폴더 내 마스크 쓴 사진 5장 + 안 쓴 사진 1장 + 대충 쓴 사진 1장 총 7장으로 구성
Test
- Train data에는 없는 마스크 패턴들이 존재
👉 Model이 robust 해야겠다!
데이터의 연령대 분포를 봐보자 .
60대 이상은 60살 밖에 없다 !
👉 노년층의 데이터 부족 우려,,, 진짜일까? 찍어보자!
- 청년 > 중년>노년 순으로 데이터가 많고, 노년층의 데이터가 현저히 부족한 것을 확인
- 여성의 데이터가 남성의 데이터 1.7배 가량 많음
- 마스크 미 착용, 부정확한 착용에 비해 착용한 데이터가 5배 가량 많음
- 남성의 경우 청 > 장 > 노년층 순으로 데이터가 많고, 여성의 경우 장 > 청 > 노년 층의 순
- Mask 착용 여부는 성별,나이와 관계없이 차이가 5배 가량
- 중년 여성 > 청년 여성 > 청년 남성 > 중년 남성 > 노년 여성 > 노년 남성 순으로 데이터가 많음
label의 분포 : 마스크를 쓴 중년층 여성(label : 4)의 데이터가 4085개로 가장 많고, 마스크를 쓰지 않거나 대충 쓴 노년층 남성 (label : 8 , 14)가 83개로 가장 적다.
어떤 Insight를 얻었나?
1. 데이터의 불균형이 너무 심하다 .
- 노년층의 데이터가 6~7배 적다.
- mask를 제대로 착용했을 때의 data가 5배 이상이다.
👉수업시간에 배운 focal loss를 적용 가능할까?
👉 variable 별 학습한 후 output을 조합해 class를 예측하는 것은 어떨까?
2. 모델이 좀 robust 해야 한다.
- test data에 새로운 마스크 패턴이 존재하므로, 마스크 패턴과 무관하게 학습이 진행 되어야 함
👉 noise를 좀 추가해주면 될까?
3. 나이/성별을 구분하기 힘들다.
- 얼굴을 다 가렸는데 나이를 어떻게 맞추지?
👉 눈가 주름? - 머리 길이에 따른 성별 구분 ❌
👉 성별을 구분할 수 있는 기준이 무엇이 있을까?
3. matplotlib , seaborn , pandas 익히기
1. os.listdir로 가져오면 숨어져있는 파일들도 불러진다. -> glob를 사용해보자.
/* 로 폴더 내 확장자와 무관하게 모든 파일을 불러올 수 있으면서 숨겨진 파일은 불러오지 않는다.
glob.glob(folder +'/*')
2. dataframe 행 추가하기
컬럼과 그에 대한 값을 딕셔너리 형태로 쓴 후 append로 행을 추가할 수 있다.
단. 단점은 index가 뒤죽박죽
mask_df.append({'path' : file , 'id' : idx , 'mask' : mask , 'gender' : gender , 'age' : age ,'label' : int(label) } , ignore_index = True)
3. sort_values & reset_index
mask_df.sort_values(by=['id'], axis=0, inplace = True)
mask_df.reset_index(drop = True, inplace = True)
4. seaborn에서는 histogram ❌ , distplot ⭕
5. subplot & 제목 & 보조선 & 테두리 제거
# 하나의 figure 안에 subplot 3개 그리기
f , (ax1 , ax2 , ax3) = plt.subplots(1,3 , figsize = (18,6))
age = sns.countplot(mask_df['age'] , ax = ax1 , palette = colors_nude)
# subplot에 제목 달아주기
ax1.set_title('Age Distribution')
# 보조선 나타내기
ax1.set_axisbelow(True) # 그래프 뒤로 선이 가도록
ax1.yaxis.grid(True, color='gray', linestyle='dashed', linewidth=0.5) # 회색, dasted 타입, 굵기 0.5인 보조선 그려주기
#테두리 제거
sns.despine(left=True, bottom=True)
6. 파이 차트 그리기 : wedgeprops
부채꼴 영역의 너비, 테두리의 색상 , 테두리 선의 너비 설정
wedgeprops={'width': 0.7, 'edgecolor': 'w', 'linewidth': 0.5}
pie = df_agg.plot.pie(y='id' ,
figsize = (8,6) ,
autopct='%1.1f%%' ,
colors = colors_nude,
wedgeprops = wedgeprops)
7. 범례 이동시키기
# 범례를 fig 밖으로 뺌
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
8. replace : 조건에 맞는 컬럼 내 값을 교체
# age
mask_df['age'].replace(['Young','Mid','Old'],[0,1,2], inplace = True)
회고
겸손하게 공부하기가 통한 거 같다!
EDA를 통해서 여러 insight들도 얻고, 앞으로의 방향성 및 고민해보면 좋을 만한 포인트들을 알아낼 수 있었다.
그래서 이걸로 토론 글도 썼다 ㅎ히히
만약 EDA없이 성능 올리기에만 목 매달았다면 이런 점들을 생각해볼 수 없었을 거 같다.
강의 Overview가 굉장히 상세해서 내일의 목표를 설정하는데 엄청 좋은 거 같다.
내일은 Data Feeding 에 대해 배운다.
좀 무리를 하더라도, 베이스 코드를 짠 후, 교수님께 배운 Generalization 기법들을 적용해보고 성능이 좋아졌는지 확인해보자.
리더보드 말고 어제의 나와 경쟁하기 !
'Naver Ai Boostcamp' 카테고리의 다른 글
[03/31] Model (0) | 2021.03.31 |
---|---|
[03/30] Data Feeding (0) | 2021.03.31 |
[Day 38] 빠르게 & 가지치기 (0) | 2021.03.28 |
[Day 37] 모델의 시공간 & 알뜰히 (0) | 2021.03.27 |
[DAY 36] OMG 왜 안했누 (0) | 2021.03.26 |