카테고리 없음

Colab으로 ML모델 활용 - 01

best_spear_man 2023. 5. 18. 18:42

ML?

먼저 알고리즘에 대하여

문제를 해결하기위해 정해진 일련의 절차를 알고리즘이라고 한다.
단순한 알고리즘을 통해 다양한 변인들이 있는 복잡한 상황에서의 예측, 분류 등의 문제를 해결하기는 어렵다.
그러나 통계적, 수학적 모델들을 이용한 알고리즘을 사용하면 가능하다.

ML로 풀 수 있는 문제의 접근법: 회귀 vs 분류

  • 회귀: 입력값에 대한 연속적(float)인 다른 값의 예측
  • 분류: 비 연속적인 결과를 예측해야할 때 (pass/fail - binary, LG/삼성/애플 - multiclass, ...)
  • 군집화: 비슷한 성질을 가진 것들 끼리 뭉쳐서 분리하는 것.

어느것을 사용할지는 사용자가 재량껏 선택해야한다.

학습의 방법 : 지도 vs 비지도 vs 강화학습

  • 지도학습 - 회귀/분류. 라벨링이 되어있는 데이터를 사용한다. 즉 입력값에 대해 사람이 원하는 출력이 있다. 학습의 정확도를 쉽게 파악할 수 있다는 장점이 있지만 라벨링(또는 annotation)된 대량의 데이터가 없으면 노가다 없인 활용이 불가능하다.
  • 비지도 학습 - 클러스터링, 시각화, 차원축소, 연관규칙학습 등. 라벨이 없는 데이터를 사용한다. annoatation 없이도 학습이 가능하여 데이터로부터 인간이 찾지못한 통찰을 얻을 수 있다. 학습의 결과가 올바른지 확인하기 어렵다.
  • 강화학습 - 분류 할 수 있는 데이터가 존재하지 않거나, 존재하더라도 정답이 정해져 있지 않으며 행동에 대한 지연된 보상을 받으며 학습하는 것이다. 모든 향동의 조합에 대해 지도/비지도 학습을 시키는 것은 현실적으로 불가능하지만 강화학습을 사용하면 된다. 단, 행동(Action)을 위한 행동 목록은 사전에 정의가 되어야 한다.

선형회귀

입력과 출력간의 '선형적 관계'가 있고 그것을 통해 예측이 가능하다고 가정한다. 입력변수의 수가 2개 이상이면 다중선형회귀 라고 불린다. 이를 통해 가설 H(x)를 다음과 같이 수립한다.

H(x) = Wx + b

이 가설이 실제 관측값과의 차이를 측정하기 위해 손실함수(cost function, loss function)를 정의해 주어야하는데, 선형회귀에서는 보통 Mean Squared Error를 사용한다.

loss function의 값에 따라 W와 b의 값이 조금씩 변하며 loss가 최소가 되는 지점을 찾게되는데 이를 위해 optimizer들을 사용하고, 가장 많이 쓰이는 것은 '경사하강법(Gradient Descent Method)'이다.

경사하강법

편미분을 이용해 loss function의 경사를 따라 조금씩 이동하는 방식이다. 이때 한번에 이동하는 거리를 learning rate라고 한다. 너무 작으면 global minimum을 찾기 어렵고, 너무 크면 overshooting에 의해 수렴하지 않을 수 있다.

또한 한번의 epoch마다 loss를 계산하면, 너무 느리므로 테스트 데이터(full-batch)를 mini-batch로 나누어 각 batch마다 loss를 계산해 경사하강하는 Stochastic GD(SGD)가 만들어진다.

Adam

SGD에는 방향이 뒤죽박죽이기 십상이고, 한 스텝의 사이즈를 결정하기 어렵다는 한계가 있으며 이를 해결하기 위해 다양한 optimizer들이 나타난다. Adam은 방향성과 속도(스텝 크기)를 모두 고려한 ioptimizer이며 대부분의 경우에 사용가능하다고 한다.(단, 이미지 분류에 있어서는 SGD보다 좋지 못하다는 평가도 있다.)

