[TensorFlow 2.0]Pandas 데이터 가져오기

A Ydobon
10 min readOct 2, 2019

--

이번에는 Pandas 데이터를 텐서플로우로 가져오는 법을 알아보겠습니다.

아래 내용은 상단의 튜토리얼을 참고하여 작성되었습니다.

I. 들어가며

Pandas 데이터프레임이란?

Pandas데이터는 row와 column으로 구성되어 있는데요, row를 추가하거나 고르는 것은 Pandas의 큰 장점이고, 이를 활용해 데이터를 쉽게 수정할 수 있습니다. 예시를 보실까요?

1 —

lst = [‘Love’, ‘Yourself’, ‘Boy’,‘with’, ‘Luv’, ‘BTS’]
df1=pd.DataFrame(lst)
print(df1)

df1

2 —
btsdata = {‘Name’:[‘Jungkook’, ‘V’, ‘RM’, ‘Suga’,’Jin’,’Jimin’,’J-Hope’],
‘Age’:[22, 23, 25, 26,26,23,25]}
df2=pd.DataFrame(btsdata)
print(df2)

df2

row와 column이 있는 것을 확인할 수 있고, column의 제목도 정할 수 있습니다. CSV파일과 굉장히 비슷하죠?

왜 Pandas 데이터프레임을 가져오려고 할까?

앞서 CSV파일 형식 데이터 가져오기를 다룬적이 있었는데요, 이 기능은 tensorflow 2.0부터 가능해진 것입니다. 그 전에는 CSV파일을 가져오기 위해 pandas를 사용했습니다.
기술이 발달하면서 로봇청소기를 쓰는 사람도 많지만, 로봇청소기를 살 수 있어도 그냥 청소기를 사용하시는 분들도 많으시죠? 이처럼 CSV파일을 바로 가져올 수 있는 새로운 기능이 생겼지만 계속 써왔던 방식을 쓰는 것입니다.

II. Pandas로 데이터 읽기

1 — 기술적인 준비

from __future__ import absolute_import, division, print_function, unicode_literalstry:
# %tensorflow_version only exists in Colab.
%tensorflow_version 2.x
except Exception:
pass
import pandas as pd
import tensorflow as tf

-이제 너무 많이 설명했으니 넘어가도록 하겠습니다 :)

2 — Dataset 살펴보기

아래의 학습 데이터셋(heart.csv)은 환자 303명의 개인건강정보(성별, 나이 등)을 담 고 있습니다. 그리고 우리는 마지막에 이 정보를 활용해 이 환자가 심장병을 가지고 있는지 아닌지 예측하려합니다.

heart.csv

일부 항목을 잠시 살펴볼까요?

  • sex: 0=여자, 1=남자
  • cp: 가슴 통증 종류
    — Value 1: typical angina
    — Value 2: atypical angina
    — Value 3: non-anginal pain
    — Value 4: asymptomatic
    미국심장협회에 따르면, angina는 심장 근육이 산소가 충분한 혈액을 공급받지 못했을 때 유발되는 가슴 통증입니다.
  • trestbps: 이완기 혈압
  • chol: 세럼 콜레스테롤
  • fbs: 수축기 혈압
    1 = > 120 mg/dl and 0 = if not
  • restecg: 이완기 심전계 결과
    — Value 0: normal
    — Value 1: having ST-T wave abnormality (T wave inversions and/or ST elevation or depression of > 0.05 mV)
    — Value 2: showing probable or definite left ventricular hypertrophy by Estes’ criteria
  • thalach: 측정된 최고 혈압
  • ca: flourosopy로 염색된 주요 혈관 수
  • target: 심장병 유무, 0=없음, 1=있음

의학적 용어들이 많이 보이는데요, 더 자세한 정보를 알고싶으신 분은 하단의 링크를 참조하세요:
https://archive.ics.uci.edu/ml/datasets/heart+Disease

어려운 용어들이지만 저희는 방법 알기에 주안점을 두니 너무 스트레스 받지 않으셨으면 좋겠습니다:)

3 — CSV 파일 다운로드

CSV파일 불러오기 글에 있던 것과 동일합니다.

