Lab-Normalequation Copyright 2018 by teamlab.gachon@gmail.com Introduction [PDF 파일다운로드 ]() 이번랩은우리가강의를통해들은 Normal equation을활용하여 LinearRegression 모듈을구현하는것을목표로한다. LinearRegression 모듈의구현을위해서는 numpy와 Python OOP의기본적인개념이해가필요하다. 혹시해당개념들이조금헷갈린다면다시복습을하고올것을추천한다. 이번랩을통해 scikitlearn이나 tensorflow 같은머신러닝라이브러리들이어떻게구성되는지조금이라도알게되면좋겠다. backend.ai 설치 숙제를제출하기앞서, 레블업의 backend.ai 를여러분의파이썬에설치하셔야합니다. 설치하는과정은매우 쉽습니다. 아래처럼터미널또는 cmd 창에서입력을하시면됩니다. pip install backend.ai-client 숙제 파일 (lab_normal_equation.zip) 다운로드 먼저해야할일은숙제파일을다운로드받는것입니다. 아래링크를다운로드하거나 Chrome 또는익스플 로러와같은웹브라우저주소창에아래주소를입력합니다. 링크 2_lab_bulid_matrix.zip https://s3.ap-northeast-2.amazonaws.com/teamlabgachon/mooc_pic/lab_normal_equation.zip 또는 Mac OS 에서는아래명령을쓰셔도됩니다. wget https://s3.ap-northeast-2.amazonaws.com/teamlab-gachon/mooc_pic/lab_normal
다운로드된 lab_normal_equation.zip 파일을작업폴더로이동한후압축해제후작업하시길바랍니다. 압축해제하면폴더가 linux_mac 과 windows 로나눠져있습니다. 자신의 OS에맞는폴더로이동해서코드를수정해주시기바랍니다. linear_model.py 코드 구조 본 Lab 은 LinearRegression 모듈을만들기위해 linear_model.py 라는 template 파일을제공합니다. 제공하는 template 파일은아래와같은구조를가지며각변수와함수의역할은아래테이블과같습니다. 이름종류개요 fit function Linear regression 모델을적합한다. Matrix X 와 Vector Y 가입력 값으로들어오면 Normal equation 을활용하여, weight 값을찾는다. predict function 적합된 Linear regression 모델을사용하여입력된 Matrix X 의예측 값을반환한다. 이때, 입력된 Matrix X 는별도의전처리가없는상태 로입력되는걸로가정한다. coef property normal equation 의결과생성된계수 (theta, weight) 값들을 numpy array 로저장한다. intercept property normal equation 의결과생성된절편 (theta_0, weight_0) 값을 scalar 로저장한다. import numpy as np class LinearRegression(object): def init (self, fit_intercept=true, copy_x=true): self.fit_intercept = fit_intercept self.copy_x = copy_x self._coef = None self._intercept = None self._new_x = None def fit(self, X, y): pass def predict(self, X): pass @property def coef(self): return self._coef
@property def intercept(self): return self._intercept Mission 이번랩부터는제출에의해서컴퓨터가직접채점을하는 auto-grading 문제와수강자가스스로문제를점검하는 self-grading 문제로나눠서진행된다. 본랩에서는 auto-grading 문제는 linear_model.py 의 LinearRegression class를수정하는것이고, self-grading 문제는스스로 ipynb 파일을만들어서제시된문제들을실제수행하는것이다. fit 함수 만들기 fit 함수는 Linear regression 모델을적합하는함수이다. 본함수는 Matrix X와 Vector Y가입력값으로들어오면 Normal equation을활용하여, weight값을찾는다. 이때, fit_intercept 설정에따라다른방시으로적합이실행이달라진다. 또한 fit을할때는입력되는 X의값은반드시새로운변수 (self._new_x) 에저장한후실행되어야한다. fit_intercept 가 True 일경우 : Matrix X 의 0 번째 Column 에값이 1 인 column vector 를추가한다. 단 fit_intercept 가 False 일경우의 Matrix X 의변수는 2 개이상일것이라고가정한다. fit 을할때는아래의 Normal equation 의공식을활용한다. 적합이종료된후각변수의계수 (coefficient 또는 weight값을의미 ) 는 self._coef와 self._intercept_coef 에저장된다. 이때 self._coef는 numpy array을각변수항의 weight값을저장한 1차원 vector이며, self._intercept_coef는상수항의 weight를저장한 scalar(float) 이다. 입력되는 parameter와리턴은아래정보를참고한다. Parameters ---------- X : numpy array, 2 차원 matrix 형태로 [n_samples,n_features] 구조를가진다 y : numpy array, 1 차원 vector 형태로 [n_targets] 의구조를가진다. Returns ------- self : 현재의인스턴스가리턴된다 predict 함수 만들기
적합된 Linear regression 모델을사용하여입력된 Matrix X 의예측값을반환한다. 이때, 입력된 Matrix X 는별도의전처리가없는상태로입력되는걸로가정한다. fit_intercept 가 True 일경우 : Matrix X 의 0 번째 Column 에값이 1 인 column vector 를추가한다. predict 함수는다음수식을사용한다. 입력되는 parameter 와리턴은아래정보를참고한다. Parameters ---------- X : numpy array, 2 차원 matrix 형태로 [n_samples,n_features] 구조를가진다 Returns ------- y : numpy array, 예측된값을 1 차원 vector 형태로 [n_predicted_targets] 의구조를가진다. 구현 모듈 테스트하기 여러분이만들모듈이잘작동하는지테스트하기위해서이제 ipynb 파일을만들어쥬피터노트북에서실행 해보겠습니다. 모듈 호출하기 먼저우리가사용할모듈을호출한다. 기본적으로 pandas 와 numpy 를호출한다. linear_model 모듈을 호출하기위해서는 import linear_model 명령을사용한다. 단여기서 linear_model.py 파일이자주 바꾸니 imp 모듈을활용하여, 파일이바뀌고다시저장될때 reload 할수있도록하여야한다. import pandas as pd import numpy as np import linear_model import imp imp.reload(linear_model) 데이터 불러하기 첫번째데이터는 one variable 의형태를 test.py 파일이다. 파일을 pandas 로호출하면아래와같은구조 를확인할수있다.
df = pd.read_csv("./test.csv") df.head() x y 0 77 79.775152 1 21 23.177279 2 22 25.609262 3 20 17.857388 4 36 41.849864 numpydata 구성하기 pandas 로부터필요한데이터를구성한다. X = df["x"].values.reshape(-1,1) y = df["y"].values Model 생성하기 LinearRegression 클래스를사용해서모델을생성한다. lr = linear_model.linearregression(fit_intercept=true) lr.fit(x, y) lr.intercept # -0.46181077366099998 lr.coef # array([ 1.01433536]) lr.predict(x)[:10] array([ 77.64201157, 20.83923168, 21.85356704, 19.82489633, 36.05426201, 14.75321955, 62.42698124, 95.90004796, 19.82489633, 4.609866 ]) ModelValidation
구현한 LinearRegression 클래스와 scikit-learn 의 linear regression 클래스로만든결과물을비교한다. from sklearn import linear_model sk_lr = linear_model.linearregression(normalize=false) sk_lr.fit(x, y) sk_lr.intercept_ # -0.46181077366117762 sk_lr.coef_ # array([ 1.01433536]) np.isclose(lr.coef, sk_lr.coef_) #True df_test = pd.read_csv("./train.csv") df_test.head() X_test = df["x"].values.reshape(-1,1) lr.predict(x_test)[:5] # array([ 23.88223775, 50.25495698, 14.75321955, 38.082932 lr.predict(x_test)[:5] # array([ 23.88223775, 50.25495698, 14.75321955, 38.082932 Multiplevariable 동일한과정으로다변수일경우에도작동할수있는지확인한다. df = pd.read_csv("./mlr09.csv") df.head() height_in_feet weight_in_pounds successful_field_goals percent_o 0 6.8 225 0.442 0.672 1 6.3 180 0.435 0.797 2 6.4 190 0.456 0.761 3 6.2 180 0.416 0.651 4 6.9 205 0.449 0.900 y = df["average_points_scored"].values X = df.iloc[:,:-1].values mu_x = np.mean(x, axis=0) std_x = np.std(x, axis=0)
rescaled_x = (X - mu_x) / std_x # RESCALED Fitting 실행하기 lr.fit(rescaled_x, y) lr.coef # array([-1.67779283, 0.28359762, 2.68586629, 1.12816882]) lr.intercept # 11.790740740740738 sk_lr.fit(rescaled_x, y) sk_lr.coef_ # array([-1.67779283, 0.28359762, 2.68586629, 1.12816882]) sk_lr.intercept_ # 11.790740740740736 숙제 template 파일 제출하기 ( 윈도우의 경우 ) 1. windows + r 를누르고 cmd 입력후확인을클릭합니다. 2. 작업을수행한폴더로이동합니다. 3. 밑에명령어를 cmd 창에입력합니다. install.bat submit.bat [YOUR_HASH_KEY] 숙제 template 파일 제출하기 (MacorLinux) 1. 터미널을구동합니다. 2. 작업을수행한디렉토리로로이동합니다. 3. 밑에 bash 창을입력합니다. bash install.sh bash submit.sh [YOUR_HASH_KEY] backend.ai 서비스의업데이트에의해실행전반드시 bash install.sh 또는 install.bat 수 행을바랍니다. NextWork 드디어우리는 Numpy 를가지고 Machine Learning 의첫번째알고리즘을구현해보았다. 비교적쉬운숙
제였지만 Matrix 다루기쉽지않은분들은상당히헷갈린숙제일것이다. 실제로여러분이짠코드는 scikitlearn 의기본 LinearRegression Class 와크게다르지않다. 자부심을가지고한발씩나아가보자!! Humanknowledgebelongstotheworld - from movie 'Password' -