본문 바로가기

spartacodingclub/개발보고서

가장 쉽게 배우는 머신러닝 1주차

https://spartacodingclub.kr/

 

*스파르타 클럽 강의 1주차를 듣고 난 개인적인 후기*

더보기

한이음 공모전 중 '이브와'라는 공모전에 참여하게 되면서 다양한 강의(Do it!, Git Lab 등)를 접하고 듣게 되었다.

IT 대학 3년 동안 다니면서 정말 이런저런 외부 강의들을 많이 들어봤지만(돈 없어서) 전부 무료 강의였다. 

그래서 그이번에 공모전 참여자로서 무료로 지원해주는 유료 강의를 처음 들어봤다...

유료 강의와 무료 강의와의 질 차이는 분명했다. 지금까지는 늘 1학년 때부터 들었던 것들을 반복하는 느낌이어서 대충 듣고 넘겨야겠다는 마음이 강했지만, 유료 강의는 다양한 실습 등을 숙제 제출이라는 목록으로 만들어 학생들이 전부 참여할 수 있도록 만들어 놓았다.

가장 좋았던 건 강의가 과하게 이론 중심이 아니었다는 것이다.

내가 듣고 있는 '가장 쉽게 배우는 머신러닝' 수업을 예로 들자면, 필요한 이론 강의는 전체 강의 중 1/3보다도 적게 차지하고 있고, 그 외에 다양한 실습을 할 수 있는 강의들이 상당 부분을 차지하고 있었다.

직접 코드를 작성하고 그게 어떻게 작동하는지 두 눈으로 확인하는 것을 좋아하는 사람으로서, 이상하게 자꾸 듣고 더 많은 예제를 직접 작성해보고 싶다는 생각을 하게 되었다.

 

 

 

*강의 내용*

 

머신 러닝이란?

말 그대로 기계를 학습시킨다는 의미를 가지고 있다.

 

알고리즘Algorithm이란?

어떤 문제를 풀기 위해 만든 수학 공식이라고 볼 수 있다.

 

회귀Regression란?

입력값을 넣었을 때 출력값이 연속적인 소수점으로 예측하게 하도록 푸는 방법을 회귀라고 한다.

분류Classification란?

출력값으로 클래스를 이용하는 것을 분류Classification이라고 한다.

여러 클래스를 이용하여 분류하는 것은 다중 분류Multi-class classification라고 한다.

>> 몇몇 문제들은 회귀와 분류, 두 가지 방법으로 접근할 수 있다.

예를 들어, 회귀에 해당하는 출력값들을 클래스로 분류하는 방식이 있다.

 

지도 학습Sypervised learning이란?

정답을 알려주면서 학습시키는 방식이다.

비지도 학습Unsupervised learning이란?

정답을 알려주지 않고 군집화Clustering하는 방식이다.

강화 학습Reinforcement learning이란?

주어진 데이터 없이 실행과 오류를 반복하면서 학습하는 방식이다. ex. 알파고

 

선형 회귀Linear Regression란?

컴퓨터가 풀 수 있는 문제 중 가장 간단한 것은 구 데이터 간의 직선 관계를 찾아내 x 값이 주어졌을 때 y 값을 예측하는 것인데, 이것을 선형 회귀라고 한다.

우리가 가정한 직선을 H(x) = Wx + b 와 같은 수식으로 표현할 수 있다.

y를 정답이라고 했을 때, 임의로 가정한 직선과 정답 사이의 거리가 최소가 되어야 모델이 잘 학습되었다는 것을 알 수 있다. 이때 Cost는 손실 함수를 의미한다.

다중 선형 회귀Multi-variable linear regression란?

선형 회귀와 똑같지만 입력 변수가 여러 개인 것이라 생각하면 쉽다.

 

경사 하강법Gradient descent method이란?

우리의 목표는 손실 함수Cost를 최소화하는 것이다. 컴퓨터는 사람처럼 수식을 풀 수 없기 때문에 경사 하강법이라는 방법을 써서 점진적으로 문제를 풀어간다.

랜덤으로 한 점에서 시작해 조금씩 움직이면서 이전 값과 비교해 더 작은지 관찰한다.

이때 한 칸씩 전진하는 단위를 Learning rate라고 부른다.

그래프의 최소점에 도달하게 되면 학습은 종료하게 된다.

이때, Learning rate가 지나치게 작으면 최소값을 찾는 데까지 시간이 오래 걸릴 것이고, 값이 지나치게 크면 값이 발산하는 최악의 경우가 일어날 수도 있다. 이런 상황을 Overshooting이라고 부른다.

 

데이터셋 분할

데이터셋은 총 세 가지로 나눌 수 있다.

Training set은 학습 데이터셋, 트레이닝셋으로 머신러닝 모델을 학습시키는 용도로 사용된다. 전체 데이터셋의 약 80%를 차지하고 있다.

