
실무에서는 딱딱 나눠 떨어지지 않는다는 것에 유의하자
train_test_split 을 통해 데이터셋을 분리할 수 있다.pd.get_dummiescategory 로 변경해야한다.pd.Categoricalx1 컬럼을 가변수화 하고 싶을 때, info를 확인해보면 데이터 타입이 문자열(object)로 되어 있다.<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 x1 5 non-null object
1 x2 5 non-null int64
dtypes: int64(1), object(1)
memory usage: 208.0+ bytesCategorical 을 사용할 때는 가변수화할 컬럼과 어떤 범주값이 존재하는지를 지정해주어야 한다.x1 컬럼의 자료형을 category로 전환하면 판다스가 해당 컬럼을 범주 데이터로 간주한다.train['x1'] = pd.Categorical(train['x1'], categories = ['a','b','c'])
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 x1 5 non-null category
1 x2 5 non-null int64
dtypes: category(1), int64(1)
memory usage: 305.0 bytes
get_dummies() 함수를 사용할 때 사용할 컬럼을 columns= 옵션으로 지정한다. 이때 사용할 컬럼의 데이터 자료가 category여야 한다.x1 컬럼에는 c 값이 없었음에도 불구하고 train 데이터와 동일하게 가변수화 되었다.test['x1'] = pd.Categorical(test['x1'], categories = ['a','b','c'])
pd.get_dummies(test, columns = ['x1'])
x2 x1_a x1_b x1_c
0 7 True False False
1 8 False True False
2 9 False True False

dropna() 메서드를 통해 결측치 제거가 가능하다.sklearn.impute.SimpleImputersklearn.impute.SimpleImputersklearn.impute.KNNImputer이제 모든 과정을 하나의 함수로 만들면 된다.
joblib 라이브러리를 이용하면 함수에 필요한 매개변수나 함수 자체, 학습된 모델 등을 pkl 파일로 저장할 수 있다.
실습 주제 : 수어 번역 AI 모델 파이프라인 구축
과제
※ 학습 데이터, 검증 데이터의 전처리 과정은 생략한다.
# 1. 세션 클리어
clear_session()
# 2. 레이어 쌓기
il = Input(shape=(x_train.shape[1], x_train.shape[2], x_train.shape[3]))
# 컨볼루션 레이어 1
x = Conv2D(32, (3, 3), activation='swish')(il)
x = MaxPooling2D((2, 2))(x)
# 컨볼루션 레이어 2
x = Conv2D(64, (3, 3), activation='swish')(x)
x = MaxPooling2D((2, 2))(x)
# Flatten 레이어
x = Flatten()(x)
# Dense 레이어 1
x = Dense(128, activation='swish')(x)
x = Dropout(0.2)(x)
# 출력 레이어
ol = Dense(24, activation='softmax')(x)
# 모델 선언
model = Model(il, ol)
# 컴파일
model.compile(loss=tf.keras.losses.categorical_crossentropy,
metrics=['accuracy'],
optimizer='adam')
# 요약
model.summary()
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28, 1)] 0
conv2d (Conv2D) (None, 26, 26, 32) 320
max_pooling2d (MaxPooling2D (None, 13, 13, 32) 0
)
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
max_pooling2d_1 (MaxPooling (None, 5, 5, 64) 0
2D)
flatten (Flatten) (None, 1600) 0
dense (Dense) (None, 128) 204928
dropout (Dropout) (None, 128) 0
dense_1 (Dense) (None, 24) 3096
=================================================================
Total params: 226,840
Trainable params: 226,840
Non-trainable params: 0
_________________________________________________________________
코랩 환경이 아닌 로컬에서 돌아가는 모델이므로 가볍게 구성하였다.

검증용 데이터에 대해서는 아주 우수한 성능을 보였다.
cv2 라이브러리를 사용하였다.import cv2
data_path = 'test image/'
data_file = 'v.png'
filename = data_path + data_file
# 파일 로딩
img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
(1 * 28 * 28 * 1)에 맞도록 reshape하는 과정, 스케일링 과정을 진행한다.# 이미지 크기 조정
img = cv2.resize(img, (28, 28))
# input shape 맞추기
img = img.reshape(1, 28, 28, 1)
# Minmax 스케일링
img = img / 255
model_path = 'exercise1/model.pkl'
# 모델 로딩
model = joblib.load(model_path)
# 예측
pred = model.predict(img)
pred = pred.argmax()
def pipeline(img, model):
# 크기 조정
img = cv2.resize(img, (28, 28))
# input shape 맞추기
img = img.reshape(1, 28, 28, 1)
# 스케일링
img = img / 255
# 모델 로딩
model = joblib.load(model_path)
# 예측
pred = model.predict(img)
pred = pred.argmax()
return pred