데이터 셋 분할

주어진 데이터를 라벨이 주어진 학습에 사용할 부분과 라벨이 없는 테스팅에 사용할 부분으로 나눌 수 있다. 트레이닝 셋에서 다시 validation set을 빼내는데, 이것은 모델의 성능을 검증하고 optimizer를 바꾸는 등의 튜닝하기 위해 쓰인다(모의고사). testing set은 라벨 없이 최종적으로 형성된 모델의 실제 사용에서의 성능을 검증하기 위한 것이다(수능).

Colab 과 Kaggle 사용

Colab은 구글에서 제공하는 머신러닝과 데이터 과학을 위한 클라우드 서비스로, 이미 준비된 개발환경과(주피터노트북, 필요한 패키지들 미리 설치됨)무료 클라우드 GPU 사용이 가능한 서비스이다.

Kaggle은 데이터 사이언스 커뮤니티 사이트로, 다양한 빅 데이터들을 얻을 수 있다.

시작하기

먼저 Kaggle에 회원가입한 뒤 프로필 페이지로 가서 create new token을 눌러 토큰이 담긴 JSON파일을 받는다. 이후 colab의 코드셀에 다음과 같이 입력한다.

import os
os.environ['KAGGLE_USERNAME'] = 'yourusername' # username
os.environ['KAGGLE_KEY'] = '459qrwkafnasdf2423423af' # key

다음으로 원하는 데이터셋을 다운로드 받는다. zip으로 다운로드 될시, 압축을 해제한다.

주피터 노트북에서 bash명령어를 써야할 때는 맨 앞에 '!'를 붙이면 된다.

!kaggle datasets download -d rsadiq/salary
!unzip salary.zip

csv파일로부터 데이터를 읽어들여보자. head를 써 데이터 테이블에 어떤 필드가 있는지 알 수 있다.

df = pd.read_csv('Salary.csv')
df.head(5)

선형회귀 실습

코랩 소개(간단한 사용법에 대한 내용)
케라스 없이 텐서플러우만으로 선형회귀 만들기 예제
실습한 노트북 링크

필요한 패키지들을 임포트한다.

# 학습 모델을 만들기 위해 임포트
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

데이터를 keras가 읽을 수 있게 np.array 로 바꿔주고, 자료형도 float32로 지정한다.
이후 x_data와 y_data의 형태(행렬 크기)를 맞춰준다. (-1,1)로 하면 (데이터 레코드 수,1)로 맞춰진다.

x_data = np.array(df[['YearsExperience']], dtype=np.float32)
y_data = np.array(df['Salary'], dtype=np.float32)

print(x_data.shape)  # 35,1
print(y_data.shape)  # 1,
x_data=x_data.reshape(-1,1)
y_data=y_data.reshape(-1,1)
print(x_data.shape)  # 35,1
print(y_data.shape)  # 35,1

데이터를 분리한다. training set과 validation set으로 분리하며 validationset 의 크기는 전체의 0.2배로 한다. random_state는 데이터 셋을 분리할 때 난수를 지정하는 seed값이며 아무값이나 해도 된다.

x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)

모델을 지정한다. Sequential은 모델을 이루는 각 layer가 순차적으로 연견됨을 의미하고, Dense(1)는 모든 노드를 연결한 dense한 모델에, 하나의 출력뉴런만 사용해서 학습할 것임을 뜻한다. 이렇게 하면 이는 곧 선형회귀임을 의미한다.

model = Sequential([
  Dense(1)
])

이후 모델의 loss function과 optimizer,optimizer의 러닝레이트를 지정한다.

model.compile(loss='mean_squared_error', optimizer=SGD(learning_rate=0.01))

이제 학습데이터와 validation 데이터를 넣고 원하는 횟수만큼 반복학습 시킨다.

model.fit(
    x_train,
    y_train,
    # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    validation_data=(x_val, y_val), 
    epochs=100 # epochs 복수형으로 쓰기!
)

결과를 플로팅을 통해 확인한다.

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