[ Python ] tensorflow에서 결측치(na)를 특정값으로 대체하기

2020. 1. 12. 21:22분석 Python/Tensorflow

728x90

보통 데이터에는 결측치가 존재한다. 
이러한 결측을 처리하는 데에 있어서 보통은 먼저 결측을 처리하고 들어간다.
만약 이러한 값에 대해서 tensorflow에서 처리를 하려면 다음과 같이하면 된다.
하지만 이 방법은 특정값으로 대체만 가능하다. 
matrix마다 다르게 결측 값을 넣는 것은 좀 더 알아봐야 할 것 같지만, 
numpy나 pandas를 쓰는 게 더 편하긴 할 것 같다.

import os , numpy as np
import tensorflow as tf

data = np.random.normal( size= (5,2))
missingidx = np.random.randint(0,2, size=(5,2))
data[missingidx == 1] = np.nan


위에 처럼 결측이 저렇게 있는 데이터를 tensor에 넣고 싶다.
그래서 나는 이 값을 na가 아닌 "10"이라는 값으로 대체하고 싶다.
그럴 땐 tf.where 와 tf.math.is_nan을 사용하면 된다. 

a = tf.placeholder(tf.float32 , [None , 2])
c = tf.where( tf.math.is_nan(a) , tf.ones_like(a) * 10 , a)
sess = tf.Session()
sess.run(c, feed_dict = {a:data})

이제 다음 단계는 각 열마다 다른 값으로 대체하고 싶을 때가 있다.
역시 tf.where를 사용하면 할 수 있었다.
일단 다음과 같은 행렬을 가지고 있자고 하자.

tf.InteractiveSession()
a = tf.constant([[1,2,np.nan],[np.nan,1,2]])
a.eval()

이제 이 결측치에 대해서 다음과 같이 채운다고 하자.

  • 1번째 컬럼 : 10 ,
  • 2번째 컬럼 : 15
  • 3번째 컬럼 : 20

일단은 결측을 0으로 만들어주자.

raw = tf.where( tf.math.is_nan(a) , tf.zeros_like(a), a)
raw.eval()

그다음에 다음과 같이 missing matrix를 만들어서 missing 부분을 구하고 대체해보자.

matrix = tf.where( tf.math.is_nan(a) , tf.ones_like(a), tf.zeros_like(a))
imputed = tf.constant([10.,15.,20.]) * matrix
result = raw + imputed * matrix
result.eval()

원하는 대로 원하는 컬럼에 원하는 숫자가 들어간 것을 확인했다!

728x90