목차





시각화 도구


  • 우리가 사용하려는 데이터는 어떻게 생겼는지 보여주는 도구
  • 데이터 시각화를 못하면 데이터 분석 못한다고 말씀

matplotlib

  • pyplot 객체를 사용하여 데이터를 표시
  • pyplot 객체에 그래프들을 쌓은 후 flush(show함수) (보여주고 나면 비움)
  • Graph 는 기본 figure 객체에 생성됨
  • pyplot 객체 사용시 기본 figure 에 그래프가 그려짐
  • plot 은 라인 그래프이므로 쌍 안맞추면 이상하게 그려짐 → X 순서대로 Y 값 적을 것
  • plot 만 해도 그려지긴 함, 그래도 show 쓰자
import matplotlib.pyplot as plt

X = range(100)
Y = range(100)
plt.plot(X,Y)
plt.show()
  • 결과

image1

Figure & Axes

  • 기본 figure 객체 외에 따로 객체를 저장해서 사용 가능
  • subplot 은 grid 구조로 할당 가능
fig = plt.figure() # figure 반환
fig.set_size_inches(10,3) # 크기지정
ax_1 = fig.add_subplot(1,2,1) # 두개의 plot 생성
ax_2 = fig.add_subplot(1,2,2)  # 두개의 plot 생성

ax_1.plot(X_1, Y_1, c="b")  # 첫번째 plot
ax_2.plot(X_2, Y_2, c="g")  # 두번째 plot
plt.show() # show & flush

image2

여러 속성들

  • Set color
    • plot 의 속성으로 c or color 설정 가능, rgb 나 영소문자 심벌 사용가능
X_1 = range(100)
Y_1 = [value for value in X]

X_2 = range(100)
Y_2 = [value + 100 for value in X]

plt.plot(X_1, Y_1, color="#000000")
plt.plot(X_2, Y_2, c="c")

plt.show()

image3

  • Set linestyle
    • ls or linestyle 속성 설정
  • Set title
    • latex 타입의 표현도 가능 (수식 표현 가능)
    • plt.title(‘tt’)
  • Set legend
    • 범례 표시 가능
  • text 나 annotation 도 설정 가능
  • 저장
    • savefigure 사용
    • show (flush) 전에 해줘야 함

scatter

  • 산전도 그리는 함수
  • marker 는 scatter 모양 설정
  • 다 검색해서 쓰면 됨

bar

  • 막대 그래프 그려주는 함수
  • 가로 형태의 hbar 함수도 있음

histogram

  • 분포차트 그려주는 함수
  • hist 함수 사용, bins 속성 개수만큼 칸을 나눔

boxplot

  • 알아둘 필요 있음 (박스플롯 자체 의미도)
    • 데이터에 대한 분포를 박스 형태로 그려줌, 몰린 정도와 범위까지 (아웃라이어도)
  • boxplot 함수 사용

seaborn

  • statistical data visualization (통계적 데이터 시각화)
  • matplotlib 를 더 쉽게 다루도록 도와줌 (matplotlib 의 wrapper)
  • 기존 matplotlib 에 기본 설정을 추가
  • 복잡한 그래프를 간단하게 만들 수 있는 wrapper
  • 간단한 코드 + 예쁜 결과
  • load_dataset 할 때 “tips” 와 “fmri” 많이 씀 (기본 데이터셋)
  • import seaborn as sns 로 함

basic plot

  • lineplot
    • 주 데이터 선과 분포가 위아래로 나옴
    • hue 속성에 카테고리를 넣으면 카테고리 별로 나눠줌
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")
tips = sns.load_dataset("tips")
fmri = sns.load_dataset("fmri")
sns.set_style("whitegrid")
sns.lineplot(x="timepoint", y="signal", data=fmri)

image4

  • scatterplot
    • 기본 scatter 와 거의 동일
    • hue 사용 가능
  • regplot
    • scatterplot 에다가 regression line (선형회귀선) 도 그려줌
  • countplot
    • 카테고리 데이터를 위해 쓰고 카테고리 데이터 개수를 세어줌
  • barplot
    • 막대 그래프 그려줌
  • distplot
    • 데이터의 분포를 그려줌
  • violinplot
    • 바이올린 플롯 (일반적으로 많이 사용), 분포 보기 편함
  • swarmplot
    • 데이터 적을 때 괜찮음, 분포 보기 편함
  • 기타 여러 플롯 많음




