스파르타-머신러닝 1주차

차드마·2021년 6월 18일
0

1. 개요

알고리즘

어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것이나 계산을 실행하기 위한 단계적 절차를 말한다.

ex) 시험 전 날 커피를 몇 잔 마시면, 다음 날 시험에서 몇 점을 받을 수 있을까?

Score = 10*Coffee+40

ex) 오늘 온도와 습도 데이터를 이용해 내일 미세먼지 농도를 예측할 수 있을까?
--> 예측 어려움
--> 머신러닝의 출현

2. 회귀와 분류

머신러닝에서 문제를 풀 때, 해답을 내는 방법은 회귀와 분류로 나눠진다.

회귀

사람의 얼굴 사진을 보고 몇 살인지 맞추는 문제를 푼다 하자.
이때 입력값은 [얼굴사진]이 되고, 출력값은 [예측한 나이]가 된다.

위의 나이와 같이 연속적인 출력값으로 예측하여 문제를 푸는 방법을 회귀라고 한다.

분류

대학교 시험 전 날 공부한 시간을 가지고 해당 과목의 이수 여부를 예측하는 문제를 푼다 하자.
이때 입력값은 [공부한 시간]이 되고, 출력값은 [이수 여부]가 된다.
이수 여부는 0,1이라는 이진 클래스 로 나눌 수 있고,
이와 같은 분류 방법을 이진 분류라고 한다.

여기서 출력값을 [이수 여부]가 아닌 [성적(A,B,C,D,F)]으로 바꾼다면 클래스는 5개가 나오게 될것이다. 이러한 분류 방법을 다중 분류라고 한다.

*회귀와 분류를 동시에!

회귀에서 풀었던 나이 문제에서 나이를 범위로 쪼개어 생각하기

위와 같이 나이 범위를 클래스로 나누어 생각하면 회귀 문제가 다중 분류 문제로 바뀌게 된다.

3. 지도/비지도/강화 학습

지도 학습

  • 정답을 알려주면서 학습시키는 방법

  • 기계에게 입력값과 출력값을 전부 보여주며 학습

  • 정답이 없으면 불가능한 학습 방법

  • 실무에서는 입력값에 해당하는 데이터는 있어도 출력값에 해당하는 데이터가 없는 경우가 많아 입력값에 정답을 하나씩 입력해주는 작업을 수행
    --> 이를 라벨링(Labeling) 또는 어노테이션(Annotation)이라고 한다.

비지도 학습

  • 정답을 알려주지 않고 군집화(Clustering)하는 방법

  • 그룹핑 알고리즘의 성격
    ex) 음원 파일을 분석하여 장르를 팝, 락, 클래식, 댄스로 나누는 문제

  • 군집, 시각화, 연관 규칙 학습 등의 종류가 있음

강화 학습

  • 주어진 데이터없이 실행과 오류를 반복하면서 학습하는 방법
    알파고를 탄생시킨 머신러닝 방법

  • 분류할 데이터가 없거나 데이터가 있어도 정답이 없이 자신이 한 행동에 대한 보상을 받으며 학습하는 방법

  • 강화학습의 개념

    • 에이전트(Agent)
    • 환경(Environment)
    • 상태(State)
    • 행동(Action)
    • 보상(Reward)

게임을 예로 들면 게임의 규칙을 따로 입력하지 않고 자신(Agent)이 게임 환경(Environment)에서 현재 상태(State)에서 높은 점수(Reward)를 얻는 방법을 찾아가며 행동(Action)하는 학습 방법으로 특정 학습 횟수를 초과하면 높은 점수(Reward)를 획득할 수 있는 전략이 형성된다.
이때 행동(Action)을 위한 행동 목록(방향키, 버튼)등은 사전에 정의가 필요하다.

4. 선형 회귀(Linear Regression)

선형 회귀와 가설(Hypothesis), 손실 함수[Cost function (Loss function)]

시험 전 날 마신 커피 잔 수에 따라 시험 점수를 예측하는 문제를 푼다하자

위의 같은 데이터를 바탕으로 아래와 같은 그래프를 얻을 수 있다.

  • 위 그래프를 통해 우리는 임의의 직선 1개로 이 그래프를 비슷하게 표현할 수 있다는 가설을 얻을 수 있다.
    • H(x) = Wx + b
  • 정확한 시험 점수 예측을 위해 임의의 직선(가설)과 점(정답)의 거리가 가까워 지도록 해야한다.
    • Mean squared error : 직선과 각 점의 거리의 제곱을 모두 더한 것의 평균 값
    • Mean absolute error
  • 직선 H(x)와 점의 거리가 적을수록 잘 학습된 모델로 평가
    • H(x) --> 가설(Hypothesis)
    • 거리(Cost) --> 손실함수(Cost or Loss function)

*다중 선형 회귀

선형회귀에서 입력 변수가 여러개 인 경우 다중 선형회귀를 사용한다.

  • 가설 H = w1x1+w2x2+...+wnxn+b
  • 손실 함수 cost는 선형회귀의 경우와 동일

5. 경사 하강법(Gradient descent method)

