부스트 캠프 ai tech 3주 2일차 Data 시각화 (6)


Text

  • 시각화에 적절한 Text는 시각적인것으로만 전달하기 힘든 설명을 추가하거나 잘못된 전달에서 생기는 오해를 방지 할 수 있다
  • 하지만 과한 Text는 오히려 방해가 될 수 있으니 주의할 필요가 있다

1. Anatomy of a Figure

  • Title : 그래프의 주제
  • Label : 축에 해당되는 데이터 정보
  • Tick Lable : 축의 grid의 스케일 정보
  • Legend : 한 그래프에서 여러개의 데이터 분류를 위한 보조 정보
  • Annotation : 그 외의 시각화를 위한 보조정보
1
코드 추가 필요

2. Text Properties

  1. font Components

    • family : 글씨체
    • size or fontsize : 사이즈
    • style or fontstyle : 스타일(기울임체 등등)
    • weight or fontweight : 두께
    • matplot Docs Fonts Demo
  2. Detail

    • color : 글씨의 색
    • linespacing : 줄간격
    • backgroundcolor : 배경색
    • alpha : 투명도
    • zorder : z축 순서
    • visible : 랜더 유무
  3. 정렬

    • ha : horizontal alignment
    • va : vertical alignment
    • rotation : 가로로 적을지 세로로 적을지 설정
    • multialignment : 추가적인 정렬
  4. 그 외 추가적인 항목

reference

부스트 캠프 ai tech 3주 1일차 Data 시각화 (4)


Lineplot

  • 연속적으로 변화하는 값을 점으로 나타내고 선으로 연결한 그래프

1. 기본적인 Lineplot

  • .plot()으로 그래프를 그릴 수 있다
  • 5개 이하의 선을 사용하는것이 가독성이 좋다
    • 색상, 마커, 선의 종류 등으로 선을 구분해서 가독성을 더 끌어 올릴 수 있다.
    • color : 색상 지정
    • marker : 점의 모양 지정
    • linestyle : 선의 종류 지정(solid, dashed, dashdot, dotted, None)
  • 흐름의 파악을 원할하게 하기 위해 smoothing을 사용해서 Noise를 줄인다

2. Lineplot의 특징

1. 흐름에 집중하는 그래프

  • 데이터의 흐름을 보기위한 그래프이다
    • 그렇기에 bar와 다르게 축을 0에 맞출 필요는 없다
  • 너무 구체적인 정보는 오히려 흐름을 보는데 방해 될 수 있다
    • Grid, Annotate등을 최소한으로 사용한다
    • 디테일한 정보는 따로 표로 제공하는것도 좋다
  • 생략되지 않는 선에서 범위를 조절해서 표현한다
    • .set_ylim()을 이용하자

2. 간격

  • 축의 간격이 다를경우 기울기 정보에서 오해를 일으킬 수 있다. 또한 점과 점 사이를 선으로 연결한 것이기 때문에 실제로 데이터가 없는부분에서 있다고 오해가 가능하다
    • 수치형 데이터일 경우 matplot에서 알아서 맞추어준다
    • 데이터의 위치에 mark를 해서 오해를 줄일 수 있다

3. 보간

  • 점과 점사이를 실제 데이터가 없지만 이어서 선으로 만드는 방법
  • 데이터의 error나 Noise가 포함되어 있을경우 보간을 사용해서 어느정도 보정해 이해를 도울 수 있다.
    • scipy모듈을 이용하여 사용
  • 데이터를 분석할 경우 미세한 차이를 놓치거나, 없는데이터를 있다고 생각하게 할수 있기때문에 EDA에서는 지양하는것이 좋다.

