슈코딩

[머신러닝] 기초학습 선형회귀 & 경사하강법 & 데이터셋 분할 본문

코딩공부/머신러닝

[머신러닝] 기초학습 선형회귀 & 경사하강법 & 데이터셋 분할

Roshu 2022. 5. 13. 14:33

1. 선형 회귀 (Linear Regression)

 

>모든 문제는 선형으로 풀 수 있다라고 가정하는게 선형회귀이다.

>이세상에 완벽한 것은 없으니까 일단 선형으로 풀어보겠다.

>가설을 세워 직선으로 표시 할 수 있다.

>직선 가설과 정답값의 거리를 좁히는 방법으로 학습을 기계한테 시킨다.

>기계는 W랑 b값을 계속 바꿔가면서 cost가 최소화되는 방향으로 학습을 시킨다.

 

#선형회귀와 가설(Hyphothesis), 손실함수(Cost function, loss function)

 

위그래프를 통해서 가설을 세울수 있는데 수식으로 나타내면

H(x) = W(x) + b  1차함수

 

위 그래프처럼 정확한 점수를 예측하기 위해

점 = 정답 , 점선 = 가설 의 거리가 가까워지도록 해야한다.(=mean squared error)

H(x) 는 가정한 직선, y는 정답포인트라고 했을때, H(x)와 y의 거리(차의 절대값)가 최소가 되어야 

이 모델이 학습이 잘되었다고 할 수 있다. 

##실무에서는 1차함수보다 더 높은 고차원 함수를 사용하지만 원리는 같다.

 

다중 선형회귀

입력값이 2개이상이 되는 문제를 선형회귀로 풀때 다중 선형 회귀를 푼다.

 

 

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

위에서 정의한 손실함수(cost function) 을 상상해본다.

손실함수가 2차함수의 모양을 가진다고 가정

손실 함수를 최소화(Optimize) 하는것이 목표다.

경사 하강법이라는 방법을 써서 점진적으로 문제를 풀어가는데,

이때 랜덤으로 한점에서 시작해 좌우로 조금씩 그리고 한번씩 움직이면서

이전 값보다 작아지는지를 관찰하고, 이때 한칸씩 전진하는 단위를 Learning rate라고 부른다.

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

#Learning rate : 우리가 만든 머신러닝 모델이 학습을 잘하기위해서 적당한 Learning rate 를 찾는 노가다를 해야한다.

Learning rate 가 작을때 : 최소점에 수렴하는데까지 시간이 많이 걸린다.

Learning rate 가 클때 : 최소값을 지나치고 검은 점이 진동을 하다가 범위 밖으로 Overshooting 하게 될수 있다. 

Learning rate 클때

복잡한 가설을 세울경우에는 손실함수를 사람이 그릴 수도없는, 상상할 수 없는 형태가 된다.

ex)

복잡한 형태의 손실함수 그래프

 

! 머신러닝 엔지니어의 핵심 역할

 

손실 함수의 최소점인 Global cost minimum을 찾는다.

Learning rate를 잘못 설정할 경우 Local cost minimum에 빠질 가능성이 높다.

Cost가 높다는 얘기는 만든 모델의 정확도가 낮다는 말과 같다.

따라서 최대한 Global minimum을 찾기 위해 좋은 가설과 좋은 손실 함수를 만들어서

기계가 잘 학습할 수 있도록 만들어야한다.

 

 

3. 데이터셋(Data Set) 분할

1. Traning Set = 교과서

머신러닝 모델을 학습시키는 용도로써 전체 데이터셋의 약 80%를 차지한다.

 

2. Validation Set = 모의고사

머신러닝의 모델의 성능을 검증하고 적합성도 검증하고 튜닝도 하는 지표의 용도다.

모델을 사용할지 말지 결정하는 역할을 하게된다.

모델의 성능에는 영향을 미치지 않는다.

 

3. Test Set = 수능

정답 라벨이 없는 실제환경에서의 평가를 하는 데이터셋이다.

모델 검증 때도 쓰지않은 순수한 데이터셋을 사용하게된다.

