1. 데이터 불러오기
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from os.path import join as opj
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pylab
plt.rcParams['figure.figsize'] = 10, 10
%matplotlib inline
from google.colab import drive
drive.mount('/content/drive')
test = pd.read_json('/content/drive/MyDrive/data/test.json')
train = pd.read_json('/content/drive/MyDrive/data/train.json')
colab에서 필사를 하였기 때문에, 구글드라이브에 파일을 업로드해서 사용하였다!
2. 데이터 처리
2.1 결측치 처리
train.inc_angle = train.inc_angle.replace('na',0)
train.inc_angle = train.inc_angle.astype(float).fillna(0.0)
train 데이터에서 결측치를 0으로 변경 후, float 타입으로 바꾸었다.
2.2
# train
X_band_1 = np.array([np.array(band).astype(np.float32).reshape(75,75) for band in train["band_1"]])
X_band_2 = np.array([np.array(band).astype(np.float32).reshape(75,75) for band in train["band_2"]])
X_train = np.concatenate([X_band_1[:, :, :, np.newaxis], X_band_2[:, :, :, np.newaxis], ((X_band_1+X_band_2)/2)[:,:,:, np.newaxis]], axis=-1)
# test
X_band_test_1 = np.array([np.array(band).astype(np.float32).reshape(75,75) for band in test["band_1"]])
X_band_test_2 = np.array([np.array(band).astype(np.float32).reshape(75,75) for band in test["band_2"]])
X_test = np.concatenate([X_band_test_1[:,:,:,np.newaxis], X_band_test_2[:,:,:,np.newaxis],((X_band_test_1+X_band_test_2)/2)[:,:,:,np.newaxis]], axis=-1)
band_1, band_2를 reshape를 이용해 75*75로 바꾼후, 2D CNN 학습을 위해 [N, height, width, channel]의 차원으로 변경한다. 이 때 차원을 하나 늘리기 위해 np.newaxis를 사용하였다.
3. 시각화
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode(connected=True)
def plotmy3d(c, name):
data = [go.Surface(z=c)] # z축이 입력받은 변수 c의 값으로 그래프가 그려진다.
layout = go.Layout(title=name, autosize=False, width = 700, height = 700,
margin=dict(l=65, r=50, b=65, t=90))
fig = go.Figure(data=data, layout=layout)
#py.iplot(fig)
fig.show(renderer="colab")
plotly라는 시각화 툴은 matplotlib보다 이쁘고 보기 좋게 그려진다. 마우스를 그래프에 갖다 대면, 그래프에 x,y,z값이 뜨기 때문에 바로 데이터 값을 알 수 있다.
plotmy3d(X_band_1[12,:,:], 'iceberg') # 12번째 : iceberg
plotmy3d(X_band_1[14, :, :], 'Ship') # 14번째 : ship
그래프를 넣고 싶은데 아직 어떻게 하는지 모르겠다.(수정!!)
train 데이터의 12번째를 살펴보면, is_iceberg가 1이고 14번째는 is_iceberg가 0이다. 즉, 12번째 데이터는 빙하를 나타내고, 14번째는 배를 나타내는 데이터라는 것을 알 수 있다.
4. 모델링
from matplotlib import pyplot
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Input, Flatten, Activation
from keras.layers import GlobalMaxPooling2D
from keras.layers.normalization import batch_normalization
from keras.layers.merge import Concatenate
from keras.models import Model
from keras import initializers
from keras.optimizers import adam_v2 # Adam
from keras.callbacks import ModelCheckpoint, Callback, EarlyStopping
# model define
def getModel():
#Building the model
gmodel=Sequential()
#Conv Layer 1
gmodel.add(Conv2D(64, kernel_size=(3, 3),activation='relu', input_shape=(75, 75, 3)))
gmodel.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
gmodel.add(Dropout(0.2))
#Conv Layer 2
gmodel.add(Conv2D(128, kernel_size=(3, 3), activation='relu' ))
gmodel.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
gmodel.add(Dropout(0.2))
#Conv Layer 3
gmodel.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
gmodel.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
gmodel.add(Dropout(0.2))
#Conv Layer 4
gmodel.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
gmodel.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
gmodel.add(Dropout(0.2))
#Flatten the data for upcoming dense layers
gmodel.add(Flatten())
#Dense Layers
gmodel.add(Dense(512))
gmodel.add(Activation('relu'))
gmodel.add(Dropout(0.2))
#Dense Layer 2
gmodel.add(Dense(256))
gmodel.add(Activation('relu'))
gmodel.add(Dropout(0.2))
#Sigmoid Layer
gmodel.add(Dense(1))
gmodel.add(Activation('sigmoid'))
mypotim = adam_v2.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
gmodel.compile(loss='binary_crossentropy',
optimizer=mypotim,
metrics=['accuracy'])
gmodel.summary()
return gmodel
더 작성할 예정
def get_callbacks(filepath, patience=2):
es = EarlyStopping('val_loss', patience=patience, mode="min")
msave = ModelCheckpoint(filepath, save_best_only=True)
return [es, msave]
file_path = ".model_weights.hdf5"
callbacks = get_callbacks(filepath=file_path, patience=5)
get_callbacks 함수를 적용한 위의 코드는, 5번의 epoch동안 val_loss가 min이 되지 않으면 학습을 조기종료한다는 의미이다. 즉, loss가 더이상 줄어들지 않을 때 학습을 멈추게 된다.
4. 모델 평가
target_train = train['is_iceberg']
X_train_cv, X_valid, y_train_cv, y_valid = train_test_split(X_train, target_train, random_state=1, train_size=0.75)
import os
gmodel = getModel()
gmodel.fit(X_train_cv, y_train_cv, batch_size=24, epochs=50, verbose=1, validation_data=(X_valid, y_valid), callbacks=callbacks)
gmodel.load_weights(filepath=file_path)
score = gmodel.evaluate(X_valid, y_valid, verbose=1) # 성능평가
print('Test loss:', score[0])
print('Test acuuracy:', score[1])
predicted_test = gmodel.predict(X_test) # predict_proba
5. 제출
submission = pd.DataFrame()
submission['id'] = test['id']
submission['is_iceberg'] = predicted_test.reshape((predicted_test.shape[0]))
submission.to_csv('sub.csv',index=False)
출처 : https://www.kaggle.com/devm2024/keras-model-for-beginners-0-210-on-lb-eda-r-d
참고 : https://kaggle-kr.tistory.com/19?category=868316
'데이터 분석 > kaggle' 카테고리의 다른 글
[kaggle] Fashion MNIST 필사 ① (0) | 2021.08.31 |
---|---|
[kaggle] Fruits 360 (0) | 2021.08.28 |
[kaggle] image classification 필사 목록 (0) | 2021.08.25 |
댓글