통계학 맛보기


모수가 뭐에요?

  • 통계적 모델링은 적절한 가정 위에서 확률분포를 추정(inference)하는 것이 목표이며, 기계학습과 통계학이 공통적으로 추구하는 목표
  • 유한한 개수의 데이터만 관찰해서 모집단의 분포를 정확하게 알아내는 것은 불가능 → 근사적으로 확률분포 추정
    • 예측모형의 목적은 분포를 정확하게 맞추는 것보다는 데이터와 추정 방법의 불확실성을 고려해서 위험 최소화하는 것
  • 데이터가 특정 확률분포를 따른다고 선험적으로(a priori) 가정한 후 그 분포를 결정하는 모수(parameter) 를 추정하는 방법이 모수적(parametric) 방법론
  • 특정 확률분포를 가정하지 않고 데이터에 따라 모델의 구조 및 모수의 개수가 유연하게 바뀌면 비모수적(nonparametric) 방법론이라 부름
    • 기계학습의 많은 방법론은 비모수 방법론에 속함
    • 모수가 없는게 아니라 모수가 무한히 많거나 데이터에 따라 바뀌는 것

확률분포 가정 예제

  • 확률분포를 가정하는 방법 : 우선 히스토그램을 통해 모양 관찰
    • 데이터가 2개의 값 (0, 1) 만 가지는 경우 → 베르누이 분포
    • 데이터가 n 개의 이산적인 값을 가지는 경우 → 카테고리 분포
    • 데이터가 [0, 1] 사이에서 값을 가지는 분포 → 베타분포
    • 데이터가 0 이상의 값을 가지는 경우 → 감마분포, 로그정규분포 등
    • 데이터가 $R$ (실수) 전체에서 값을 가지는 경우 → 정규분포, 라플라스분포 등

    → 연속확률분포와 이산확률분포를 관찰되는 분포에 따라 결정할 수 있음

  • 기계적으로 확률분포를 가정 x, 데이터를 생성하는 원리를 먼저 고려하는 것이 원칙 (데이터를 관찰하고 선택해야함)

    → 어떤 확률분포로 모델링했을 때 모수 추정과 더불어 반드시 각 분포에 적절한 방법으로 검정을 해야함

데이터로 모수 추정하기

  • 데이터의 확률분포를 가정했으면 모수 추정 가능
  • 정규분포의 모수는 평균 $\mu$ 와 분산 $\sigma^2$ 를 사용하고 이를 추정하는 통계량(statistic) 은 다음과 같음 (모집단의 평균은 $\overline{X}$, 분산은 $S$)
    • 표본 평균 : 산술평균 → 전체 데이터 평균 기대값 $E[\overline{X}] = \mu$
    • 표본 분산 : (데이터 - 모평균)^2 의 산술평균 → $E[S^2] = \sigma^2$

    image5

  • 통계량의 확률분포를 표집분포(sampling distribution) 라 부르며, 특히 표본 평균의 표집분포는 N 이 커질수록 정규분포 $N(\mu,\ \sigma^2/N)$ 을 따름
    • 이것이 중심극한정리 (모집단의 분포가 정규분포를 따르지 않아도 성립)
      • 분포에서 추출한 통계량, 표본평균의 데이터가 많을수록 분산은 0 에 가까워지고 가운데 (평균) 으로 몰림