4. 이중 축 사용

  • 한 plot에 대해서 2개의 축을 사용하는 방법
  • 같은 시간축에서 서로다른 데이터를 표현하기 위해서 쓴다.
    • .twinx()를 사용해서 구현한다
  • 보통 한 데이터에 대한 다른단위 표현을 위해 사용한다
    • .secondary_xaxis(), .secondary_yaxis()를 사용한다
  • 두 데이터에 대해서 이중 축을 사용하는것은 강제로 상관관계를 부여할 수 있으니 지양하고 2개의 plot을 사용하는쪽이 좀 더 가독성 면에서도 좋다

5.그 외 팁

  • 라인 끝에 label을 추가하면 식별에 도움이 된다
  • 주요 포인트에는 annotation을 추가하면 도움이 될 수도 있다
  • 연한색으로 uncerainty 표현이 가능하다

reference

Week3 - Day 1 Review


1. 오늘 하루 한 것

  • 강의
    • 1, 2강 완료
  • 정리
    • 1강 완료, 2강 Barplot

2. 피어세션에서 한 것

  • 피어슨 상관계수

3. 내일 할 것

  • 정리 마무리
  • 3, 4 강의

4. 하루 느낀점

  • 설연휴 좀 쉬었더니 빠르게 정리가 잘 되지 않는다
  • 쉰다고 많이 못했어….

부스트 캠프 ai tech 3주 1일차 Data 시각화 (3)


Barplot

  • 직사각형의 막대를 사용하여 데이터를 표현하는 그래프
  • category에 따른 수치값을 비교하기에 적합하다

1. 기본적인 Barplot

  • barplot은 기본적으로 bar, barh가 존재한다.
  • bar는 수직, barh는 수평으로 막대를 그린다
1
2
3
4
5
6
fig, ax = plt.subplots(1, 2, figsize=(12, 7))
x = list('ABCDE')
y = np.array([1, 2, 3, 4, 5])
ax[0].bar(x, y)
ax[1].barh(x, y)
plt.show()
subplot

2. 다양한 Barplot 기법

  • 다양한 barplot에 대해서 이야기를 할 예정이다
  • 사용하는 데이터는 Boostcamp에서 제공한 데이터를 사용하였다
  • Multiple
    • plot을 여러개 그리는 방법이다.
    • subplots의 sharey를 이용하여 y축의 범위를 공유할 수 있다.
    • 각 group의 분포를 알기 좋지만 group간 비교하기에는 쉽지 않다
1
2
3
4
fig, ax = plt.subplots(1, 2, figsize=(12, 6), sharey=True)
ax[0].bar(group['male'].index, group['male'], color='royalblue')
ax[1].bar(group['female'].index, group['female'], color='tomato')
plt.show()
subplot
  • Stack
    • 2개 이상의 그룹을 쌓아서 표현하는 방식이다
    • 맨 밑 group의 분포는 파악하기 쉽지만 그외는 파악하기 힘들다
    • bottom : bar의 시작 y좌표를 설정 할 수 있다.
1
2
3
4
5
6
7
8
fig, axes = plt.subplots(1, 2, figsize=(15, 7))
group_cnt = student['race/ethnicity'].value_counts().sort_index()
axes[0].bar(group_cnt.index, group_cnt, color='darkgray')
axes[1].bar(group['male'].index, group['male'], color='royalblue')
axes[1].bar(group['female'].index, group['female'], bottom=group['male'], color='tomato') # 각 category의 y축 시작지점을 group['male']의 수치로 지정한다
for ax in axes:
ax.set_ylim(0, 350)
plt.show()
subplot
  • Percentage Stack
    • Stack을 응용하여 만든 BarPlot
    • bal_label을 이용하여 중간에 퍼센트를 찍어주었다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fig, ax = plt.subplots(1, 1, figsize=(12, 7))

group = group.sort_index(ascending=False) # 역순 정렬
total=group['male']+group['female'] # 각 그룹별 합

for name, color in zip(['male', 'female'], ['royalblue', 'tomato']):
rects = ax.barh(group[name].index, group[name]/total,
left=group['male']/total if name == 'female' else 0,
color=color)
ax.bar_label(rects, fmt='%.2g', label_type='center')