테스트셋에서 보통 결과가 좋으면 이모델의 성능은 좋은것이다.

트레이닝,밸리데이션 셋에서 정확도가 아무리 높아도 테스트셋에서 정확도가 낮으면 소용이 없게 된다.

 

 

4. Google Colab을 사용한 Linear Regression 간단실습

 

Tensorflow

import tensorflow as tf

tf.compat.v1.disable_eager_execution()

#입력값 지정
x_data = [[1, 1], [2, 2], [3, 3]]
y_data = [[10], [20], [30]]

#placeholder X,Y 데이터셋을 넣어줄 공간 // 형태를 지정해줘야함. 
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')

#가설, 손실함수, 옵티마이저 
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:
  sess.run(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))

#가설에 4,4를 넣으면 어떻게 될지 검증을 해본다.
  print(sess.run(hypothesis, feed_dict={X: [[4, 4]]}))

실행 했을때 모습 loss가 점점 줄어든다.
50번 돌려서 마지막 결과 40에 가까운 값이 나오는걸 볼 수 있다.

tensorflow는 원래 기본 머신러닝의 프레임워크 였지만 지금은 권장하지 않고 keras를 사용하는걸 권장한다.

keras와의 다른점은 무엇인지, 비교를 해보며 keras를 권장하고 사용하는 이유를 직접 느껴보자.

 

 

Keras 

 

tensorflow의 상위 API

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)
])

#mean_squared_error = 손실함수 cost 수식을 쓸 필요가 없다.
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.1))

#fitting 과정  ephocs = 반복
model.fit(x_data, y_data, epochs=100) # epochs 복수형으로 쓰기!

훨씬 짧고 간단한 코드로 작성되는것을 볼 수 있다.

 

살행 시켰을때 학습하는 모습

 

모델에 5라는 예측값을 넣었을때 50에 근접한 값을 출력하는 모습

 

5. Kaggle 데이터 받아오기

Kaggle이란?

>데이터 사이언티스트, 머신러닝 엔지니어들을 위한 커뮤니티

>전세계에서 가장많은 데이터셋을 보유하고 있을것이다.

>캐글에서 데이터셋을 다운로드 받아와서 분석 해본다.

 

Kaggle에서 데이터셋 가져오기

오른쪽 위 아바타를 눌러 Account로 진입
API토큰 생성하면 다운로드된 Json타입의 username,과 key값을 가져다가 입력해야한다.

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

 

사용할 데이터셋을 검색한다.
화면 오른쪽 상단을 클릭해 API command를 복사한다.

복사
kaggle datasets download -d ashydv/advertising-dataset

복사해서 가져온 후 시스템 명령어를 사용하기 위해 ! 를 붙여준다.
!kaggle datasets download -d ashydv/advertising-dataset

파일이 압축되어있기에, 압축을 풀어준다.
!unzip /content/advertising-dataset.zip

 

6. 광고 데이터 예측 (Single-variable linear regression)

 

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  >>csv파일을 읽을때 사용
import matplotlib.pyplot as plt >>그래프 그릴때 사용
import seaborn as sns >>그래프 그릴때 사용
from sklearn.model_selection import train_test_split >>머신러닝 도와주는 패키지
>>트레이닝셋, 테스트셋을 분류해주는 train_test_split 클래스
데이터셋 로드
df = pd.read_csv('advertising.csv')
df.head(5) >>맨앞에서 다섯줄 출력 df.tail(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

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 복수형으로 쓰기!
)
y_pred = model.predict(x_val)

TV데이터 예측 그래프

plt.scatter(x_val[:, 0], y_val)
plt.scatter(x_val[:, 0], y_pred, color='r')
plt.show()

'코딩공부 > 머신러닝' 카테고리의 다른 글

[머신러닝] CNN  (1) 2022.05.17
[머신러닝] 딥러닝  (0) 2022.05.16
[머신러닝] 다양한 모델 & 전처리  (0) 2022.05.16
[머신러닝] 논리회귀 Logistic regression  (0) 2022.05.16
[머신러닝] 기초개념  (0) 2022.05.13
Comments