최대가능도 추정법

  • 표본평균이나 표본분산은 중요한 통계량이지만 확률분포마다 사용하는 모수가 다르므로 적절한 통계량이 달라짐
  • 이론적으로 가장 가능성이 높은 모수를 추정하는 방법 중 하나는 최대가능도 추정법 (maximum likelihood estimation, MLE)
    • 가능도 함수 $L(\theta;\ x)$ : 주어진 데이터 x 에 대해 모수 세타를 변수로 둔 함수, 즉 데이터가 주어진 상태에서 세타를 변형시킴에 따라 값이 바뀌는 함수. 모수 세타를 따르는 분포가 데이터 x 를 관찰할 가능성 (다 더해서 1 이 안되므로 확률로 해석하면 안됨)

    image6

  • 데이터 집합 X 가 독립적으로 추출되었을 경우 로그가능도를 최적화
    • 로그 씌우고 덧셈식으로 최적화 가능
      • 독립 표본 : 서로 다른 항목의 집합에서 얻은 측정값
      • 종속 표본 : 한 항목의 집합에서 얻은 측정값

    image7

  • 왜 로그가능도 사용하는가?
    • 로그가능도를 최적화하는 모수 세타는 가능도를 최적화하는 MLE
    • 데이터의 숫자가 적으면 상관없지만 만일 데이터의 숫자가 수억 단위가 된다면 컴퓨터의 정확도로는 가능도 계산 불가능
    • 데이터가 독립이면 로그를 통해 가능도의 곱셈을 덧셈으로 바꿀 수 있음 → 컴퓨터로 연산 가능
    • 경사하강법으로 가능도 최적화할 때 미분 연산을 하는데, 로그 가능도를 사용하면 이 연산량을 O($n^2$) 에서 O(n) 으로 줄여줌
    • 대게의 손실함수의 경우 경사하강법을 사용하므로 음의 로그가능도를 최적화

최대가능도 추정법 예제 : 정규분포

  • 정규분포를 따르는 확률변수 X 로부터 독립적인 표본 {x1, …, xn} 을 얻었을 때 최대가능도 추정법을 이용하여 모수를 추정하면?
    • 주어진 데이터를 가지고 (로그) likelihood 를 최적화하는 세타를 찾아야 함

    image8

    image9

    image10

    • 불편추정량을 보장하진 않지만 consistence 는 보장

최대가능도 추정법 예제 : 카테고리 분포

  • 카테고리 분포 Multonoulli(x; p1, …, pd) 를 따르는 확률변수 X 로부터 독립적인 표본 {x1, …, xn} 까지 얻었을 때 최대가능도 추정법을 이용하여 모수를 추정하면?

    (정규분포의 모수는 평균과 분산이라는 통계량인 반면, 카테고리 분포의 p 들은 1~d 차원까지 각각의 차원에서 값이 1 또는 0 이 될 확률을 의미하는 모수 → p1 ~ pd 다 더하면 1)

    (Q. MLE 식에 대한 정확한 뜻을 모르겠음 → 원딜님 피피티 다시보자)

    image11

    image12

    image13

    image14

딥러닝에서 최대가능도 추정법

  • 기계학습 모델 학습에서 사용
  • 딥러닝 모델의 가중치를 $\theta$ = (W(1) , …, W(L)) 이라 표기했을 때 분류 문제에서 소프트맥스 벡터는 카테고리분포의 모수 (p1, …, pk) 를 모델링함
  • 원핫벡터로 표현한 정답레이블 y = (y1, …, yk) 를 관찰 데이터로 이용해 확률분포인 소프트맥스 벡터의 로그가능도 최적화 가능

    image15

확률분포의 거리 구하기

  • 기계학습에서 사용되는 손실함수들은 모델이 학습하는 확률분포와 데이터에서 관찰되는 확률분포의 거리를 통해 유도
  • 데이터공간에 두 개의 확률분포 P(x), Q(x) 가 있을 경우 두 확률분포 사이의 거리를 계산할 때 다음과 같은 함수들을 이용
    • 총변동 거리 (Total Variation Distance, TV)
    • 쿨백-라이블러 발산 (Kullback-Leibler Divergence, KL)
    • 바슈타인 거리 (Wasserstein Distance)

쿨백-라이블러 발산

  • 정의
    • 뒷 자리 Q 를 로그의 분모로 앞자리 P 를 로그의 분자로
    • 이산은 시그마, 연속은 적분

    image16

  • 분해
    • 두 개의 엔트로피 표현 가능

    image17

  • 분류 문제에서 정답레이블을 P, 모델 예측을 Q 라 두면 최대가능도 추정법은 쿨백-라이블러 발산을 최소화하는 것과 같음
    • 기계학습의 원리는 데이터로부터 확률분포 사이의 거리를 최소화하는 것과 동일

Further Question

  1. 확률과 가능도의 차이는 무엇일까요? (개념적인 차이, 수식에서의 차이, 확률밀도함수에서의 차이)

  2. 확률 대신 가능도를 사용하였을 때의 이점은 어떤 것이 있을까요?

  3. 다음의 code snippet은 어떤 확률분포를 나타내는 것일까요? 해당 확률분포에서 변수 theta가 의미할 수 있는 것은 무엇이 있을까요?