ax.set_xlim(0, 1)
for s in ['top', 'bottom', 'left', 'right']:
ax.spines[s].set_visible(False)

plt.show()
subplot
  • Overlap
    • 2개의 그룹만 비교할때 사용하기 좋은 방식
      • 3개 이상은 파악이 어렵다
    • 같은 축을 사용하기 때문에 비교하기 쉽다
    • Bar보다는 Area에서 더 효과적이다
1
2
3
4
5
6
7
8
9
10
11
group = group.sort_index()
fig, axes = plt.subplots(1, 1, figsize=(8, 6))

axes.bar(group['male'].index, group['male'],
color='royalblue',
alpha=0.7)
axes.bar(group['female'].index, group['female'],
color='tomato',
alpha=0.7)
ax.set_ylim(0, 200)
plt.show()
subplot
  • Group
    • 그룹별 범주에 따른 막대를 이웃되게 배치하는 방법
    • Matplotlib로는 구현이 까다롭다
    • 그룹이 5~7개 이하일때 효과적이다
      • 많으면 오히려 역효과가 난다

시각화시 주의해야할점

  1. 실제값과 그래픽으로 표현되는 부분은 비례해야한다
    • 반드시 x축의 시작은 0부터 한다
    • 차이를 나타내고 싶다면 세로의 비율을 늘리자
  2. 정확한 정보를 전달하기 위해서 정렬을 하자
    • 데이터의 종류에따라 여러 기준으로 정렬을 한다.
    • 시계열 : 시간
    • 수치형 : 크기
    • 순서형 : 범주의 순서대로
    • 명목형 : 범주의 값에 따라서
    • interactive로 제공하는 것이 유용하다
  3. 여백을 잘 조절하자
    • 너무 꽉차있거나 비어있으면 가독성이 떨어진다. 적절한 조절로 가독성을 높이자
    • .set_xlim(), .set_ylim()으로 표시할 영역을 지정한다
    • .spines[pos].set_visible()을 이용해서 외곽선을 안보이게 조절한다
    • Gap, Margins을 이용해서 적절히 간격을 띄운다
  4. 복잡함을 줄이자
    • 3D는 왠만해서는 쓰지말자…
    • 축과 디테일을 조절하여 가독성과 깔끔함을 동시에 챙기자
      • text, annotate등을 이용하자

reference

부스트 캠프 ai tech 3주 1일차 Data 시각화 (2)


3. matplot.pyplot 기초

  • 이 글에서는 python 시각화 라이브러리 matplot에 대해서 다루어 본다
  • 기본적으로 가장 많이 사용하는 matplot.pyplot을 이용하여 그래프를 그린다.

들어가기전에

  • 보통 아래와 같이 많이 pyplot을 plt로 선언 한다
1
2
import numpy as np
import matplotlib.pyplot as plt

Figure & Axes

  • plt.figure로 그래프틀을 선언하고, plt.show()를 이용하여 화면에 나타낼 수 있다.
  • num : figure의 id를 지정한다. 이미 지정한 id가 존재하고 그것이 다시 정의될 경우에 원래 존재하던 figure를 반환한다
  • figsize : 그래프틀의 크기를 지정한다
  • dpi : 해상도를 설정한다
  • facecolor : 배경화면의 색을 지정한다
  • edgecolor : 가장자리 라인의 색을 지정한다
1
2
3
4
5
fig = plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)
plt.show()
==========
output
<Figure size 432x288 with 0 Axes>
  • 위의 코드에 Axes라는 subplot을 추가해야지만 제대로 그래프가 나온다
  • figure의 add_subplot()을 이용하여 Axes를 지정할 수 있다
1
2
3
fig = plt.figure()
ax = fig.add_subplot()
plt.show()
viz2

subplot

  • Axes에 추가적인 Argument 입력을 통해서 위치를 지정해 줄 수 있다.
  • suplots를 이용하여 fig와 Axes들을 동시에 정의 할 수도 있다.
1
2
3
4
fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
plt.show()
subplot

