본문 바로가기

카테고리 없음

[내일배움캠프] - 24일차 : 강의 학습 | 머신러닝 기초

저녁 7시 팀 교체

 

머신러닝

 

준비

Kaggle : 데이터 사이트

 

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

B. 오늘 온도와 습도 데이터를 활용하여, 내일 미세먼지 농도를 예측할 수 있을까?

C. 이 사진에 찍힌, 사람 수는 몇 명 일까?

 

회귀(Regression): 출력값이 연속적인 소수점으로 예측(점수)

분류(Binary classification): 여부(Pass or fail)를 예측(여부)

 이진분류

 다중분류

 

선형회귀(Linear Regression)

정확한 시험 점수를 예측하기 위해 우리가 만든 임의의 직선(가설)과 점(정답)의 거리가 가까워지도록 해야합니다.

임의로 만든 직선 H(x)를 가설(Hypothesis)

Cost를 손실 함수(Cost or Loss function)

$Cost = {{1\over N}\sum_{i=1}^{N}{(H(x_i) - y_i) ^ 2}}$

 

경사 하강법 (Gradient descent method)

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

목표는 이 손실 함수의 최소점인 Global cost minimum을 찾는 것

Learning rate: 한칸씩 전진하는 단위(노가다)

만약 Learning rate가 지나치게 크다면 최악의 경우에는 발산하게 될 수도 있습니다. 이런 상황을 Overshooting

Local cost minimum에 빠질 가능성이 높습니다.

 

최대한 Global minimum을 찾기 위해 좋은 가설과 좋은 손실 함수를 만들어서 기계가 잘 학습할 수 있도록 만들어야하고 그것이 바로 머신러닝 엔지니어의 핵심 역할

 

데이터셋 분할

Training set (학습 데이터셋, 트레이닝셋) = 교과서 : 80% 정도를 차지

Validation set (검증 데이터셋, 밸리데이션셋) = 모의고사 : 20% 정도를 차지

Test set (평가 데이터셋, 테스트셋) = 수능

 

Colaboratory 사용

: Jupyter Notebook을 기반으로 하고 있어, 각 '메모장'은 셀로 이루어져 있고, 이 셀 단위로 코드를 실행하고 그 결과를 출력해볼 수 있습니다.

 

 

실습

 

준비

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

 

데이터셋 다운로드 / 압축해제(리눅스)

!kaggle datasets download -d ashydv/advertising-dataset
!unzip /content/advertising-dataset.zip

 

라이브러리 임포트

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 # 트레이닝셋과 테스트셋을 분류해줌

 

데이터셋 로드

df = pd.read_csv('advertising.csv') # pandas 사용
df.head(5) # 앞에서부터 (5)줄을 출력함 <-> tail

세이터셋 크기 확인

print(df.shape) # 크기(행, 열)

 

데이터셋 맛보기

sns.pairplot(df, x_vars=['TV', 'Newspaper', 'Radio'], 
             y_vars=['Sales'], height=4) # seaborn 사용해서 x_vars와 y_vars의 상관 관계를 그려줌

데이터셋 가공

# keras는 numpy.array로 바꿔준 데이터만 취급함

x_data = np.array(df[['TV']], dtype=np.float32) # input
y_data = np.array(df['Sales'], dtype=np.float32) # output

print(x_data.shape) # =(200, 1)
print(y_data.shape) # =(200,)



# 데이터셋 값자체는 변하지 않지만 reshape을 해야지 keras가 인식하기 편함

x_data = x_data.reshape((-1, 1)) # '-1': 남은 수만큼 알아서 변형해라, '1': 뒤는 무조건 1이 되어라
y_data = y_data.reshape((-1, 1))

print(x_data.shape) # =(200, 1)
print(y_data.shape) # =(200, 1)

 

데이터셋 분할

x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)
# test_size: 20% -> train_size: 80%

print(x_train.shape, x_val.shape) # 트레이닝 데이터 160개로 학습시키고, 밸리데이션 데이터 40개로 검증
print(y_train.shape, y_val.shape)

(160, 1) (40, 1)
(160, 1) (40, 1)

 

학습 실행

# Linear Regression model

model = Sequential([
  Dense(1) # 출력 수: 1개
])

model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.1)) # loss: 수식

# optimizer: 학습 데이터(Train data)셋을 이용하여 모델을 학습 할 때 데이터의 실제 결과와 모델이 예측한 결과를 기반으로 잘 줄일 수 있게 만들어주는 역할
# lr: learnig rate


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

 

 

검증데이터로 예측 진행

# model.predict: 학습한 'model'로 인자값(x:광고)으로 예측하기
y_pred = model.predict(x_val)

# scatter: 점찍는 그래프
plt.scatter(x_val, y_val) # (광고데이터, 실제매출액)
plt.scatter(x_val, y_pred, color='r') #(광고데이터, 예측매출액, 색상)
plt.show()