피어 세션


질문

  1. 표본분산에서 n-1 인 이유
    모집단의 표준편차와 비슷하게 만들기 위해 보정한 것
  2. 엔트로피
    데이터를 나눠주는 기준, 디시전 트리에서 가장 빠르게 분류할 수 있게 만들어주는 손실함수로 크로스 엔트로피가 사용됨

펭귄님 : Further Question 은 피어세션에서 다루자.




마스터 클래스

1. AI 관련해서 추천 해주실만한 책이 있나요?

  • 영어책 괜찮으면 아마존 ‘Dive into Deep Learning (D2L)’
    • 코드랑 수식 다 있어서 좋음
    • PRML 등 좋은 책 많지만 코드 관련은 적어서 이 책 추천
  • 한글책은 ‘밑바닥부터 시작하는 딥러닝’

2. AI 를 공부하면서 수학의 중요성을 느끼는데 확률, 통계, 선대 공부 어떤식으로 할까요?

  • 코드랑 같이 공부하는거 추천! 수식을 코드로 어떻게 쓰는지 같이 보는게 가장 중요 → D2L 책 좋음

3. 강화학습은 목적함수 설정이 어려움, 복잡한 태스크의 목적 함수는 수학자를 통해 나오는지 아니면 거듭된 수정을 거치는지 궁금합니다.

  • 수학자가 하다 망한 경우 많음, 수학자가 하지 않음
  • 엔지니어들이 문제를 쪼개면서 설계해서 만든 경우가 더 많음
  • 디버깅이 더 중요
  • 원하는 목적에 맞는 더 효율적인 수식을 짤 때 수학자 필요, 보통은 더 간단함

4. 여러 모델들의 수학적 원리를 다 이해해야 할까요? 수학적 수식이 실제로 일할 때 어떻게 쓰이는지 궁금합니다.

  • 모든 걸 다 이해하면 좋지만 그 때 그 때 찾아서 씀
  • 영어로 비유하면 모르는 단어는 사전 찾아보듯 함, 대신 알파벳처럼 기본적은 알아야 함
  • 현업에서는 수식부터 먼저 이해하고 코딩 시작함

5. 추천시스템 및 AI 금융 트레이딩을 위해 알아야할 선행 지식이 있을까요?

  • 추천시스템을 위해 선형대수 지식 필요하고 베이즈 정리 등도 필요함.
  • 금융 트레이딩에서는 광범위하지만 단적으로는 금융 시스템은 확률 기반이라 확률론이라는 통계적 지식 등이 많이 필요함, 강화학습을 위해 더 심화된 선대, 확률론 등 내용 필요

6. ML/DL 리서쳐가 아닌 엔지니어는 수학을 어느정도 알아야 할까요?

  • 본인 업무에 필요한 정도
  • 보통 리서쳐와 엔지니어는 수학 좋아하고 잘 함. 직접 공부하고 모르는 부분을 채워나가야 함. 이정도만 알면 되겠지가 아니라 필요한거 그때그때 공부해야함. 이것을 위한 수학에서의 기초 체력이 필요함.

7. 강화학습이 현업에서 적용되고 있나요?

  • 몇몇 우리가 알만한 회사에서는 교통 관련 시스템 통제나 추천 시스템 만들 때 강화학습 사용중
  • 수학을 엄청 쓰기보다는 하드코어한 엔지니어링으로 해결 많이 함

8. 교수님이 부스트캠프 수강생이라면 어떤 공부를 중점적으로 하실 것 같으신가요?

  • 코드랑 수학이랑 매칭하면서 공부할 것
  • 그렇다고 너무 코드만 집중하면 깊이가 떨어짐. 아이디어에 대해 다른 사람에게 의존하게됨.
  • 수학은 새로운 아이디어 떠올릴 때 좋고 코드는 아이디어를 구현할 수 있어서 좋음
  • 리서쳐 : 수식 ↔ 코드 매칭 둘 다 해야함
  • 엔지니어 : 수식 → 코드 매칭 훈련 필요
  • 다이브 인 투 딥러닝 꼭 해라! 그 책 코드 모든 부분 따라하면서 공부할 것

9. 수학이 많이 어려운데 강의 내용을 더 자세히 볼 수 있는 책이나 강의가 있을까요?

  • PRLM 책?
  • 이번 강의는 여러 키워드를 던져주고 직접 구글링해서 찾아보는 식으로 공부 추천
  • 구글링도 추천

