[Python] 연습

텐서플로로 간단한 머신러닝 실습하기

Simon Yoon 2022. 7. 11. 18:30

이번 포스팅에서는 머신러닝의 흐름을 학습하고 간단하게 모델을 만들어 본 후 예측까지 실습을 진행해보겠습니다.


머신러닝의 흐름

막연히 머신러닝이라하면 어렵게만 느껴질수도 있지만, 실제로 그 흐름을 이해하고 나면 크게 어렵게 느껴지지 않을 것입니다.

다만 머신러닝을 이해하기 전에 기본적으로 데이터에 대한 이해가 어느정도 뒷받침이 되어 있다면 더욱 좋을 것입니다.

 

머신러닝 모델을 만드는 과정을 4개의 과정으로 단순화 해보겠습니다.

 

1단계: 과거의 데이터를 준비합니다. 이때의 과거 데이터는 독립변수와 종속변수가 있는 지도학습(Supervised Learning)이 가능한 데이터라고 하겠습니다.

2단계: 모델의 구조를 만듭니다. 우리는 모델을 만들기 위해서 텐서플로(tensorflow)의 케라스(keras)를 사용할 것입니다. 간단한 모델을 만들기 위해서는 파이썬 코드도 크게 복잡하지 않습니다.

3단계: 준비한 데이터를 가지고 모델을 학습시킵니다.

4단계: 만들어진 모델을 이용하여 예측하고자 하는 값을 구합니다.

 

기본적인 흐름은 어렵지 않습니다. 다시 보자면, 학습에 필요한 데이터를 준비하고 → 모델을 텐서플로를 사용해서 준비한 후 → 모델을 학습시키고 → 원하는 값을 예측하면 됩니다. 다만 그 과정에 있어서 조금 더 이해 해야할 부분이나 방법을 다르게 할 부분이 존재할 뿐입니다.


Prerequisite: 필요한 라이브러리 임포트

이번 실습에서는 판다스(pandas)텐서플로(tensorflow)만 임포트하여 사용하면 됩니다.

# 필요한 라이브러리 임포트
import pandas as pd
import tensorflow as tf

1단계: 과거 데이터를 준비하기

지금 우리는 비지도학습(Unsupervised Learning)이 아닌 지도학습(Supervised Learning)을 하고자 하므로 독립변수와 종속변수가 있는 데이터를 준비하고, 해당 데이터에서 독립변수와 종속변수를 분리하겠습니다. 지금 각각의 용어들을 다 설명하기는 어려우니 추후에 따로 관련 필요한 용어만 정리하여 포스팅 하도록 하겠습니다.

 

이번에 사용할 데이터는 독립변수: ['Income', 'Lot_Size'] (2개), 종속변수: ['Ownership'] (1개) 로 이루어진 데이터입니다. 종속변수는 'Owner'와 'Nonowner'의 두가지 클래스로 분류되어 있습니다. 아래의 이미지는 해당 데이터의 일부이며 전체 테이터는 24개의 레코드가 있습니다. 그리고 분석의 목표는 두가지 독립변수를 이용해서 Riding Mowers의 Ownership을 판별하고자 합니다.

 

예시 데이터

 

먼저 판다스의  pd.read_csv()  함수를 이용해서 데이터를 불러옵니다. 데이터를 불러오고나면 반드시 데이터가 어떻게 생겼는지, 결측값은 없는지, 수치형 변수들의 기초통계량 등을 확인해야합니다. 다만 이번 과정에서는 특별한 부분이 없는 데이터이므로 생략하도록 하겠습니다.

# 1. 데이터 준비하기
mowers = pd.read_csv("/파일경로/RidingMowers.csv")
mowers.head()

앞에서 잠깐 언급했듯이 독립변수와 종속변수를 나눠주도록 하겠습니다. 이렇게 변수를 분리시켜주는 이유는 뒤에서 모델을 만들 때 서로 따로 넣어줘야하기 때문입니다.

그 전에 이 데이터는 종속변수가 범주형이고 분류를 위한 것이기 때문에 파이썬에서는 원핫 인코딩을 해서 문자형 데이터가 아닌 숫자형 더미 변수로 변경해 주어야 합니다. 이때 사용할 수 있는 함수가  pd.get_dummies()  함수입니다.

# 원핫 인코딩
mowers = pd.get_dummies(mowers)
mowers.head()

변경하고 나면 아래와 같은 데이터가 나오게 됩니다.

 

원핫 인코딩 후 데이터

원핫 인코딩을 했으니 다시 독립변수와 종속변수를 분리해주겠습니다.

independent = mowers[['Income', 'Lot_Size']]
dependent = mowers[['Ownership_Nonowner', 'Ownership_Owner']]
print(independent.shape, dependent.shape)

# 참고로, 독립변수를 분리할 때,
# mowers.drop(['Ownership_Nonowner', 'Ownership_Owner'], axis=1)
# 이와 같이 drop()을 이용하면 독립변수가 많을때 편하게 종속변수를 뺀 나머지를 분리해낼 수 있습니다.

