* 데이터 전처리 - 데이터 타입 보정
* 변수(칼럼)타입 확인 : 데이터.dtype
- 변수를 범주형으로 변경: 데이터['칼럼명'].astype('category')
- 변수를 수치형으로 변경 : 데이터['칼럼명'].astype('int') / 데이터['칼럼명'].astype('float')
* 데이터 내부의 NA값 처리
- NA 갯수 체크 - 데이터.isna().sum()
- NA 값 채우기 - 데이터['칼럼명'].fillna(특정숫자)
*Tip
1. 데이터의 타입을 확인하고
2. 내가 원하는 데이터의 타입으로 변경 후
3. 데이터 처리
* 데이터 전처리- NA값 처리
NaN(NA)은 정해지지 않은 값으로 0과 다른 의미를 가진다.
* 실습
1. 아이리스 품종이 숫자로 변경
2. (아이리스.dtype)각 컬럼들이 어떤 타입으로 읽어드렸는지 알려줌
3. 원핫인코딩은 [category,object]타입인경우만 변환 하기때문에 타입을 category,object 형으로 [변환] 후 진행해야한다.
4. NA값 체크 - 칼럼 별로 NA값 있는 지 확인 해준다.
5. NA값을 지워주거나 , 데이터를 변경하여 데이터를 읽거나, NA값에 평균값을 넣어준다.
6. mean 평균값 계산
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 라이브러리 사용
import pandas as pd # pip install pandas
#1. 과거의 데이터 준비
iris = pd.read_csv('https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris2.csv')
# 원핫인코딩 - category, object type만 변환
print(iris.dtypes)
iris_incoding_ = pd.get_dummies(iris)
print(iris_incoding_.head())
# 품종 타입을 범주형으로 바꾸어 준다.
iris['품종'] = iris['품종'].astype('category') # 품종컬럼을 category타입으로 변환
print(iris.dtypes)
# 카테고리 타입의 변수만 원핫인코딩
iris_incoding_ = pd.get_dummies(iris)
print(iris_incoding_.head())
# NA값을 체크해 봅시다.
print(iris.isna().sum()) # 각 컬럼에 있는 NA값을 더하여 보여준다.
print(iris.tail()) ## 데이터의 마지막 값 5개 출력
# NA값에 꽃잎폭 평균값을 넣어주는 방법
mean = iris['꽃잎폭'].mean()# 꽃잎폭의 평균값
print('mean = {} '.format(mean))
iris['꽃잎폭'] = iris['꽃잎폭'].fillna(mean) # NA값을 꽃잎폭의 평균값으로 채움
print(iris.tail())
* BatchNormalization layer를 사용하여 보다 학습이 잘되는 모델 생성
* 실습
1. 분리 이유는 BatchNormalization layer는 dense 레이어와 activation 레이어 사이에 넣어두면 효과가 좋기때문이다.
2. 레이어를 3개 쌓은것(은닉층)
3. swish는 버전 상의 문제로 'relu'으로 대체했고, 이것은 metrics 타입이라 accuracy 를 알 수 없다(이부분은 좀더 고민해 봐야겠다)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 라이브러리 사용
import tensorflow as tf # pip install --upgrade tensorflow
import pandas as pd # pip install pandas
#1. 과거의 데이터 준비
iris = pd.read_csv('https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv')
print(iris.head())
# 원샷인코딩
iris_incoding_ = pd.get_dummies(iris)
print(iris_incoding_.head())
print(iris_incoding_.columns)
# 독립변수, 종속변수
independent_var = iris_incoding_[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']] #독립변수
dependent_var = iris_incoding_[['품종_setosa', '품종_versicolor','품종_virginica']] #종속변수
print('iris 독립변수 = {}, 종속변수 = {}\n'.format(independent_var.shape ,dependent_var.shape))
independent_var_row = independent_var.shape[0] # 독립변수 행(row)
independent_var_col = independent_var.shape[1] # 독립변수 열(col)
dependent_var_row = dependent_var.shape[0] # 종속변수 행(row)
dependent_var_col = dependent_var.shape[1] # 종속변수 열(col)
# 2. 모델의 구조를 BatchNormalization layer를 사용하여 만든다.
X = tf.keras.layers.Input(shape=[4])# 독립변수의 컬럼개수
# 분리 이유는 BatchNormalization layer는 dense 레이어와 activation 레이어 사이에 넣어두면 효과가 좋기때문
H = tf.keras.layers.Dense(8)(X)
H = tf.keras.layers.BatchNormalization()(H) ## BatchNormalization layer는 dense 레이어와 activation 레이어 사이
H = tf.keras.layers.Activation('relu')(H)
H = tf.keras.layers.Dense(8)(H)
H = tf.keras.layers.BatchNormalization()(H)## BatchNormalization layer는 dense 레이어와 activation 레이어 사이
H = tf.keras.layers.Activation('relu')(H)
H = tf.keras.layers.Dense(8)(H)
H = tf.keras.layers.BatchNormalization()(H)## BatchNormalization layer는 dense 레이어와 activation 레이어 사이
H = tf.keras.layers.Activation('relu')(H)
Y = tf.keras.layers.Dense(3, activation='softmax')(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy') #Type of `metrics` argument not understood. Expected a list or dictionary, found: accuracy 발생
# 모델 구조 확인
model.summary()
# 3. 데이터로 모델을 학습(FIT)
model.fit(independent_var, dependent_var, epochs=10) # epochs = 전체 데이터를 몇번반복 학습할 것인지를 결정해 주는 숫자
model.fit(independent_var, dependent_var, epochs=100, verbose=0) # verbose =0 출력(로그) 표시안함
# 4. 모델을 이용
print('**** predict ****')
print(model.predict(independent_var[5:10])) #독립변수 예측값 확인 [5~10개만]
print('******check result(test)********')# 종속변수 확인
print(dependent_var[5:10]) # 종속변수결과 출력하여 예측한 값이 맞는 지 확인
print('************************************')
# 맨 마지막 데이터 5개
print('**** predict ****')
print(model.predict(independent_var[-5:]))
print('******check result(test)********')
print(dependent_var[-5:])
# 모델의 수식 확인
# print(model.get_weights())
부록 수업에서 많은 것을 알게 되었다. 특히 은닉충을 3개로 나누어서 하는 부분을 실제적용하려고 하니 오류가 많이 발생했다. 이부분은 좀더 공부후 개인적으로 수정해야겠다. 😂
opentutorials.org/course/4570/28989
opentutorials.org/course/4570/29242
'개발 > 머신러닝' 카테고리의 다른 글
[Google Colab Pro] 코랩 구독 하는 방법 (0) | 2022.06.28 |
---|---|
[생활코딩/머신러닝야학] 신경망의 완성-히든레이어 및 정리 (0) | 2021.01.21 |
[생활코딩/머신러닝야학] 아이리스 품종 분류 (0) | 2021.01.13 |
[생활코딩/머신러닝야학] 보스턴 집값 예측 (0) | 2021.01.12 |
[생활코딩/머신러닝야학] 레몬네이드 판매량 예측(2) - neural network (0) | 2021.01.11 |