라이브 Q&A

1. 인공지능 관련으로 공부하고 취업하려면 대학원은 필수일까요? 입학하기 위해서는 어떤 준비를 해야할까요?

  • 필수는 아님, 하지만 도움이 많이됨
  • 모르는 부분을 대학원에서 해소할 수 있어서 좋음
  • 딥러닝 인공지능 분야는 매우 넓기 때문에 대학원에서 지도 받으면서 전문적으로 컨설팅 받으면서 클 수 있어서 좋다.
  • 입학 준비
    • 컴공 지식, 머신러닝 지식 (이번 부캠에서 배운 내용 정확히 알면 충분), 더 깊이는 알고리즘 공부해도 좋음.
    • 임교수님 랩 선발 기준은 메일 보내면 답해주겠다.

2. 딥러닝에서 기존 변수를 결합해 파생변수를 만드는것(피쳐엔지니어링)이 결과에 도움이 되나요? 기존 변수를 선형결합하거나, 나누거나 곱해 새로운 변수를 만드는데 모델에 어떤 영향을 주는지 궁금합니다.

  • 진리의 케바케임
  • 근데 지식을 갈아넣는 피쳐엔지니어링보다는 데이터 부분 (원하는 퍼포먼스를 위해 이 데이터가 도움되는가, 데이터 전처리 등) 이 더 도움되었음.

3. 통계학 공부 책 추천

  • 통계 이론 공부하고 싶다면 PRML, 통계학 도감 등 (수식보다 직관적으로, 그림으로 이해되는 경우가 더 많음)

4. 시계열 데이터를 다룰 때 데이터의 시기(t) 에 의해 모델이 오버피팅 될 수 있는데 예를 들면 과거 데이터에 너무 편향된 경우, 이럴 때는 어떻게 해결하나요?

  • 모델마다 다름.
  • RNN은 반대로 최근 데이터에 너무 집착하는 걸 잡으려고 LSTM 을 사용하기도 했음

5. 딥러닝을 확률론적으로 접근하는 것과 백프로파게이션을 통해서 딥러닝을 하는 것과 다른 관점인가요? 제가 생각하기엔 백프로파게이션을 통해 학습을 하는 점에서는 확률과 통계학이 사용되지 않는 것 같은데 확률과 통계는 다른 관점에서 접근하나요?

  • 백프로파게이션은 싱글 데이터에서 진행되는데, 전체 데이터에 대해 미니배치로 학습하고 확률적으로 접근하기 떄문에 사용. 드롭아웃 등도 통계나 확률에서 사용되는거 많음
  • 다른 관점이 아니라 백프로파게이션뿐만 아니라 확률과 통계라는 기법도 사용할 수 있음.

6. 엔지니어링이란?

  • 이론적으로 풀려는건 리서쳐적인 태도
  • 직관이나 문제해결 측면으로 보는게 엔지니어링 태도
  • 하드웨어나 소프트웨어 발전으로 문제가 해결되는 경우도 많음 → 엔지니어링 영역

교수님 말씀

  • 수학 공부도 운동과 비슷함, 수업에 그치지 않고 계속 찾아보고 공부하는 습관 들이면 필요한 것을 찾아서 사용하는데 용이함
  • 기초를 다 공부하고 머신러닝을 공부하는거보다, 어떤 원하는 것을 공부하기 위해 필요한 것들을 공부하는 것 추천




Today I Felt


부딪히며 배우기

오늘 마스터 클래스에서 임성빈 교수님께서 기초를 전부 공부하고 머신러닝을 공부하는 것보다 원하는 것을 공부하기 위해 필요한 것을 공부하는 자세를 추천하셨다. 이렇게 공부하면 목적이 있기 때문에 더 강한 의지로 공부할 수 있을 것 같아 더 와닿았다. 다른 말로는 부딪히면서 배우라는 말씀같다고 느꼈다. 부스트캠프를 하기 전에는 AI 공부에 대해 하고 싶었지만 선형대수도 모르고 영어도 부족하고 등등 다양한게 부족해서 공부할 수 없다는 핑계를 댔었다. 하지만 이제는 그냥 하고 싶으면 뛰어드는게 맞다는 생각이 든다.