Study/생활코딩 머신러닝야학

[생활코딩 머신러닝야학] 텐서플로우 Day2

growingtree 2020. 8. 18. 20:13

출처 : https://ml.yah.ac/

 

5. 표를 다루는 도구 '판다스' 

https://opentutorials.org/module/4966/28971

 

표를 다루는 도구 '판다스' - Tensorflow 1

수업소개 '판다스'를 이용하여 데이터 다루는 방법을 배우는 수업입니다, 모델을 학습시키기 위하여 파일로부터 데이터를 읽어들이고, 독립변수와 종속변수를 분리하여 데이터 준비합니다. �

opentutorials.org

요약정리

1. 지도학습의 첫번째 스텝은 과거의 데이터를 준비하는것이다.

우리가 가지고 있는 데이터는 보통 파일의 형태이기 때문에 프로그램으로 파일을 불러오는 과정이 필요하다. 

 

2. '변수(Variable)' 라는 용어에 대해 짚고 넘어가자.

x=1
x=2

위의 코드로  x 는 1이었다가 2로 바뀐다는 것을 알 수 있다. 즉, x의 값은 정해져 있지 않고 바뀔 수 있는데 이 때, x 를 변수라고 한다.

프로그램에서 변수는 데이터를 담고있다는 의미로 쓰인다.

표에서 변수는 칼럼의 의미이다. 즉, 표에서 변수는 관측치에 따라 값이 바뀐다는 의미인 것이다. 프로그램의 관점과 데이터의 관점에서 변수라는 단어를 쓰지만 서로 의미가 미묘하게 다르다. 변수라는 단어를 프로그램 관점에서 해석해야하는지 아니면 표 , 데이터의 관점인지 확인하는 작업이 필요하다. 

 

3. 표에서 원인이 되는 변수독립변수라고하고 결과가 되는 변수종속변수라고 하는데,

지도학습을 할 때는 이 둘을 분리하는 작업이 필요하다. 파이썬에서는 쉽게 표를 가지고와서 데이터를 종속변수와 독립 변수로 나눌 수 있는데 그것은 판다스(pandas) 라이브러리 덕분이다. 판다스 라이브러리는 콘솔창에서 import하고 사용하면 된다.

import pandas 
import pandas as pd 

그냥 import pandas 해도 되지만 편리하게 사용하기 위해서 import pandas as pd 를 주로 사용한다.

(pandas 스펠링을 다 쓰는 것보다 줄여서 pd 로 쓰면 타이핑 수가 줄어드니까!)

판다스는 텐서플로우와는 다른 라이브러리이지만 데이터를 가지고와서 사용하기 위해선 필요한 라이브러리이다.

 

4. 이번 강좌에서는 

lemonade.csv

boston.csv 

iris. csv

파일을 사용한다. csv 파일은 ,(comma)로 구분짓는 데이터형태를 말한다. 다운받으면 table의 형태로 확인이 가능하다.

강사의 깃허브에 들어가면 파일을 다운로드 받을 수 있다 . 

 

 

실습 : 판다스(pandas) 라이브러리로 표 다루기

 

*실습을 통해 배울 도구들

1. 파일 읽어오기 : pd.read_csv('/경로/파일명.csv')

2. 모양 확인하기 : print(데이터.shape)

3. 칼럼 선택하기 : 데이터[['칼럼명1','칼럼명2','칼럼명3']]

4. 칼럼 이름 출력하기 : print(데이터.columns)

5. 맨 위 5개 관측치 출력하기 : 데이터.head()

 

import pandas as pd

# 1. 파일 읽어오기 
lemonadefile = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/lemonade.csv'
lemonade = pd.read_csv(lemonadefile)

bostonfile = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/boston.csv'
boston = pd.read_csv(bostonfile)

irisfile = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
iris = pd.read_csv(irisfile)

# 2. 데이터모양 확인하기 
print(lemonade.shape) #(6,2)
print(boston.shape) #(506,14)
print(iris.shape) #(150,5)

 # 3. 칼럼이름 출력
 print(lemonade.columns) #Index(['온도', '판매량'], dtype='object')
 print(boston.columns) #Index(['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax',
      # 'ptratio', 'b', 'lstat', 'medv'],dtype='object')
 print(iris.columns) #Index(['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭', '품종'], dtype='object')
 
 # 4. 독립변수와 종속변수로 나누기 
indelemon=lemonade[['온도']]
depelemon=lemonade[['판매량']]
print(indelemon.shape)
print(depelemon.shape)

indeboston=boston[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax',
       'ptratio', 'b', 'lstat']]
depeboston=boston[['medv']]
print(indeboston.shape)
print(depeboston.shape)