plot

  • plot을 통해서 그래프를 그릴 수 있다.
  • x축과 y축의 수치가 1대1 대응으로 그래프가 그려진다.
  • figure, subplot에 plot을 통해 입력이 가능하다
  • 여러번 plot을 할 경우 여러개의 그래프가 그려진다
  • 직접 색을 입력해서 그래프의 색상을 지정 할 수 있다
  • x : x축이 될 데이터들
  • y : y축이 될 데이터들
1
2
3
4
5
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
ax1.plot([1, 2], [1, 3], color = 'forestgreen')
ax1.plot([2, 3], [3, 1], color = 'r')
plt.show()
plot

text

  • label : 그래프에 label을 붙일 수 있다.
  • 단 label을 표시하기 위해서는 legend()를 이용해야 한다.
1
2
3
4
5
6
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
ax1.plot([1, 2], [1, 3], color = 'forestgreen', label = '1')
ax1.plot([2, 3], [3, 1], color = 'r', label = '2')
ax1.legend() # 이게 없으면 label 표시가 나오지 않음
plt.show()
plot
  • 여러 메소드를 이용하여 그래프의 특정부분을 변경 시킬 수 있다.
  • set_title : title을 지정할 수 있다.
  • set_xticks : x축의 범주값을 지정할 수 있다.
  • set_ticklabels : x축을 텍스트 값으로 지정할 수 있다.
  • annotate : 그래프에 여러가지를 추가 할 수 있다.
  • 여러 메소드의 자세한 내용들은 추후에 다룰 예정이다.

reference

부스트 캠프 ai tech 3주 1일차 Data 시각화 (1)


1. Data의 종류

  • Dataset은 아래와 같이 분류가 가능하다.
    1. 정형 데이터
    2. 시계열 데이터
    3. 지리 데이터
    4. 관계형 데이터
    5. 계층적 데이터
  • 데이터는 아래와 같이 분류가 가능하다.
    • 수치형 데이터(numerical) : 수치로 표현된 데이터
      • 연속형(continuous) : 길이, 무게, 온도 등
      • 이산형(discrete) : 사람 수, 주사위 눈금 등
    • 범주형(categorical) : 문자로 표현되는 데이터
      • 명목형(norminal) : 혈액형, 종교, 주소 등
      • 순서형(ordinal) : 학년, 등급, 성적 등

1. 정형 데이터

  • 가장 기본적인 데이터 형태
  • 테이블 형태로 제공되는 데이터이다.

2. 시계열 데이터

  • 시간에 흐름에 따른 데이터
  • 기온 주가 등의 정형 데이터로 표현한 데이터와 음성, 비디오와 같이 비정형인 데이터가 존재한다.

3. 지리/지도 데이터

  • 지형과 지명이 들어가 있는 데이터
  • 위도와 경도를 이용해서 정형데이터로도 표현이 가능하다.
  • 지도 정보와 보고자하는 정보간의 조화를 잘 맞추어 주는것이 중요하다

4. 관계형 데이터

  • 객체와 객체간의 관계를 시각화 할 수 있는 데이터
  • 객체는 Node로, 관계는 Link로 표현이 가능하다
  • 크기와 색, 수 등으로 관계의 가중치를 표현 가능하다
  • 보기쉽게 하기위해 휴리스틱하게 노드의 배치를 구성할 수 있다

5. 계층적 데이터

  • 위의 관예형 데이터중에서 포함관계가 분명한 데이터
  • Tree, Treemap등의 형태의 데이터가 포함된다

2. 시각화

  • 수치와 문제로 이루어진 데이터를 점,선,면을 이용해서 한눈에 보기 쉽게 만들어준다
  • 아래의 속성들을 적절하게 사용해서 시각적으로 분리를 일으켜서 주의 깊게 보지 않아도 한눈에 알아볼수 있도록 하는것이 목표이다
    • 너무 많이 사용하면 오히려 인지하기 힘든 부작용이 나타난다
