1. 개요

2. 준비 사항

2.1 관련 자료 확보

  • Google Class에 공유해 둔 수업 “003-선형회귀”에서 watcha-linear-regression.zip을 다운로드 watcha

2.2 실습영상 참조

  • Google Class에 공유한 실습영상.mov를 통해 실습을 진행

    구글 클래스에서 관련 자료 다운로드는 [해당 파일 클릭] > [우측 상단의 “…“클릭] > [새 창에서 열기] 후 다운로드 수행이 필요

  • 파일 다운로드 방법 참고

    watcha

3. 스크립트 내용 해설

  • 실습한 스크립트 내용에 대한 이해를 위해 스크립트 구간 별 간단한 설명을 추가함

3.1 필요 라이브러리 설정

  • 본 실습을 위해 필요 라이브러리를 설정하는 스크립트

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    3.2 학습 데이터 가져오기

  • 예측 알고리즘을 위한 학습용 데이터를 가져오기

    df = pd.read_csv("./watcha.csv") #df는 data frame의 준말로 변수의 이름임 
    df # 이것은 데이터를 화면에 뿌려 보기 위한 스크립트 
    
  • df의 shape을 통해 몇 by 몇의 행렬인지 확인해 봄

    df.shape
    

3.3 df 데이터에서 x값만 추출하기

  • df는 키:값 형태로 데이터를 저장하고 있는데 “X”라는 키를 통해 해당 키에 관련된 데이터를 추출
  • 추출된 데이터는 차후 연산을 위해 4x1 행렬로 reshape 함
    raw_X = df["X"].values.reshape(-1,1)
    raw_X.shape, raw_X
    

3.4 df 데이터에서 y값만 추출하기

  • “Y” 키값을 통해 관련된 데이터를 추출
    y = df["Y"].values
    y.shape, y
    

    3.5 학습 데이터 그래프 출력하기

  • matplotlib를 통해 추출된 학습 데이터 X값과 Y값으로 그래프 출력
    plt.figure(figsize=(10,5))
    plt.plot(raw_X,y, 'x', alpha=0.5)
    

3.6 X 매트릭스 구조 변경

  • X값을 전부 1로만 되어 있는 매트릭스와 결합하여 2행4열의 매트릭스로 구조를 변경함
    X = np.concatenate( (np.ones((len(raw_X),1)), raw_X ), axis=1)
    X[:5]
    

3.7 초기 선형 함수 도출

  • 지금까지 x값과 y값을 토대로 y = w1*x + w0 형태의 선형함수를 도출
  • 도출된 선형 함수를 그래프로 표출하여 실제 학습값과의 차이를 확인 함

    w = np.random.normal((2,1)) #임의의 w1, w0 값 할당 
    w.shape, w #값을 표출하여 할당된 값 확인
      
    y_predict = np.dot(X,w) #w1*x + w0 연산 수행 
    y_predict.shape, y_predict
      
    # 연산된 값을 그래프로 표출 
    plt.figure(figsize=(10,5)) 
    plt.plot(raw_X,y,"o", alpha=0.5)
    plt.plot(raw_X,y_predict)
    plt.show()
    

    4. 가설함수 작성

  • 비용함수를 통해 수정된 w1,w0값으로 w1*x + w0 함수를 다시 도출하는 역할 수행
    #함수 정의 
    def hypothesis_function(X, theta):
        return X.dot(theta)#함수 연산
    h = hypothesis_function(X, w)
    

5. 비용함수 작성

  • 실제 y값과 가설함수 w1*x + w0의 결과값 사이의 차이를 확인하는 함수 작성
    def cost_function(h, y):
        return (1/(2*len(y))) * np.sum((h-y)**2)
    c = cost_function(h, y)
    

6. 경사하강법 작성

  • 실제 y값과 가설함수 w1*x + w0의 결과값 사이의 차이를 최소화할 수 있는 w1과 w0값을 찾는 방법중에 하나인 경사하강법을 작성함
    def gradient_descent(X, y, w, alpha, iterations):
      theta = w
      m = len(y)
        
      theta_list = [theta.tolist()]
      cost = cost_function(hypothesis_function(X, theta), y)
      cost_list = [cost]
    
      for i in range(iterations):
          t0 = theta[0] - (alpha / m) * np.sum(np.dot(X, theta) - y)
          t1 = theta[1] - (alpha / m) * np.sum((np.dot(X, theta) - y) * X[:,1])
          theta = np.array([t0, t1])
            
          if i % 100== 0:
              theta_list.append(theta.tolist())
              cost = cost_function(hypothesis_function(X, theta), y)
              cost_list.append(cost)
    
    
      return theta, theta_list, cost_list
    

7. 학습 수행

  • 지금까지 도출된 학습데이터, 가설함수, 비용함수, 경사하강법을 이용하여 학습 수행
  • 학습은 iterations 값을 통해 반복할 횟수를 결정
  • alpha값을 통해 learning rate 즉, w1*x + w0 에서 w1과 w0간의 변화 수준을 얼마나 가져갈지 정함
    iterations = 100000
    alpha = 0.0000000001
    
    theta, theta_list, cost_list = gradient_descent(X, y, w, alpha, iterations)
    cost = cost_function(hypothesis_function(X, theta), y)
    
    print("theta:", theta)
    print('cost:', cost_function(hypothesis_function(X, theta), y))
    

    8. 예측 수행

  • 학습을 통해 도출된 w1*x + w0 함수를 통해 최종적으로 왓차에서 영화 ‘옥자’의 보고싶어요 값인 12,078명의 값을 통해 총 관객수를 예측함
    test_x = np.array([1, 12078])
    h = hypothesis_function(test_x, theta)
    h #약 768.097 도출
    
  • 뉴스에서 예측한 727만명과 유사한 768만명의 예측값을 도출함

카테고리:

업데이트:

댓글남기기