indeiris=iris[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
depeiris=iris[['품종']]
print(indeiris.shape)
print(depeiris.shape)

# 5. 맨 위 5개 관측치 출력하기
print(lemonade.head())
print(boston.head())
print(iris.head())

 

 

6. 첫번째 딥러닝- 레모네이드 판매 예측 

https://opentutorials.org/module/4966/28974

 

첫번째 딥러닝 - 레모네이드 판매 예측 - Tensorflow 1

수업소개 레모네이드 판매량을 예측하는 딥러닝 모델을 텐서플로우를 이용하여 만들어 봅니다.  강의  손실의 의미  실습  소스코드 colab |  backend.ai ########################### # 라이브러리 사용 i

opentutorials.org

요약정리

저번 시간에 본 지도학습의 전체과정을 정리해보자 

1. 과거의 데이터를 준비

2. 모델의 구조 만들기

3. 데이터로 모델을 학습하기

4. 모델을 이용하기

 

순서대로 코드와 함께 정리해보자 

 

1.  독립변수와 종속변수로 나눠서 데이터를 준비

import pandas as pd
import tensorflow as tf 

lemonadefile = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/lemonade.csv'
lemonade = pd.read_csv(lemonadefile)

indelemon = lemonade[['온도']] #독립변수 
depelemon = lemonade[['판매량']] #종속변수
print(indelemon.shape, depelemon.shape)

>> pandas library 를 이용해 데이터를 받아와서 독립변수, 종속변수를 나눈다 

 

2. 모델의 구조 만들기 ( 가장 기본이자 메인이 되는 코드) 

X= tf.keras.layers.Input(shape=[1])
Y=tf.keras.layers.Dense(1)(X)
model=tf.keras.models.Model(X,Y)
model.compile(loss='mse')

 

>> 가장 간단한 neural network 구성했다. 뉴런 하나로 이루어진 두뇌를 상상하면 쉽다.

첫 두 줄(X= tf.keras.layers.Input(shape=[1]) / Y=tf.keras.layers.Dense(1)(X)) 에서 숫자부분을 이해하면 코드를 자유자재로 이용할 수 있다.

 

 

X= tf.keras.layers.Input(shape=[1])

lemonade 데이터에서 독립변수는 '온도' 라는 칼럼 1개라서 shape=[1], 1이라고 적은 것이다.

 

Y=tf.keras.layers.Dense(1)(X)

lemonade 데이터에서 종속변수는 '판매량' 칼럼 1개라 Dense(1), 1 이라고 적은 것이다. 

 

3. 데이터로 모델 학습하기

model.fit(indelemon,depelemon,epochs=1000) 

>> fit이라는 도구(=함수)가 모델을 학습시키는 기능을 제공한다. 사람처럼 모델도 여러번 반복해서 학습해야 학습능력이 높아진다.  전체 학습 내용을 몇 번 반복할 것인지 정하는게 epochs 임. 위 코드에서 epochs=1000이라 지정하면 1000번 학습하는게 된다.

 

4. 모델을 이용해 값을 예측하기

print("Predictions:" , model.predict([[15]])) 

>> 모델에 새로운 값을 넣었을 때 값을 제대로 예측한다면 성공이다. 

 

 

 

추가) Loss 와 Prediction

model.fit(indelemon,depelemon,epochs=10) 

모델을 만들고 학습을 시키면 , 아래와 같은 결과가 나온다. 

 

결과에 대한 설명을 달아보면,

 

맨 처음 파란색 박스는 전체 학습 epochs 중 몇번째인지를 알려주는 부분이다. 

중간 노란색 박스는 각 학습 epochs마다 걸리는 시간을 나타내는 부분이다.  

맨 마지막 보라색 박스는 loss라고 해서 학습이 얼마나 진행되었는지 알려주는 부분이다.

이 부분이 가장 중요한 부분인데, 모델은 한 epoch를 진행할 때마다 조금씩 학습한다. 각 학습이 끝날때 loss는 그 시점에 모델이 얼마나 정답에 가까이 맞추고 있는지를 평가하는 지표이다. 모델은 학습을 할 때마다 더 정확하게 정답을 맞추게 된다. 즉, 학습을 진행할수록 loss의 값이 점점 작아진다는 것이다. 

 

모델이 학습을 진행하고 나서 정답과 예측값을 구한다음 서로 비교한다.

예측에서 정답을 뺀 값을 제곱한 것의 평균이 바로 loss 이다. 

loss = (예측-정답)^2 

예측이 정답을 모두 맞춘다면 그 차이는 0이 되므로 loss도 0이 된다. 고로 loss값이 작아지면 작아질수록 좋은 것이다! 

epoch가 진행될때마다 loss값이 0에 가까워지는지를 확인 (epoch를 10000번 진행하니까 loss의 값이 점차 더 작아짐)

 

model.fit(indelemon,depelemon,epochs=10,verbose=0) 

참고로 학습을 10000번 1000번 이렇게 진행하는데, 학습과정을 다 출력하면 정신이 없어진다@@

그럴 때 위 코드처럼 verbose=0 옵션을 적용하면 학습과정이 다 출력되지 않는다!

 

 

모델 학습을 엄청 반복하면

loss가 9.5265e-04 이런 식으로 이상한(?) 숫자가 나오게 된다. e-04 는 10의 -4승을 의미한다. 즉 0.00001 * 9.5265를 곱한 값이 loss에 해당하는데, 약 0.00095265 이다. 즉 loss가 0에 엄청 가까워진 것이다. 

 

model.predict(indelemon)

 

하면 model이 학습해서 내놓은 종속변수(lemonade 예제의 경우 판매량에 해당) 의 결과가 나온다.

model이 내놓은 독립변수. 실제 종속변수(판매량)과 차이가 나는지 비교해보자  

실제 종속변수의 값과 비교해서 얼마나 차이가 나는지 확인할 수 있다. 

실제 lemonade.csv 데이터   

model.predict([15])

모델이 학습한 내용을 바탕으로 이제 새로운 값을 줘보는 작업이다.

model.predict([15]) 라는 것은 만약 독립변수인 온도가 15라면  종속변수인 판매량이 얼마인지 예측하는 코드이다. 

 

 

 

궁금한 내용

- 학습을 진행할수록 loss가 커질수도 있을까? 

- loss가 아예 0 이 나올 수 있을까? 

반응형