viz

reference

Week2 Homework


1. 기초과제

  • 과제 내용
    • Pytorch의 Custom Model 제작에 필요한 nn.Module 함수들에 대한 공부
    • Dataset과 Dataloader의 구현
  • 결과 및 회고

2. 심화과제

  • 과제내용
    • Transfer Learning과 weight 초기화 + Ray사용 해보기
  • 결과 및 회고
    • Transfer Learning은 익히 알던 내용이여서 어렵지 않았다
    • weight 초기화를 할때 랜덤으로 초기화 해주는것보다 특정 initialization 을 진행하는것이 더 성능이 잘 나오는것에 대해 알게 되었다
      • 이미 pytorch에서는 layer별로 내부 Method에 적용되어있다고 한다
      • 자세한 내용은 kaiming_uniform_에 대해 찾아보는것을 추천한다
    • Ray는 코드 실행은 해보았지만 colab GPU 사용량 초과로 인해서 강제 종료 당했다
    • 추후에 Linux 환경의 컴퓨터에서 다시한번 실행을 해 볼 예정이다

부스트 캠프 ai tech 2주 4일차 Pytorch (8)


Pytorch Troubleshooting

  • OOM : Out Of Memory
    • GPU의 메모리가 터질때 발생하는 현상…
    • 왜 발생했는지 알기힘듬
    • 메모리의 이전상황의 파악이 어려움
  • OOM의 해결방법
    • 보통 이 아래방법으로 대부분 해결된다
    • Batchsize를 줄여서 메모리 부하를 줄인다
    • torch.cuda.empty_cache()를 이용하여 GPU의 메모리를 clear 한 뒤에 학습시킨다
  • 그 외에 신경쓰면 좋을점
    • GPUtil Module 사용하기
    • tensor.no_grad() 사용하기
    • 적절하게 del 명령어 사용하기
    • 다양한 batchsize로 돌려서 가능한 batchsize 알아보기
    • tensor의 float 32를 float 16으로 줄여보기

reference

부스트 캠프 ai tech 2주 4일차 Pytorch (7)


8. Hyperparameter Tuning

  • Hyperparameter 란?
    • Learning Rate, Model의 inputsize, optimizer, loss function, batchsize 등의 모델이 스스로 학습하지 않는 값을 말한다
    • 이 Hyperparameter를 조절하여 성능을 올리는 방법을 Hyperparameter Tuning이라고 부른다
    • 생각보다 스펙타클하게 성능이 좋아지지는 않는다
  • parameter에 따른 기울기값을 계산한뒤 큰값을 내는(빠르게 학습이 가능한) parameter를 찾는 기법
  • 보통 Learning rate를 찾는데 사용하는 기법이다
  • 특정 간격마다의 값으로 검색하는 Grid Layout과 랜덤한 값으로 검색하는 Random Layout 등 여러가지 방법이 존재한다
  • 최근에는 베이지안 기반의 기법들이 주도하고 있다
    • BOHB(Baysian Optimizer Hyperband)

8.2 Ray 라이브러리

  • ML과 DL의 병렬 처리를 위해 개발된 모듈이다
  • Hyperparameter Search를 위한 다양한 모듈을 제공한다
  • ML과 DL을 위해 개발되긴 했는데 분산처리(Multiprocessing)코드를 단순하고, 범용적으로 작성할 수 있게 도와준다
  • 병렬처리 양식으로 학습을 시행해서 성능이 좋지않은 process들을 제외해 가면서 최적의 hyperparameter를 찾는다
  • 아래쪽의 참고 문서를 보는것을 추천한다

reference

부스트 캠프 ai tech 2주 4일차 Pytorch (6)


7. Multi GPU 학습

  • 데이터의 양이 방대해짐에 따라서 모든 데이터들을 전부 메모리에 올리는것이 물리적으로 힘들고, 시간적으로도 소요가 많이 되어서 이를 해결하기 위해 여러대의 GPU를 병렬적으로 사용하는 방법이다
  • 크게 2가지의 방법으로 나뉜다
    • Model 병렬화 : 모델을 나눠서 학습한다
    • Data 병렬화 : 데이터를 나눠서 학습한다

