Naver Ai Boostcamp

[03/29] P Stage Start !

잡담연구소 2021. 3. 30. 03:00

드디어 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. 데이터의 불균형이 너무 심하다 .

  1. 노년층의 데이터가 6~7배 적다.
  2. mask를 제대로 착용했을 때의 data가 5배 이상이다.

👉수업시간에 배운 focal loss를 적용 가능할까?

👉 variable 별 학습한 후 output을 조합해 class를 예측하는 것은 어떨까?

 

2. 모델이 좀 robust 해야 한다.

  1. test data에 새로운 마스크 패턴이 존재하므로, 마스크 패턴과 무관하게 학습이 진행 되어야 함

👉 noise를 좀 추가해주면 될까?

 

3. 나이/성별을 구분하기 힘들다.

  1. 얼굴을 다 가렸는데 나이를 어떻게 맞추지?
    👉 눈가 주름?
  2. 머리 길이에 따른 성별 구분 ❌
    👉 성별을 구분할 수 있는 기준이 무엇이 있을까?

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