csv_file = tf.keras.utils.get_file('heart.csv', 'https://storage.googleapis.com/applied-dl/heart.csv')

4 — Pandas로 CSV file 읽기

Photo by Ross Parmly on Unsplash

장시간 비행 해보신 적 있으신가요? 가장 오래 걸리는 직항은 싱가포르 항공의 싱가포르에서 뉴욕으로 가는 항공편이라고 합니다. 무려 18시간 25분!

여러분은 직항? 아니면 경유? 무엇을 타시겠어요?

“지금까지 다운로드 받았던 CSV파일은 최종목적지 tf.data에 도착하기 전, 잠시 pandas 데이터프레임에 체류하겠습니다.”

df = pd.read_csv(csv_file)
df.dtypes

이 코드를 작동시키면,
age int64
sex int64
….
oldpeak float64
….
thal object
dtype: object
라는 결과값이 나옵니다. 의미를 살펴보자면,

  • oldpeakfloat 64 타입입니다. CSV파일 캡쳐본에서 볼 수 있듯이, oldpeak는 2.3, 1.5 같은 소수값을 가집니다.
  • thal 은 strings를 포함하고 있는 object 타입입니다.

우리는 thal column(categorical data)를 이산 숫자들로 바꾸고 싶습니다.

df['thal'] = pd.Categorical(df['thal'])
df['thal'] = df.thal.cat.codes
df.head

III. tf.data.Dataset 사용해서 데이터 가져오기

이제 pandas dataframe을 tf.data.Dataset으로 가져와볼까요?

1 — 데이터프레임 자르기

이 데이터프레임에는 feature column 여러 개와 target column이 하나있는데요, target column만 떼서 두 개로 잘라보겠습니다.

target = df.pop('target')
target

0 0
1 1
2 0
3 0
4 0
5 0
….

df.values

array([[63., 1., 1., …, 3., 0., 2.],
.….
[63., 0., 4., …, 2., 3., 4.]])

2 — Combine the Pieces

tf.data.Dataset.from_tensor_slices;를 활용해서 잘라낸 조각들을 잘 분류해서 합쳐보겠습니다.

dataset = tf.data.Dataset.from_tensor_slices((df.values, target.values))for feat, targ in dataset.take(1):
print ('Features: {}, Target: {}'.format(feat, targ))

Features: [ 63. 1. 1. 145. 233. 1. 2. 150. 0. 2.3 3. 0. 2. ], Target: 0
feature column과 target column이 잘 나누어진 것을 확인할 수 있습니다.

쪼개서 다시 하나?

아래의 그림처럼 우표 하나하나씩을 절취선과 함께 하나로 합쳐두어도, 사실 저 우표는 하나가 아니라 여러개입니다! 저희가 잘라서 다시 합친 pandas 데이터프레임도 하나처럼 보이지만 사실은 하나가 아닙니다!

wikipedia.org

절취선이 있어 필요할 때마다 하나씩 쉽게 잘라서 쓸 수 있듯이, 저희가 정리한 데이터도 마찬가지랍니다.

IV. 데이터셋 사용하기

1 — 데이터셋 섞고 묶기

train_dataset = dataset.shuffle(len(df)).batch(1)

2 — 모델 만들고 학습시키기

이제 거의 막바지입니다!

[Create a Model and Compile]

def get_compiled_model():
model = tf.keras.Sequential([
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
return model

get_compiled_model() 을 정의했습니다.

model = get_compiled_model()

[Model Fitting]

model.fit(train_dataset, epochs=15)

아쉽지만 이 튜토리얼에는 테스트 데이터셋이 없어서 model evaluation을 해보는 단계는 없습니다.
마지막 코드를 돌리면 ‘loss: 0.4360 — accuracy: 0.7954’. 결과값을 얻을 수 있는데, 이로부터 테스트 데이터셋이 있다면 어떻게 될지 미루어 짐작할 수 있습니다.

이번에는 pandas데이터를 텐서플로우로 가져와보았습니다.

도움이 많이 되셨나요?

궁금하신 점이나 개선할 점 등 댓글은 언제나 환영하고,

CLAP은 항상 큰 힘이 됩니다.

읽어주셔서 감사합니다.

--

--

A Ydobon
A Ydobon

No responses yet