이렇게 데이터를 변형하고 나면, 반드시  shape  함수 등을 써서 데이터 형태를 한번씩 확인해 보아야 합니다. 여기서는  print(independent.shape, dependent.shape)  를 사용하여 간단하게 확인했습니다.


2단계: 모델의 구조 만들기

모델의 구조를 만들기 위한 코드를 먼저 보고 학습해보도록 하겠습니다.

# 모델의 구조 만들기
x = tf.keras.layers.Input(shape=[2])
y = tf.keras.layers.Dense(2, activation='softmax')(x)
model = tf.keras.models.Model(x, y)
model.compile(loss = 'categorical_crossentropy', metrics = 'accuracy')

첫번째 코드는 Input 레이어를 만들고 그 안에  shape=[2]  로 독립변수 개수를 적어주었습니다.

두번째 코드는 원래의 데이터에는 Ownership 칼럼이 하나였지만, 원핫 인코딩을 통해서 두개의 칼럼으로 바꿔주었고, 따라서 종속변수의 개수도 2개로 작성하였습니다. 분류를 위한 모델링이므로 활성화함수는 'softmax' 로 지정하였습니다.

세번째 코드와 네번째 코드까지 입력해서 모델을 생성하고 평가지표는 'crossentropy' 'accuracy'  로 보고자 합니다.


3단계: 모델을 학습시키기

이제 모델과 데이터는 준비되었으니 모델에 데이터를 넣어 학습시키면 될 것입니다. 이때 사용할 수 있는 함수가 fit 함수입니다.

# 3. 모델을 학습시키기
model.fit(independent, dependent, epochs=100)

기본적으로  model.fit(예측변수, 반응변수, 몇 번 반복학습할지)  이와 같은 형태로 작성해줍니다. 실행하면 자동적으로 알아서 학습을 할텐데 아까 적었던 lossaccuracy를 통해서 학습이 어느정도 되었는지도 파악할 수 있습니다.

 

실행 및 학습 결과

학습이 더 필요한 경우에는 epochs 의 숫자를 변경하여 다시 실행시켜주면 원하는 수만큼 더 학습을 진행하게 됩니다. 어느정도 충분히 학습이 되었다면 학습하는 것은 그만두고 모델을 이용하여 예측 결과를 확인해 보면 됩니다. 저는 1200번 학습하였습니다.


4단계: 모델을 이용하여 예측하기

모델이 학습을 마쳤다면 이제 결과를 확인해볼 차례입니다. 원래는 새로운 데이터를 넣어서 어떻게 분류하는지로 활용할 수 있지만, 이번에는 원래 데이터를 이용하여 예측과 정답이 얼마나 다른지를 확인해보겠습니다.

예측할 때는  predict()  함수를 사용하면 됩니다.

# 4. 모델을 이용하여 예측하기
# 5번째 데이터까지 예측
print(model.predict(independent[:5]))

예측 결과

결과를 확인해보면 첫번째 레코드는 Nonowner일 확률이 0.525, Owner일 확률이 0.475,

두번째 레코드는 Nonowner일 확률이 0.263, Owner일 확률이 0.737,

세번째 레코드는 Nonowner일 확률이 0.493, Owner일 확률이 0.507, ... 이렇게 해석할 수 있습니다.

즉, 개별 레코드의 각 클래스에 속할 확률이 나오고 이를 바탕으로 확률이 더 높은 클래스로 분류하게 됩니다. 이 결과와 실제 데이터를 비교해보겠습니다.

# 실제 데이터 5번째 데이터까지 출력
print(dependent[:5])

결과 비교

두 결과를 비교해보면 모든 레코드의 실제값은 Owner였지만 예측값은 다르게 나온 경우를 확인할 수 있을 것입니다.


추가: 가중치 확인하기

참고로 학습한 결과 중에서 가중치를 확인하고 싶다면  get_weights  함수를 사용하면 됩니다.

# 가중치 확인하기
print(model.get_weights())

결과를 해석하면  Nonowner일 확률 = softmax(0.281 * Income + 0.556 * Lot_Size + 1.102)  입니다.


이번에는 간단하게 텐서플로 케라스를 사용해서 딥러닝을 맛보기 해봤습니다. 전체적인 흐름 자체가 어렵지는 않고 충분히 따라할 수 있습니다. 다만 배경지식에 따라 세세한 내용에 대한 추가학습이 필요할수도 있겠습니다. 감사합니다.

 

* 참고문헌

이숙번, 이고잉, <생활코딩 머신러닝 with 파이썬 텐서플로>, 위키북스, 2021

'[Python] 연습' 카테고리의 다른 글

[AIFB] DataFrame 변형하기  (0) 2022.08.13
[AIFB] Python Basic  (0) 2022.08.12
[Python] NumPy 배열 인덱싱, 슬라이싱 연습  (0) 2022.07.07
[Python] numpy 기본 정리  (0) 2022.07.06
[Python] enumerate () 함수  (0) 2022.06.30