728x90
  • 한빛미디어의 '나는 리뷰어다 2020' 에 선정되어 도서를 지원받아 작성한 글입니다.

  • 역사에는 큰 흐름과 그 사이사이의 세세한 흐름들이 존재한다. 흔히 '컴퓨터의 역사' 라는 키워드를 꺼내든다면 많은 사람들은 애니악으로 시작하는 컴퓨터 HW의 발전이나, 아르파넷으로 시작하는 인터넷, 혹은 최근의 딥러닝과 같은 기술적 발전을 많이 생각할 것이다.

  • 하지만 그러한 기술의 발전 뒤에는 수많은 사람들의 손길이 존재한다. 특히 우리 상상을 뛰어넘는 혁신을 생각해보면, 우리가 말도 안된다고 생각한 도전 덕분이었던 경우도 꽤나 많이 찾아볼 수 있다. '해커' 하면 여전히 좋은 인식과는 조금 거리가 있는 편이지만, 초창기 컴퓨터와 함께한 그들의 좌충우돌적인 도전이 있었기에 우리가 마주하고 있는, 혹은 보이지 않는 수많은 기술이 태어날 수 있는 기반이 되어줄 수 있었다고 볼 수 있다.

  • 1950년부터 1980년까지, 컴퓨터의 역사와 함께 해온 이 열정적인 해커들의 이야기는 위대한 위인들의 전기라기보다는 그저 새로운 것에 흥미가 넘치는 모험가들의 뒷이야기에 가까운 느낌을 준다. 그렇기에 상당한 분량을 자랑하는 책이지만(약 600페이지에 달한다.), 가끔 생각날 때마다 한 단락씩 떼어 가며 읽기 참 좋을 법한 내용이다.

  • 컴퓨터 관련 출판사 중 가장 짜임새 좋은 책을 만드는 회사 중 하나가 이 책을 담당한 오라일리(O'Reilly)라는 회사이다. 동물 표지로 대표되는 온갖 컴퓨터 관련 도서를 만드는데, 이번 도서도 00년대 절판된 책을 복각한 책으로 굉장히 가치있는 책을 잘 복원해 주었다고 생각한다. 굳이 뭔가 배우는게 아니라, 이런 역사 속 뒷이야기에 관심이 많은 이들에게 읽어보기를 추천하고 싶다.

aladin.kr/p/eeSd9

 

해커, 광기의 랩소디

해커, 광기의 랩소디

www.aladin.co.kr

 

 

728x90
728x90
Memory Transfer

Memory Transfer

  • 메모리에 데이터를 읽거나 쓸 때 필요한 버스(신호)
    • Address
    • Data
    • Control(Read, Write, etc...)
  • 데이터의 이동
    • DR << M[AR] : address + data + control(read)
      • DR : Data Register
      • AR : Address Register - 메모리의 AR 주소에 해당하는 데이터
    • M[AR] << R1 : address + data + control(write)
      • 1번 레지스터의 내용 전체를 AR주소로 Write
      • 레지스터는 일부만 접근할 수 없으므로 반드시 전체를 복사
  • 레지스터와 메모리의 차이
    • 레지스터는 항상 데이터가 출력중 : BUS와 Load 신호로 입-출력 조정
    • 메모리는 Control Signal을 통해 입-출력 조정

Arithmetic Microoperations

  • Add operation
    • R3 << R1 + R2
    • 덧셈 : 모든 산술연산의 기본 ex. 뺄셈 : R3 << R1 - R2 = R1 + (R2' + 1)
    • Full-Adder
      • A + B + Cin = S + Cout
      • 아랫 자리에서의 올림수 Cin이 입력에 추가되고, 윗 자리로의 올림수 Cout이 출력에 추가
      • Ripple Adder : 전가산기 다수를 연결 - 구조가 단순하지만, 자리수가 커질수록 연산이 느려짐
    • Binary adder-subtractor
      • M 신호가 0이면 adder, 1이면 subtractor로 동작
      • M이 1일 경우 XOR에 1 입력으로 인해 B의 숫자는 2의 보수로 출력되고, Carry in에 1이 들어가 감산기로 동작 (R3 << R1 - R2 = R1 + (R2' + 1))
    • Binary incrementer
      • 반가산기(Carry in이 없음)의 한쪽 값에 항상 1이 들어감

Logic Microoperations

  • 산술이 아닌 논리이므로 carry 없이 입력만으로 계산
    • 각 논리연산 (AND, OR, XOR, Not...)의 결과를 MUX로 출력 선택
    • n-bit unit : bit 개수만큼의 mux 연결

Shift Microoperation

  • Shift operation의 종류
    • Logical, shl/shr (0 채우기)
    • Circular, cil/cir (rotational shift)
    • Arithmetic shift, ashl/ashr
      • ex. signed two's complement number (MSB가 1이면 -, 0이면 +)
      • shift right : sign bit는 변하지 않고, 해당 자리를 제외한 MSB를 sign으로 채움
        • ( ex. 1000 >> 1100 , 0111 >> 0011)
      • shift left : LSB는 0으로 채워짐, 나머지는 왼쪽으로 shift
        • ( ex. 0111(7) > 1110(-2, overflow), 1011(-5) >> 0100(6) )
        • Overflow check : (MSB) XOR (MSB 바로 아래 bit) = 1이면 overflow
  • Shift circuit
    • S = 0 >> MUX의 0 input 출력 : A2 A1 A0 IR
    • S = 1 >> MUX의 1 input 출력 : IL A1 A2 A3
728x90
728x90
Fixed-Point Iteration

Fixed-Point Iteration

  • axba\leq x\leq b 안에 정의된 f(x)가 f(p)=0인 값이 있다고 할 때, p=g(p)인 함수를 설정

  • fixed point(고정점) : p[a,b]p\in [a,b]인 범위에서 g(p)=p인 [a,b] 범위 내의 함수 g가 있다고 할 때, g는 [a,b] 내에 고정점 p를 갖고 있다고 한다.

  • Bisectional Method를 통해 얻은 근사해 f(pn)=0f(p_n)=0을 구했을 때, 고정점으로 변환 시 pn+1=g(pn)p_{n+1}=g(p_n)으로 변환할 수 있다(iteration)

    • 이 n값을 무한으로 보내면 p=g(p)p=g(p)로 극한값을 구할 수 있다.
  • y=x와 y=g(x)의 교점이 없는 경우 고정점 p는 존재하지 않음

    • bisectional method : (근이 있다면) 반드시 수렴하나, 계산이 느림(횟수가 많음)
    • Fixed-point : 적절한 함수 g(x)를 찾아야 하나, 계산이 빠르다
  • [0,1][0,1]에서 g(x)=3xg(x) = 3^{-x}의 함수를 정의할 때, g(x)=3xlog3g'(x) = -3^{-x}log3이므로 g(x)는 [0, 1]의 범위에서 감소함을 알 수 있다.

    • 그렇기 때문에 함수 g(x)는 [0, 1]의 영역(x범위)에 [0, 1]의 치역(y범위)를 갖고, 그 범위 내에서 감소하기 때문에 fixed point를 갖게 됨을 알 수 있다.
  • 함수의 분포에 따라 범위 내에서 fixed point는 여러개일 수 있다.

    • 범위 [a, b] 내에서 [a, b] 범위로 연속하는 함수 g는, 미분값의 절대값이 1보다 작으면 유일한 fixed point를 갖게 된다.

    • [a, b] 범위의 x에서 g(x)<1|g'(x)| < 1를 만족하면 g의 fixed point는 하나만 존재한다.

    • 증명 : fixed point가 하나가 아닐 경우

      • pq=g(p)g(q)=g(ζ)pq|p-q|=|g(p)-g(q)|=|g'(\zeta)||p-q| ( 평균값 정리 )
        < |p-q| (위의 정의에 따라서) 이므로 모순

  • ex. f(x) = x-cosx = 0일 때

    • f(x)에서 x = cos(x) >> x가 fixed point
    • pn+1=cos(pn)p_{n+1}=cos(p_n)의 극한을 구할 때 수렴 확인 - 약 p=0.739일 때 p=cos(p)의 식을 만족
  • ex2. gC[a,b]g\in C[a,b]이고, 모든 x[a,b]x\in [a,b]에 대해 g(x)[a,b]g(x)\in [a,b]일 때, 함수 g가 고정점을 [a,b] 내에 갖는지?

    • C[a,b] : [a,b] 범위에서 연속인 함수의 집합 (continuous)

    • 입력 - 출력이 모두 [a,b]의 범위에 있는 함수 g를 의미

    • case 1. g(a) = a, g(b) = b >> 고정점이 반드시 존재

    • case 2. case 1이 아닌 경우

      • h(x)=g(x) - x로 정의하면, h(a)h(b) < 0 으로 IVP 성립 : g(c)-c=0으로 fixed point 존재한다.
  • ex3. x2x1x^2-x-1

    • case 1. x=x21x=x^2-1 : g(x)=x21g(x) = x^2-1
    • case 2. x2=x+1x=x+1x^2=x+1\rarr x=\sqrt{x+1} : g(x)=x+1g(x)=\sqrt{x+1}
    • case 2.를 이용한 풀이 :
      • x=0일 때 g(x) 값 계산
      • g(x) = x인 x1x_1값 계산
      • g(x1)g(x_1) 계산 후 과정 반복
      • 오차가 일정 이하가 되는 지점에서 해 계산

  • x2x1=0x^2-x-1=0
  • case 1. x2=x+1g(x)=x+1x^2 = x+1 \rarr g(x) = \sqrt{x+1}
    • x=0에서 반복 시작
      • g(0) 계산값을 g(0)=x로 대입
      • 계산된 x값을 다시 g(x)에 대입
      • 해당 과정을 일정 오차 이하기 될때까지 반복
      • 미분 계산 : g(x)=12x+1g'(x)=\frac{1}{2\sqrt{x+1}} - x가 -3/4보다 클 때 미분값은 항상 1보다 작게 되어 하나의 fixed point만 존재
  • case 2. x2=x+1g(x)=1+1/xx^2 = x+1 \rarr g(x) = 1+1/x
    • 미분 계산 : g(x)=1/x2g'(x)=-1/x^2이므로 x>1일 때 항상 g(x)<1|g'(x)|<1
    • 고정점 계산
      • p0=1p1=2p_0=1\rarr p_1 = 2
      • p1=2p2=1.5p_1=2\rarr p_2=1.5
      • p2=1.5p3=1.666...p_2 = 1.5\rarr p_3=1.666...
      • p3=1.666p4=1.6p_3=1.666\rarr p_4 = 1.6
      • 위 과정을 반복
  • Contraction Rate
    • 계산된 fixed point에서 g(x)의 미분값
    • Contraction Rate가 작을수록 빠르게 수렴 = 정확한 해에 더 빠르게 도달

  • x3+4x210x^3+4x^2-10을 fixed point form으로 변환시 가능한 변환 형태
    • x=xx34x2+10x=x-x^3-4x^2+10

    • x=10/x4xx=\sqrt{10/x-4x}

    • x=1210x3x=\frac{1}{2}\sqrt{10-x^3}

    • x=104+xx=\sqrt{\frac{10}{4+x}}

    • x=xx3+4x2103x2+8xx=x-\frac{x^3+4x^2-10}{3x^2+8x}

  • 1은 발산, 2는 허수가 되어 fixed point 게산 불가
  • 5번의 경우가 가장 빠르게 fixed point로 접근하나, 상식적으로 생각 가능한 경우는 아님

  • fixed point eq.의 수렴 증명
    • unique한 fixed point의 존재 조건에 의해 g(x)k<1|g'(x)|\leq k<1
    • 즉 n번째 fixed point에 대해 pnpkpn1p|p_n-p|\leq k|p_{n-1}-p|
      • 이 계산을 0번째 fixed point(초기값)까지 반복하면 pnpknp0p|p_n-p|\leq k^n|p_0-p|
    • k가 1보다 작기 때문에 반복(n)을 무한히 반복하면 오차 pnp|p_n-p|는 0으로 수렴
  • Corollary to the convergence result
    • n1n\geq1인 n에 대해 pn+1pn=g(pn)g(pn1)kpnpn1|p_{n+1}-p_n|=|g(p_n)-g(p_n-1)|\leq k|p_n-p_{n-1}|
      ...knp1p0...\leq k^n|p_1-p_0|
    • m>n1m>n\geq1일 때, pmpn=pmpm1+pm1pm2+...+pn+1pn|p_m-p_n|=|p_m-p_{m-1}+p_{m-1}-p_{m-2}+...+p_{n+1}-p_n|
      ...km1p1p0+km2p1p0+...+knp1p0...\leq k^{m-1}|p_1-p_0|+k^{m-2}|p_1-p_0|+...+k^n|p_1-p_0|
      ...kn(1+k+k2+...+kmn1)p1p0...\leq k^n(1+k+k^2+...+k^{m-n-1})|p_1-p_0|
    • m이 무한으로 갈 때 위 식이 무한등비수열의 합이므로, ppn=kn1kp1p0|p-p_n|=\frac{k^n}{1-k}|p_1-p_0|
    • ppn=kn1kp1p0ϵ\therefore |p-p_n|=\frac{k^n}{1-k}|p_1-p_0|\leq\epsilon의 식으로 반복 회수 계산 가능
728x90
728x90
Introduction

Introduction

  • 결정 트리는 여러분에게 어려운 결정을 남겨줍니다. 많은 잎을 갖는 깊은 트리는 각 예측이 적은 집의 데이터에서 온 데이터이기 때문에 오버피팅을 유발할 것입니다. 한편 적은 잎을 갖는 얕은 트리는 raw 데이터에서 많은 특성을 찾지 못해 좋지 못한 성능을 갖게 될 것입니다.

  • 비록 오늘날의 대부분의 모델링 기술이 오버피팅과 언더피팅 사이의 이러한 긴장을 마주하고 있지만, 많은 모델들은 더 나은 성능을 위한 좋은 아이디어를 갖고 있습니다. 우리는 이런 예시로 Random Forest를 알아볼 것입니다.

  • Random Forest는 많은 트리를 이용하여, 각 구성 트리의 예측을 평균하여 예측합니다. 보통 단일 결정 트리보다 더 나은 예측 정확도를 갖고 기본 파라미터로도 잘 동작합니다. 만약 여러분이 계속해서 모델링한다면, 여러분은 더 좋은 성능을 갖는 모델들에 대해 배우게 되겠지만, 대부분은 적절한 파라미터에 민감하게 반응합니다.

Example

  • 여러분은 이미 데이터를 불러오는 코드를 본 적이 있습니다. 데이터를 불러올 때, 우리는 다음과 같은 변수를 갖게 됩니다.
    • train_X
    • val_X
    • train_y
    • val_y
  • 우리는 scikit-learn에서 결정 트리를 만든 방식과 유사하게 랜덤 forest model을 만듭니다 - 이번에는 DecisionTreeRegressor 대신 RandomForestRegressor 클래스를 사용합니다.
from sklearn.metrics import mean_absolute_error forest_model = RandomForestRegressor(random_state=1) forest_model.fit(train_X, train_y) melb_preds = forest_model.predict(val_X) print(mean_absolute_error(val_y, melb_preds))
/opt/conda/lib/python3.6/site-packages/sklearn/ensemble/forest.py:245: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. "10 in version 0.20 to 100 in 0.22.", FutureWarning) 202888.18157951365

Conclustion

  • 더 개선의 여지가 있지만, 결정 트리의 오차값인 250000을 볼 때 매우 큰 개선이 이루어졌습니다. 우리가 단일 결정 트리의 최대 깊이를 바꾼 것과 같이 랜덤 포레스트의 성능을 여러분이 바꿀 수 있는 파라미터가 존재합니다. 하지만 이러한 튜닝 없이 일반적으로 하는 것이 랜덤 포레스트 모델의 가장 좋은 기능 중 하나라고 할 수 있습니다.
  • 여러분은 곧 튜닝과 적절한 파라미터값일 때 더 좋은 성능을 제공(하지만 파라미터 값을 위해 적당한 기술이 필요한)하는, XGBoost 모델에 대해 배울 것입니다.
728x90
728x90
Experimenting With Different Models
  • 이번 수업을 마치고 나면, 여러분은 언더피팅(underfitting)과 오버피팅(overfitting)의 개념에 대해 알고, 이러한 개념을 모델을 더 정확하게 만들기 위해 사용할 수 있을 것입니다.

Experimenting With Different Models

  • 이제 여러분은 모델의 정확도를 측정하는 적절한 방법을 갖고, 다른 모델과 비교하여 어떤 것이 제일 괜찮은 예측을 제공하는지 실험할 수 있습니다. 하지만 모델을 위한 대안은 어떻게 해야 할까요?

  • 여러분은 scikit-learn 문서에서 결정 트리 모델이 (여러분이 오랫동안 원하거나 필요로 하는 것 보다도 많은) 옵션을 제공하는 것을 볼 수 있습니다. 가장 중요한 옵션은 트리의 깊이를 결정하는 것입니다. 이 수업의 가장 첫 단원을 되돌아보면 트리의 깊이는 예측 이전에 얼마나 많은 분류가 이루어지는지에 대한 단위였습니다. 이것은 매우 얇은 트리입니다.

  • 실제로, 트리가 최상단(모든 집)에서 잎까지 10개의 분류를 갖는 것은 매우 흔하지 않은 일입니다. 이것이 깊어질수록, 데이터셋은 더 적은 집의 잎으로 나누어집니다. 만약 트리가 한 개의 분류만을 갖고 있다면, 그 트리는 데이터를 2개의 그룹으로 나눌 것입니다. 만약 한번 더 나누면, 우리는 4개의 집 그룹을 얻게 될 것입니다. 다시 나누면 8개의 그룹이 만들어질 것입니다. 만약 계속해서 그룹의 개수를 두배로 만들면서 각 단계마다 더 많은 분류를 추가한다면, 우리는 10단계에 이르렀을 때 2102^10개의 집의 그룹을 얻게 될 것입니다.

  • 우리가 집들을 매우 많은 잎으로 나누게 될 때, 우리는 각 잎에 매우 적은 집들이 남겨지게 됩니다. 매우 적은 집들을 갖는 잎은 실제 집값과 꽤나 가까운 예측을 하겠지만, 새로운 데이터에 대해서는 매우 적절하지 않은 예측을 하게 될 것입니다(각 예측은 매우 적은 집들에 기반하기 때문입니다).

  • 모델이 학습 데이터에 거의 정확하게 일치하게 되지만, 새로운 데이터나 검증 시에는 그렇지 못한 이 현상을 오버피팅이라고 부릅니다. 반면, 만약 트리가 매우 얕다면, 집들을 분명한 그룹으로 나누지 못할 것입니다.

  • 극단적으로, 만약 트리가 집들을 2~4개의 그룹으로 나눈다면, 각 그룹은 넓은 범위의 집을 갖게 될 것입니다. 예측 결과는 학습 데이터에도 불구하고, 대부분의 집에 대해 동떨어진 결과를 낼 것입니다(같은 이유로 검증 시에도 좋지 않은 결과가 나타날 것입니다). 모델이 중요한 특정이나 패턴을 데이터에서 찾지 못한다면, 학습 데이터일지라도 좋지 못한 성능을 나타낼 것입니다. 이를 언더피팅이라고 부릅니다.

  • 우리는 검증 데이터에서 예측하여야 하는 새로운 데이터에 대한 정확도에 집중하기 때문에, 우리는 언더피팅과 오버피팅 사이의 스위트 스팟을 찾아야 합니다. 시각적으로, 우리는 검증 커브(아래 붉은 색)의 최저점을 원하고 있습니다.

Example

  • 트리 깊이를 조절하기 위한 몇 가지 대안이 있고, 다른 경로보다 일부 경로가 더 깊은 깊이를 갖도록 하는 많은 방법이 있습니다. 하지만 max_leaf_nodes 매개변수는 매우 감각적으로 오버피팅과 언더피팅을 조절할 수 있도록 해줍니다. 모델에 더 많은 잎을 만들수록, 언더피팅 영역에서 오버피팅으로 이동하게 됩니다.
  • 우리는 max_leaf_nodes를 위한 다른 값들로부터 MAE 점수를 비교하기 위한 유틸리티 함수를 사용할 수 있습니다.
from sklearn.tree import DecisionTreeRegressor def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y): model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0) model.fit(train_X, train_y) preds_val = model.predict(val_X) mae = mean_absolute_error(val_y, preds_val) return(mae)
  • 이 데이타는 여러분이 본(그리고 이미 써본) 코드를 사용하여 train_X, val_X, train_y, val_y로 저장됩니다.
  • 우리는 for-루프를 이용하여 max_leaf_nodes에 따라 다른 값으로 만들어진 모델의 정확도를 비교해볼 수 있습니다.
# compare MAE with differing values of max_leaf_nodes for max_leaf_nodes in [5, 50, 500, 5000]: my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y) print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
Max leaf nodes: 5 Mean Absolute Error: 347380 Max leaf nodes: 50 Mean Absolute Error: 258171 Max leaf nodes: 500 Mean Absolute Error: 243495 Max leaf nodes: 5000 Mean Absolute Error: 254983
  • 목록의 옵션에 따르면, 500이 최적화된 잎의 개수임을 알 수 있습니다.

Conclusion

  • 결론적으로:모델은 다음과 같은 문제를 겼을 수 있습니다:
    • 오버피팅 : 앞으로 일어나지 않거나, 덜 정확한 예측으로 이끄는 가짜 패턴을 잡는 경우 혹은
    • 언더피팅 : 연관된 패턴을 잡는데 실패하여, 덜 정확한 예측으로 가는 경우
  • 우리는 모델 학습에 사용되지 않은, 검증 데이터를 사용하여, 후보 모델의 정확도를 측정합니다. 이를 통해 우리가 많은 후보 모델을 시도해보고 가장 좋은 하나를 선택할 수 있습니다.
728x90
728x90
Root finding problem

Root finding problem

  • f(x)=0f(x)=0의 식을 만족하는 함수 f에 대해 근(해)를 찾는 과정
    • 이 식을 함수 f의 영점(zero) 라고 함.

Bisectional Method

  • 중간값 정리(Intermediate Value Theorem, IVT)
    • 함수 f(x)가 [a, b] 범위 내에 정의 (f는 연속)
    • f(a)f(b)<0f(a)f(b) < 0이면 그 범위 내에 f(p)=0f(p)=0인 p가 존재
  • bisectional method
    • a1=a,b1=ba_1=a, b_1=b로 정의, a-b 사이의 중간점 p를 이용
    • p1=a1+b12p_1 = \frac{a_1+b_1}{2}
    • f(a1)f(p1),f(p1)f(b1)f(a_1)f(p_1), f(p_1)f(b_1) 종 IVP를 만족하는 구간에 대해 위 과정을 반복
    • 오차가 일정 이하가 될 때 해당 값을 근으로 설정
  • 오차
    • 절대오차(absolute error) : pNpN1<ϵp_N - p_{N-1} < \epsilon
    • 상대오차(reletive error) : pNpN1/pN<ϵ|p_N - p_{N-1}|/|p_N| < \epsilon
  • Bisection method의 convergence rate
    • 수렴의 빠르기
    • pnpba2n|p_n-p|\leq\frac{b-a}{2^n}
    • \therefore bisection method는 O(12n)O(\frac{1}{2^n})의 빠르기로 수렴
    • Error bound : Convergence rate를 이용한 반복 회수 예측
      • pNp2N(ba)<ϵ=10m|p_N-p|\leq2^{-N}(b-a)<\epsilon=10^{-m}
      • Nlog2<mN>mlog2-Nlog2<-m\rarr N>\frac{m}{log2}
728x90
728x90
What is Model Validation
  • 우리는 모델을 만들었습니다. 하지만 그게 얼마나 좋은 걸까요?

  • 이번 수업에서는, 여러분은 여러분의 모델의 질을 측정하기 위한 모델 검증(model validation)을 사용하는 법을 배울 것입니다. 모델의 질을 측정하는 것은 여러분의 모델을 반복해서 향상시키기 위한 핵심입니다.

What is Model Validation

  • 여러분은 여러분이 만드는 거의 모든 모델의 가치를 평가하고 싶을 것입니다. 대부분의(비록 모든 것은 아니지만) 어플리케이션의 경우, 모델의 질에 대한 적절한 측정 방법은 예측의 정확도입니다. 다시 말해, 모델의 예측이 실제로 일어나는 것과 유사한가를 보는 것입니다.

  • 많은 사람들은 정확도 예측에 있어 큰 실수를 하곤 합니다. 그들은 그들의 학습 데이터를 이용해 예측을 한 뒤 학습 데이터의 목표값과 비교합니다. 이러한 접근법에 대한 문제점과 해결법은 잠시 후 알게 되겠지만, 먼저 어떻게 해야 할 지에 대해 알아보도록 합시다.

  • 여러분은 먼저 이해할 수 있는 방식으로 모델의 질을 요약할 필요가있습니다. 만약 10000가구에 대한 예측과 실제 집값을 비교한다고 할 때, 여러분은 아마 좋거나 나쁜 예측의 혼합을 보게 될 것입니다. 10000개의 예측과 실제 값을 보는 것에는 핵심을 볼 수 없습니다. 우리는 이것을 하나의 계측값으로 요약할 필요가 있습니다.

  • 모델의 질을 요약하기 위한 많은 계측법이 있지만, 우리는 Mean Absolute Error(평균 절대 오차 - MAE라고도 불리는) 것으로 시작해볼 것입니다. 마지막 단어인, 오차로부터 시작해봅시다.

  • 각 집값의 예측되는 오차는 :

error=actual−predicted
  • 그래서, 만약 집값이 $150000이고, 여러분이 예측이 $100000이라면 오차는 $50000이 됩니다.

  • MAE 계량을 통해, 우리는 각 오차의 절대값을 얻을 수 있습니다. 이 방법은 각 오차를 양수로 변환해줍니다. 우리는 그 뒷 각 오차의 평균값을 계산합니다. 이 방법이 모델의 질을 측정하기 위한 우리의 계량법입니다. 순수하게 영어로 표현하면,

On average, our predictions are off by about X.

  • MAE를 계산하기 위해서는, 먼저 모델이 필요합니다.(코드 중략) 일단 모델을 생성하고 나면, 평균절대오차를 계산하는 방법은 다음과 같습니다.
from sklearn.metrics import mean_absolute_error predicted_home_prices = melbourne_model.predict(X) mean_absolute_error(y, predicted_home_prices)
434.71594577146544

The Problem with "In-Sample" Scores

  • 우리가 계산한 측정값은 표본 내 성적("In-Sample" Scores)이라고 부를 수 있습니다. 우리는 모델을 구축하고 평가하기 위해 집들에 대한 하나의 "샘플"을 사용했습니다. 이게 왜 좋지 않은가에 대해 알아봅시다.

  • 생각해봅시다, 거대한 부동산 시장에서, 문 색깔은 집값과 그다지 연관이 없습니다.

  • 하지만, 여러분이 모델을 만들때 쓴 샘플에서, 녹색의 문을 갖는 모든 집들은 매우 비싼 것으로 나타났습니다. 이 모델의 역할은 집값을 예측하기 위해 패턴을 찾는 것이고, 그래서 이러한 패턴을 찾아내어, 녹색의 집이 매우 비쌀 것이라는 예측을 할 것입니다.

  • 이러한 패턴이 학습 데이터에서 나타났기 때문에, 학습 데이터에서 이 모델은 정확할 것으로 나타날 것입니다.

  • 하지만 모델이 새 데이터를 볼 때 이러한 패턴이 잡히지 않는다면, 이 모델은 연습때보다 매우 부정확할 것입니다.

  • 모델의 실험값은 새 데이터에 대한 예측에서 오기 때문에, 우리는 모델을 만들 때 쓰이지 않은 데이터를 성능 측정에 사용합니다. 이를 위한 가장 직접적인 방법은 모델 제작 시 일부 데이터를 제외하고, 이전에 보이지 않은 데이터를 정확도 측정 테스트에 사용하는 것입니다. 이 데이터를 검증 데이터(Validation data)라고 부릅니다.

Coding It

  • scikit-learn 라이브러리는 데이터를 둘로 나누기 위해 train_test_split이라는 함수를 갖고 있습니다. 우리는 이 데이터중 일부를 모델 피팅을 위한 학습 데이터로 사용하고, 나머지 데이터를 mean_absolute_error를 계산하기 위한 검증 데이터로 사용할 것입니다.

  • 코드는 다음과 같습니다:

from sklearn.model_selection import train_test_split # split data into training and validation data, for both features and target # The split is based on a random number generator. Supplying a numeric value to # the random_state argument guarantees we get the same split every time we # run this script. train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0) # Define model melbourne_model = DecisionTreeRegressor() # Fit model melbourne_model.fit(train_X, train_y) # get predicted prices on validation data val_predictions = melbourne_model.predict(val_X) print(mean_absolute_error(val_y, val_predictions))
260991.8108457069
728x90
728x90
Selecting Data for Modeling

Selecting Data for Modeling

  • 여러분의 데이터셋의 변수는 머릿속으로만 생각하거나, 멋지게 출력하기에는 너무 많이 있습니다. 어떻게 이해하기에 과도한 양의 데이터를 줄일 수 있을까요?
  • 우리의 직관을 이용하여 몇 가지 변수를 고르는 것으로 시작해봅시다. 나중의 수업에서는 변수의 우선 순위를 자동으로 매기는 통계학적 기술에 대해 알아볼 것입니다.
  • 변수/열을 선택하기 위해, 우리는 데이터셋의 모든 열을 볼 필요가 있습니다. DataFrame의 Column 특성을 통해 알 수 있습니다(아래에 코드가 있습니다.)
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv' melbourne_data = pd.read_csv(melbourne_file_path) melbourne_data.columns
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG', 'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car', 'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude', 'Longtitude', 'Regionname', 'Propertycount'], dtype='object')
# The Melbourne data has some missing values (some houses for which some variables weren't recorded.) # We'll learn to handle missing values in a later tutorial. # Your Iowa data doesn't have missing values in the columns you use. # So we will take the simplest option for now, and drop houses from our data. # Don't worry about this much for now, though the code is: # dropna drops missing values (think of na as "not available") melbourne_data = melbourne_data.dropna(axis=0)
  • 데이터의 하위 집합(subset)을 선택하기 위한 여러 가지 방법이 있습니다. Pandas Micro-course는 이런 것들을 더 깊이 다루지만, 우리는 두 가지 접근법에 집중해볼 것입니다.
  1. "예측 타겟"을 선택하는, Dot notation
  2. "특징"을 선택하는, Column list 선택

Selecting The Prediction Target

  • 여러분은 dot-notation으로 변수를 추출할 수 있습니다. 이 하나의 열은 일럴로 저장되며, 1개 열을 갖는 DataFrame과 유사합니다.
  • 우리는 Prediction target이라고 하는, 예측하고자 하는 열을 선택할 때 dot notation을 사용할 것입니다. 편의를 위해, prediction target은 y라고 부릅니다. 그렇기 때문에 멜버른의 데이타에서 집값을 저장하기 위한 코드는 다음과 같습니다.
y = melbourne_data.Price

Choosing "Features"

  • 우리의 모델(나중에는 예측에 사용될)에 입력된 열은 "특성(features)"라고 불립니다. 이 경우, 집값을 판단하기 위해 사용되는 열이 될 것입니다. 때때로, 여러분은 타겟을 제외한 모든 열을 특성으로 활용할 것입니다. 다른 경우 더 적은 특성을 이용하는 것이 더 나을 것입니다.
  • 이번에는, 우리는 몇 가지 특성을 이용하여 모델을 구성할 것입니다. 나중에 어떻게 다른 특성을 갖는 모델을 순회하고 비교하는지에 대해 배우게 될 것입니다.
  • 우리는 브래킷 내에 제공되어 있는 열 이름을 특성으로 선택합니다. 이 리스트 내의 각 아이템은 문자열로 되어 있습니다.
  • 예시는 다음과 같습니다:
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
  • 편의를 위해, 이 데이터를 X라고 부릅니다.
X = melbourne_data[melbourne_features]
  • 가장 위의 몇 개의 열을 보여주는 describe 메소드와 head 메소드를 이용해서 집값을 예측하기 위해 데이터를 빠르게 확인해봅시다.
X.describe() X.head()
  • 이 명령어로 시각적으로 데이터를 확인하는 것은 데이터 사이언티스트들의 중요한 업무 중 일부입니다. 여러분은 더 많은 직관을 제공하는 데이터셋에 종종 놀라게 될 것입니다.

Building Your Model

  • 여러분은 모델을 만들기 위해 scikit-learn 라이브러리를 사용하게 될 것입니다. 코딩할 때, 샘플 코드에서 볼 수 있듯 종종 sklearn라고도 쓰입니다. Scikit-learn은 보통 Dataframe에 저장된 데이터들을 모델링하는데 가장 유명한 라이브러리입니다.
  • 모델을 구성하고 사용하는 단계는 다음과 같습니다:
    • 정의 : 어떠한 모델이 될 것인가? 결정 트리? 다른 형태의 모델인지? 모델 타입의 다른 몇몇 파라미터들 역시 명시되어야 합니다.
    • 피팅 : 제공된 데이터에서 패턴을 확인합니다. 이것이 모델링의 핵심입니다.
    • 예측 : 말 그대로의 의미입니다.
    • 가치 판단 : 얼마나 모델이 정확한지 판단합니다.
  • 여기 scikit-learn을 이용한 결정 트리 모델과 특성과 타겟 변수를 이용한 예시가 있습니다.
# Define model. Specify a number for random_state to ensure same results each run melbourne_model = DecisionTreeRegressor(random_state=1)
# Fit model melbourne_model.fit(X, y) DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=1, splitter='best')
  • 많은 머신 러닝 모델들은 모델 학습에 임의성을 이용합니다. random_state로 숫자를 명시하는 것은 여러분이 각 단계마다 같은 결과를 얻도록 합니다. 이는 좋은 시도일 수 있습니다. 어떠한 숫자를 사용하면, 모델의 질은 어떠한 값을 고르더라도 의미 있게 관련되지는 않을 것입니다.
  • 우리는 이제 결정을 할 수 있는 피팅된 모델을 갖고 있습니다.
  • 실제로, 여러분은 우리가 가격을 이미 알고 있는 집보다는 시장에 나타나는 새로운 집에 대해 결정을 내리고자 할 것입니다.하지만 우리는 얼마나 예측 함수가 잘 동작하는지 보기 위해 처음의 몇 개 열에 대해 결정을 내릴 것입니다.
print("Making predictions for the following 5 houses:") print(X.head()) print("The predictions are") print(melbourne_model.predict(X.head()))
Making predictions for the following 5 houses: Rooms Bathroom Landsize Lattitude Longtitude 1 2 1.0 156.0 -37.8079 144.9934 2 3 2.0 134.0 -37.8093 144.9944 4 4 1.0 120.0 -37.8072 144.9941 6 3 2.0 245.0 -37.8024 144.9993 7 2 1.0 256.0 -37.8060 144.9954 The predictions are [1035000. 1465000. 1600000. 1876000. 1636000.]
728x90
728x90
Using Pandas to Get Familiar With Your Data

Using Pandas to Get Familiar With Your Data

  • 어떠한 머신 러닝 프로젝트를 위한 첫 단계는 데이터에 친숙해지는 것입니다. 이를 위해 Pandas 라이브러리를 사용할 것입니다. Pandas는 데이터를 분석하고 조작하기 위해 데이터 사이언티스트들이 사용하는 주된 도구입니다. 대부분의 사람들이 그들의 코드에서 Pandas를 pd.로 줄여 씁니다. 우리는 다음 명령어를 사용합니다.
import pandas as pd
  • Pandas 라이브러리의 가장 중요한 부분은 DataFrame입니다. 데이터프레임은 여러분이 표로 생각하는 데이터를 다룹니다. 이는 엑셀의 시트나, SQL 데이터베이스의 표와 유사합니다.
  • 판다스는 이러한 종류의 데이터를 다루고자 할 때 강력한 도구가 됩니다.
  • 예를 들어, 우리는 오스트레일리아 멜버른의 집값 데이터를 보고자 합니다. 이번 예시에서, 여러분은 아이오와의 집값을 이용하여 새로운 데이터셋에 같은 절치를 진행하게 될 것입니다.
  • (멜버른의) 예시 데이터는 ../input/melbourne-housing-snapshot/melb_data.csv에 존재합니다.
  • 우리는 데이터를 불러온 후 다음 명령어로 분석합니다.
# save filepath to variable for easier access melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv' # read the data and store data in DataFrame titled melbourne_data melbourne_data = pd.read_csv(melbourne_file_path) # print a summary of the data in Melbourne data melbourne_data.describe()

Interpreting Data Description

  • 원래의 데이터셋에서 각 열은 8개의 숫자를 보여줍니다. 첫 번째, Cound는 얼마나 많은 행이 non-missing values를 갖는지 보여줍니다.
  • Missing Value는 여러 가지 이유로 발생합니다. 예를 들면, 2번째 침실의 크기는 침실이 1개뿐인 집을 조사할 때는 수집되지 않습니다. missing data에 대한 주제는 곧 다시 알아볼 것입니다.
  • 두번째 값은 평균입니다. 여기서, std는 표준편차를 의미하며, 수치적으로 값들이 얼마나 분포했는지를 나타냅니다.
  • min, 25%, 50%, 75%, 그리고 max값이 의미하는 것은, 각 열을 최저에서 최고값으로 분류하는 것을 생각해보면 됩니다. 첫 번째(최소) 값이 min입니다. 만약 리스트에서 1/4만큼 진행하면 값들 중 25%보다 크고 75%보다 작은 값을 보면 됩니다. 이 값을 25% 값이라고 하며, 50, 75퍼센트 값은 이와 같이 정의되며, max는 가장 큰 값이 됩니다.
728x90
728x90
Introduction

Introduction

  • 어떻게 머신러닝 모델이 동작하고 어떤 방식으로 사용되는지에 대해 간략히 알아봅시다. 아마도 통계적 모델링 혹은 이전의 머신 러닝에서 진행하였기 때문에 기본적인 문제로 보일 수도 있습니다. 걱정하지 마세요, 우리는 곧 강력한 모델을 만들 것입니다.
  • 이 짧은 코스는 여러분이 다음과 같은 시나리오로 모델을 만들도록 할 것입니다:
  • 당신의 사촌이 부동산에 투자하여 수백만 달러를 벌어들였습니다. 그는 당신이 데이터 사이언스에 관심이 있었기에 같이 비즈니스 파트너가 될 것을 제안했습니다. 그는 자금을 공급하여 줄 것입니다. 그리고 당신은 어떤 주택이 가치가 있는지에 대해 예측하는 모델을 공급할 것입니다.
  • 당신은 사촌에게 어떻게 그가 과거에 부동산 가치를 예측했는지에 대해 질문하고, 그는 단순히 직감이라고 답합니다. 하지만 더 많은 질문이 그가 과거에 보아 왔던 집들에서 가격 패턴을 인식하는 방식을 드러냈고, 그는 이러한 패턴을 그가 고려중인 새 집에 대한 예측에 사용하고 있습니다.
  • 머신 러닝은 이와 같은 방식으로 동작합니다. 우리는 결정 트리(Deceision Tree)라 불리는 모델로 시작하게 될 것입니다. 더 정확한 예측을 제공하는 더 많은 모델이 있습니다. 하지만 결정 트리는 이해하기 쉽고, 데이터 사이언스의 최적화된 모델을 설정하기 위한 초석이라고 할 수 있습니다.
  • 단순화를 위해, 우리는 가장 단순한 결정 트리로 시작하겠습니다.
  • 이는 집을 오직 두 카테고리로 나눕니다. 어떠한 집의 판단 하에 예측된 가격은 동일 카테고리에 속하는 집들의 평균가입니다.
  • 우리는 데이터를 두 그룹으로 나누는 결정에 데이터를 사용하고, 다시 각 그룹의 예상 가격을 결정합니다. 데이터에서 패턴을 찾는 이 단계를 모델의 **피팅(fitting)**과 **학습(training)**이라고 합니다. 모델을 피팅하는데 사용된 데이터를 **학습 데이터(training data)**라고 부릅니다.
  • 어떻게 모델이 피팅되는가(예를 들어, 어떻게 데이터를 분류하는지)에 대한 자세한 내용은 복잡한 문제인 만큼 나중을 위해 남겨두도록 합시다. 모델이 피팅된 후, 당신은 새로운 데이터를 다른 집의 가격을 예측하기 위해 적용할 수 있습니다.

Improving the Decision Tree

  • 다음 두 결정 트리 중 어느것이 부동산의 학습 데이터를 피팅한 결과에 더 적합하다고 할 수 있을까요?
  • 왼쪽(Deceision Tree 1)의 결정 트리가 아마 더 적합할 것입니다. 왜냐하면 침실이 더 많은 집이 더 적은 집보다 더 비싼 가격에 팔리는 현실을 반영하기 때문입니다. 이 모델의 가장 큰 단점은 욕실의 개수, 토지의 크기, 장소 등과 같은 집값에 영향을 주는 대부분의 요인은 반영하지 못한다는 점입니다.
  • 여러분은 더 많은 '분류'를 갖는 트리를 이용하여 많은 요인을 반영할 수 있습니다. 이런 것들을 "깊은" 트리라고 부릅니다. 각 집의 토지 크기도 고려하는 결정 트리는 아마 이렇게 생겼을 것입니다.
  • 여러분은 이 결정 트리를 따라서, 집의 특성에 맞는 경로를 선택함에 따라 어떤 집의 가격을 예측합니다. 집의 예측된 가격은 트리의 맨 밑에 존재하게 됩니다. 우리가 결정을 내리는 맨 밑의 지점을 **잎(leaf)**라고 부릅니다.
  • 잎에서의 분류와 값은 데이터에 의해 결정됩니다. 이제 여러분이 작업할 데이터를 확인해 볼 시간입니다.
728x90

+ Recent posts