경사 하강법이란?

손실 함수가 아래와 같은 형태를 가지고 있다고 가정하자.


출처 : https://towardsdatascience.com/using-machine-learning-to-predict-fitbit-sleep-scores-496a7d9ec48

  • 그래프를 따라 아래로 내려갈때 손실함수를 최소화 시킬 수 있다.

  • 이때 컴퓨터는 랜덤으로 한점으로 시작해 좌우로 조금씩 움직이며 이전 값보다 관찰하며 그래프의 최소점에 도달하였을때 학습을 종료함

  • 이때 좌우로 움직이는 단위를 Learning rate라고 하고 위와같은 방법을 경사 하강법이라고 한다.

  • Learning rate가 지나치게 작다면 시작점으로부터 최소점을 찾는데 많은 시간이 요구된다 --> 학습에 많은 시간이 필요

  • Learning rate가 지나치게 크다면 최소값을 지나치고 진동하다가 최악의 경우에는 발산할 수도 있다 --> Overshooting

실제 손실 함수는 어떨까?

실제 손실 함수는 아래와 같이 사람이 그릴 수도, 상상할 수도 없는 형태가 된다.

출처: https://regenerativetoday.com/logistic-regression-with-python-and-scikit-learn/

  • 우리의 목표는 Global cost minimum을 찾는 것

  • Learning rate를 잘못 설정할 경우 Local cost minimum에 빠져 학습을 종료

  • 이는 모델의 낮은 정확도로 이어짐

  • 따라서 Global minimum을 찾기 위한 좋은 가설과 좋은 손실 함수가 필요

6. 데이터셋 분할

학습/검증/테스트 데이터

출처 : https://3months.tistory.com/118

  • Training set = 교과서
    머신러닝 모델을 학습시키는 용도로, 전체 데이터셋의 80% 차지

  • Validation set = 모의고사
    머신러닝 모델의 성능을 검증, 튜닝하는 지표
    모델에게 직접 데이터를 보여주진 않기에 모델의 성능에는 영향 X

  • Test set = 수능
    정답 라벨이 없는 실제 환경에서의 평가 데이터셋

7. 실습

선형회귀 코드 실행하기

  • 텐서플로우 임포트 & 데이터와 변수 설정
import tensorflow as tf

tf.compat.v1.disable_eager_execution()

x_data = [[1,1], [2,2], [3,3]]
y_data = [[10], [20], [30]]

X = tf.compat.v1.placeholder(tf.float32, shape[None,2])
Y = tf.compat.v1.placeholder(tf.float32, shape[None,1])

W = tf.Variable(tf.random.normal(shape=(2,1)), name='W')
b = tf.Variable(tf.random.normal(shape=(1,)), name='b')
  • 가설과 비용함수, optimizer 정의
hypothesis = tf.matmul(X,W) + b
cost = tf.reduce_mean(tf.square(hypothesis - Y))
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
  • 매 스텝 별로 결과를 출력하며 비용함수가 줄어드는 것을 확인
with tf.compat.v1.Session() as sess:
sessrun(tf.compat.v1.global_variables_initializer())

for step in range(50):
c, W_, b_, _ = sess.run([cost, W, b, optimizer], feed_dict={X: x_data, Y: y_data})
print('Step: %2d\t loss: %.2f\t' % (step,, c))

print(sess.run(hypothesis, feed_dict={X: [[4, 4]]})
  • 실제로는 Kears를 이용한다
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD

x_data = np.array([1], [2], [3])
y_data = np.array([[10], [20], [30]])

model = Sequential([
Dense(1)
])

model.compile(loss='mean_squared_error', optimizer = SGD(lr=0.1)

model.fit(x_data, y_data, epochs=100)
y_pred = model.predict([[4]])
print(y_pred)

Kaggle 데이터를 이용해 선형회귀 실습하기

  • 필요한 라이브러리들 임포트 하기
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
  • 데이터셋 불러와 형태 확인하기
df = pd.read_csv('advertising.csv')
df.head(5)
print(df.shape)
  • 데이터셋 살펴보기
sns.pairplot(df, x_vars=['TV', 'Newspaper', 'Radio'], y_vars=['Sales'], height=4)
  • 데이터셋 가공하기
x_data = np.array(df[['TV']], dtype=np.float32)
y_data = np.array(df['Sales'], dtype=np.float32)

print(x_data.shape)
print(y_data.shape)
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)

print(x_train.shape, x_val.shape)
print(y_train.shape, y_val.shape)
  • 학습시키기
model = Sequential([
  Dense(1)
])

model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.1))

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    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()
  • 여러 X값을 이용하여 매출 예측하기
```python
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

df = pd.read_csv('advertising.csv')

x_data = np.array(df[['TV', 'Newspaper', 'Radio']], dtype=np.float32)
y_data = np.array(df['Sales'], dtype=np.float32)

x_data = x_data.reshape((-1, 3))
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)

print(x_train.shape, x_val.shape)
print(y_train.shape, y_val.shape)

model = Sequential([
  Dense(1)
])

model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.1))

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

0개의 댓글