7.1 Model 병렬화

  • 모델을 나눠서 여러대의 GPU에 올려서 연산하는 방법

  • 모델의 크기가 너무 커서 GPU에 올라가지 않는 상황에서 사용한다

  • 모델의 병목화, 파이프라인 구축 등의 문제로 인해 구현 난이도가 높다

    • pipeline을 제대로 구축하지 않으면 한 GPU가 연산하는동안 다른 GPU가 놀고있는 상황이 발생해 오히려 Single GPU보다 못한 상황이 발생 할 수 있다
  • Model Pipeline Paralle 예시 - Pytorch 공식 모델 병렬화 Tutorial

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class PipelineParallelResNet50(ModelParallelResNet50):
    def __init__(self, split_size=20, *args, **kwargs):
    super(PipelineParallelResNet50, self).__init__(*args, **kwargs)
    self.split_size = split_size

    def forward(self, x):
    splits = iter(x.split(self.split_size, dim=0))
    s_next = next(splits)
    s_prev = self.seq1(s_next).to('cuda:1')
    ret = []

    for s_next in splits:
    # A. s_prev는 두 번째 GPU에서 실행됩니다.
    s_prev = self.seq2(s_prev)
    ret.append(self.fc(s_prev.view(s_prev.size(0), -1)))

    # B. s_next는 A.와 동시에 진행되면서 첫 번째 GPU에서 실행됩니다.
    s_prev = self.seq1(s_next).to('cuda:1')

    s_prev = self.seq2(s_prev)
    ret.append(self.fc(s_prev.view(s_prev.size(0), -1)))

    return torch.cat(ret)
  • 아래의 그림에서 2장의 레이어 사이에 교차하는 부분이 병렬 GPU간의 교차 통신이다

    • Model 병렬화는 꽤 예전 논문인 AlexNet에서도 사용되고 있었다

Alexnet

7.2 Data 병렬화

  • 데이터를 나눠서 GPU에 할당한 후 결과의 평균을 취하는 방법
  • 각 데이터에 대한 연산을 여러 GPU에서 동시에 수행해서 학습의 효율을 높인다
    • 합칠때
  • pytorch에서는 두 가지 방식을 제공한다
    • DataParallel : 단순하게 데이터를 분배한 뒤 평균을 취하는 방식
    • Distributed DataParallel : GPU에서 모든 연산이 끝난뒤에 결과만을 공유하는 방식
  1. DataParallel:
    • 단순하게 GPU에 데이터를 분배한 뒤 평균을 취하는 방식
    • 연산이 끝난뒤에 하나의 GPU에 loss값을 모아서 gradient를 만들고 이것들 다시 다른 GPU에 전달을 해준다
    • 하나의 GPU가 특별하게 자원을 많이 사용하는 문제가 발생할 수 있다
      • 합쳐진 loss연산을 GPU는 더 많은 메모리를 사용하기 때문에 Batch사이즈의 감소등의 방법으로 메모리 부하를 줄여야 할 수도 있다
    • 매우 간단하게 pytorch에서 구현 할 수 있다
      1
      parallel_model = torch.nn.DataParallel(model) # 나머지는 일반 모델과 동일
  2. Distributed DataParallel:
    • GPU에서 모든 연산이 끝난뒤에 결과만을 공유하는 방식
    • Loss, Backward 계산 모두 각각의 GPU에서 이루어지며 연산이 완전히 끝나고 평균값이 결과로 출력된다
    • 개별 GPU마다 CPU에서 프로세스를 생성해서 할당한다 (Multiprocessing)
    • DataParallel과는 다르게 DataLoader에서 Shuffle 대신에 DistributeSampler를 사용하고, pin_memory를 활성화 시킨다

reference