Validation set은 검증 데이터셋, 밸리데이션셋으로 머신러닝 모델의 성능을 검증하고 튜닝하는 지표의 용도로 사용된다. 이 데이터는 정답 라벨이 있고, 학습 단계에 사용하긴 하지만 모델에 데이터를 직접 보여주지 않기 때문에 성능에 영향을 미치지는 않는다. 실제 손실 함수, Optimizer 등을 바꾸면서 모델을 검증하는 용도로 사용된다. 전체 데이터셋의 약 20%를 차지한다.

Test set은 평가 데이터셋, 테스트셋으로 정답 라벨이 없는 실제 환경에서의 평가 데이터셋을 의미한다.

 

실습

캐글 데이터셋을 불러와 텐서플로우와 케라스를 이용한 선형 회귀 실습 코드

실습 환경은 코랩colab이다.

(실습 코드: https://colab.research.google.com/drive/1txeZzsTPGbtNqMm9bHSULZgki8Q7MSQg?usp=sharing)

 

import os
os.environ['KAGGLE_USERNAME'] = 'gaebal' # username
os.environ['KAGGLE_KEY'] = 'e56ca0a2c4084054fc80e047614dc1e1' # key

 

캐글이라는 데이터셋 사이트에 로그인한 후 account > API > Create New API Token로 들어가게 되면 json 파일을 다운로드 받게 되는데, 그 파일을 웹으로 끌어놓으면(크롬 브라우저나 웨일 브라우저) 웹에 json 파일이 뜨게 된다.

위와 같이 username과 key를 각 위치에 맞는 곳에 넣는다.

 

!kaggle datasets download -d rsadiq/salary  #kaggle dataset

!unzip /content/salary.zip

 

캐글에 원하는 데이터셋을 불러오기 위한 코드이다.

원하는 데이터셋 페이지로 들어가게 되면 New Notebook 옆에 세 개의 점으로 된 것을 눌러 Copy API Command를 누른다. 그렇게 되면 첫 번째 코드에서 느낌표(!)만 없는 문장이 복사되는데, 이때 붙여넣기 후 느낌표(!)를 꼭 붙여줘야 한다.

첫 번째 문장을 실행하게 되면 파일에서 zip 파일 하나가 새로 생긴 것을 확인할 수 있다. 우리가 사용하는 데이터셋에서는 그 zip파일의 이름이 salary.zip이다. 해당 파일을 unzip 명령어를 이용해 풀어야 비로서 데이터셋으로서 사용할 수 있게 되는 것이다.

 

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
from sklearn.model_selection import train_test_split
# 실습에 필요한 것들을 전부 import

df = pd.read_csv('Salary.csv')
# df에 zip파일을 풀어 얻은 csv파일을 넣는다.

x_data = np.array(df['YearsExperience'], dtype=np.float32)
y_data = np.array(df['Salary'], dtype=np.float32)
# x_data, 즉 입력값에 array를 취해서 공간을 만들어준다.
# y_data, 즉 출력값에도 array를 취해 공간을 만들어준다.

 

import한 구간에서 pd는 csv를 읽을 때 이용, 그 밑으로 plt와 sns는 그래프를 그릴 때 사용된다.

이 이후에 x_data.shape와 y_data.shape를 print로 확인해 보면 모양이 다른 것을 확인할 수 있다. (y 콤마 뒤에 두 번째 값이 없다.)

 

x_data = x_data.reshape((-1, 1))
y_data = y_data.reshape((-1, 1))

print(x_data.shape) 
print(y_data.shape)

 

이 코드를 이용해 모양을 맞춰주고 다시 프린트해보면 두 값의 모양이 같은 것을 확인할 수 있다. 이렇게 모양을 맞춰 놔야 케라스가 인식하기 쉬워지게 된다.

 

x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)
# 데이터셋을 학습 데이터/검증 데이터로 분할한다.
# 0.2는 8:2로 분할한다는 것을 의미한다.
# 이때 랜덤 값은 앞서 말했던 경사 하강법을 사용할 때의 랜덤한 첫 번째 위치를 의미한다.

print(x_train.shape, x_val.shape)
print(y_train.shape, y_val.shape)
# 이 코드로 각자의 데이터셋이 학습은 160, 검증은 40으로 나뉜 것을 확인할 수 있다.

model = Sequential([
  Dense(1)
])
# y, 즉 출력값이 1개라는 것을 의미한다.

model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01))
# 모델은 loss 계산과 lr(lnear rate)에 따른 값으로 구성된다.

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs=100 # epochs 복수형으로 쓰기!
)
# 각자 데이터와 검증 데이터를 넣고, epoch: 반복 실행해 모델을 fit(맞춘다)
y_pred = model.predict(x_val)

plt.scatter(x_val, y_val)
plt.scatter(x_val, y_pred, color='r')
plt.show()

 

위의 내용들을 이용해 모델을 예측하는 최종 코드로, scatter은 뒤에 나와 있는 값들에 대한 그래프를 만들어준다. 여기에서 학습한 값은 일반 색상으로, 예측한 값을 빨간색으로 한다고 했을 때 최종 그래프는 아래와 같다.