[ 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
'분석 Python > Tensorflow' 카테고리의 다른 글
Tensorflow Version 1 tune 간단 예제 (0) | 2020.02.02 |
---|---|
Tensorflow Projector 사용하기 (0) | 2020.01.26 |
tf.scan, tf.less , tf.assign , projector, tf.dtypes (0) | 2020.01.05 |
Tensorflow 1.x Tabular Data Neural Network Modeling (0) | 2020.01.04 |
Tensorflow Adanet Tabular Data 적용해보기 (0) | 2019.12.29 |