-
Tensorflow - 데이터 타입과 N/A값 (전처리 Tip)생활코딩/머신러닝야학 2020. 8. 19. 14:52
부록1: 데이터를 위한 팁 - Tensorflow 1
수업소개 데이터 타입의 문제와 NA값의 문제를 해결하는 데이터 전처리 방법을 배웁니다. 강의 소스코드 colab | backend.ai ########################### # 라이브러리 사용 import pandas as pd ###################
opentutorials.org
- 원핫인코딩 시 발생할 수 있는 이슈
- 변수(칼럼) 타입 확인: 데이터.dtypes
- 변수를 범주형으로 변경:
- 데이터['칼럼명'].astype('category')
-
- 변수를 수치형으로 변경:
- 데이터['칼럼명'].astype('int')
- 데이터['칼럼명'].astype('float')
- 변수를 수치형으로 변경:
- 데이터 중 NA 값의 처리
- NA 갯수 체크: 데이터.isna().sum()
- NA 값 채우기: 데이터['칼럼명'].fillna(특정숫자)
원핫인코딩 시 발생할 수 있는 이슈
# 라이브러리 사용 import pandas as pd # 파일 읽어오기 파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris2.csv' 아이리스 = pd.read_csv(파일경로) 아이리스.head() # 범주형 데이터인 '품종' 컬럼의 값이 string 대신 int로 태깅되어 있는 데이터 # 아래의 표와 같은 head 데이터 출력 # 원핫인코딩 되지 않는 현상 확인 인코딩 = pd.get_dummies(아이리스) # 범주데이터 처리를 위해 원핫인코딩 시도 인코딩.head() # 아래의 표와 같은, 위의 아이리스.head()와 같은 head 데이터 출력 (원핫인코딩 적용되지 않음)
꽃잎길이 꽃잎폭 꽃받침길이 꽃받침폭 품종 0 5.1 3.5 1.4 0.2 0 1 4.9 3.0 1.4 0.2 0 2 4.7 3.2 1.3 0.2 0 3 4.6 3.1 1.5 0.2 0 4 5.0 3.6 1.4 0.2 0 - pandas에서 read_csv로 데이터를 읽어올 때, 값이 숫자(int, float)라면 숫자 데이터로 인식하기 때문
- pandas는 컬럼의 데이터 타입이 category, object인 경우에만 원핫인코딩을 적용
- 원핫인코딩이 필요한 컬럼의 데이터 타입이 숫자타입인 경우, category로 바꿔주어야함
# 칼럼의 데이터 타입 체크 print(아이리스.dtypes) """ 꽃잎길이 float64 꽃잎폭 float64 꽃받침길이 float64 꽃받침폭 float64 품종 int64 # 숫자로 인식해서 원핫인코딩이 적용되지 않았음 dtype: object """ # 품종 타입을 범주형으로 바꾸어 준다. 아이리스['품종'] = 아이리스['품종'].astype('category') print(아이리스.dtypes) """ 꽃잎길이 float64 꽃잎폭 float64 꽃받침길이 float64 꽃받침폭 float64 품종 category # 변환완료 dtype: object """ # 카테고리 타입의 변수만 원핫인코딩 인코딩 = pd.get_dummies(아이리스) 인코딩.head()
꽃잎길이 꽃잎폭 꽃받침길이 꽃받침폭 품종_0 품종_1 품종_2 0 5.1 3.5 1.4 0.2 1 0 0 1 4.9 3.0 1.4 0.2 1 0 0 2 4.7 3.2 1.3 0.2 1 0 0 3 4.6 3.1 1.5 0.2 1 0 0 4 5.0 3.6 1.4 0.2 1 0 0 - 범주형데이터가 원핫인코딩 완료된 결과를 얻을 수 있음
데이터 중 NA 값의 처리
# NA값을 체크해 봅시다. 아이리스.isna().sum() # 컬럼별로 NA값이 있는지 체크 """ 꽃잎길이 0 꽃잎폭 1 # 꽃잎폭 컬럼에 NA값이 있다는 뜻 꽃받침길이 0 꽃받침폭 0 품종 0 dtype: int64 """ 아이리스.tail() # 이 데이터에는 맨 마지막 행에 NA값이 있기 때문에, 테스트해보면
꽃잎길이 꽃잎폭 꽃받침길이 꽃받침폭 품종 145 6.7 3.0 5.2 2.3 2 146 6.3 2.5 5.0 1.9 2 147 6.5 3.0 5.2 2.0 2 148 6.2 3.4 5.4 2.3 2 149 5.9 NaN 5.1 1.8 2 - NaN값은 0이 아니기 때문에, Not Available로 태깅됨
- 이렇게 NaN값이 포함된 데이터로 모델을 만들면 에러 발생
- NaN값을 해당 컬럼 평균값 등의 다른 값으로 대체하거나, 해당 행을 삭제하는 등의 조치 필요
# NA값에 꽃잎폭 평균값을 넣어주는 방법 mean = 아이리스['꽃잎폭'].mean() print(mean) # 3.0543624161073835 아이리스['꽃잎폭'] = 아이리스['꽃잎폭'].fillna(mean) 아이리스.tail()
꽃잎길이 꽃잎폭 꽃받침길이 꽃받침폭 품종 145 6.7 3.0 5.2 2.3 2 146 6.3 2.5 5.0 1.9 2 147 6.5 3.0 5.2 2.0 2 148 6.2 3.4 5.4 2.3 2 149 5.9 3.054362 5.1 1.8 2 - 이슈가 되었던 NA값을 평균값으로 대체 완료
'생활코딩 > 머신러닝야학' 카테고리의 다른 글
Tensorflow - BatchNormalization layer (학습이 잘 되는 모델) (0) 2020.08.19 Tensorflow - 히든레이어와 인공신경망 (0) 2020.08.19 Tensorflow - 분류모델, 원핫인코딩, Softmax(아이리스 품종 분류) (0) 2020.08.18 Tensorflow - 딥러닝 모델과 퍼셉트론(보스턴 집값 예측) (0) 2020.08.17 Tensorflow - 지도학습 순서(레모네이드 판매 예측) (0) 2020.08.14 - 원핫인코딩 시 발생할 수 있는 이슈