

μ΄λ―Έμ§μ κ° ν½μ μ λν κ°μ νμ©νμ¬ 0~9κΉμ§μ μ«μλ₯Ό μμΈ‘νλ λͺ¨λΈμ ꡬννλ€.

28 x 28 (784) ν¬κΈ°μ μ«μ μκΈμ¨μ λν 2μ°¨μ ν½μ λ°μ΄ν°κ° 1μ°¨μ ννλ‘ λ€μ΄μλ€.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.metrics import classification_report
# Raw Data Loading
df = pd.read_csv('/content/drive/MyDrive/KDT/kaggle/Digit Recognizer/01. train.csv')
display(df.head())

fig = plt.figure()
axes = []
for i in range(10):
axes.append(fig.add_subplot(2, 5, i + 1))
axes[i].imshow(x_data[i].reshape(28, 28), cmap='gray_r')
plt.tight_layout()
plt.show()

μ΄λ€ λ°μ΄ν°κ° μλμ§ 10κ°μ λ°μ΄ν°λ§ λ½μ μ΄λ―Έμ§λ‘ μΆλ ₯ν΄ λ³΄μλ€. λν, μ΄ λ°μ΄ν° μ μ κ²½μ° κ²°μΈ‘μΉ, μ΄μμΉ, μ€λ³΅ λ°μ΄ν°μ λν μ²λ¦¬κ° μλ²½νκ² μ§νλμ΄μμ΄ λ°λ‘ μ μ²λ¦¬ μμ μ ν κ²μ΄ μλ€.
x_data = df.drop('label', axis=1, inplace=False).values
t_data = df['label'].values.reshape(-1, 1)
scaler = MinMaxScaler()
scaler.fit(x_data)
x_data_norm = scaler.transform(x_data)
0~255κΉμ§μ μ°μμ μΈ μ€μ λ°μ΄ν° κ°μ΄ λ€μ΄μμΌλ―λ‘ λͺ¨λΈμ νμ΅μ μν΄ Min-Max Scaling μ²λ¦¬λ₯Ό νμλ€.
x_data_train_norm, x_data_test_norm, t_data_train, t_data_test = \
train_test_split(x_data_norm, t_data,
test_size=0.2, stratify=t_data)
λͺ¨λΈ νμ΅ ν λͺ¨λΈ κ²μ¦μ μν΄ νμ΅λ°μ΄ν°μ ν μ€νΈ λ°μ΄ν°λ₯Ό λλμ΄μ£Όμλ€.
model = Sequential()
model.add(Flatten(input_shape=(784,)))
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(optimizer=SGD(learning_rate=1e-1),
loss = 'sparse_categorical_crossentropy',
metrics=['acc'])
es_callback = EarlyStopping(monitor='val_loss', patience=5,
restore_best_weights=True, verbose=1)
model.fit(x_data_train_norm, t_data_train,
epochs=100, verbose=1,
validation_split=0.3, batch_size=100,
callbacks=[es_callback])
μ΄μ§ λ‘μ§μ€ν± λͺ¨λΈμ΄κΈ° λλ¬Έμ νμ±ν ν¨μλ‘ 'softmax' ν¨μλ₯Ό μ¬μ©νμκ³ , μ΄ λͺ¨λΈμ κ²½μ° λ€μ€ λΆλ₯ λͺ¨λΈλ‘, 0~9κΉμ§μ λν μ’ μλ³μμ λν΄ One-Hot Encoding μμ μ ν΄μΌνμ§λ§ λͺ¨λΈ λ΄λΆμ μΌλ‘ μ²λ¦¬ν μ μλλ‘ μμ€ ν¨μλ‘λ 'sparse_categorical_crossentropy' ν¨μλ₯Ό μ¬μ©νμ¬ λ§€μ° κ°λ¨ν DNN λͺ¨λΈμ ꡬννμλ€.
print(classification_report(t_data_test, np.argmax(model.predict(x_data_test_norm), axis=1)))
# precision recall f1-score support
# 0 0.97 0.98 0.98 827
# 1 0.97 0.99 0.98 937
# 2 0.96 0.96 0.96 835
# 3 0.94 0.96 0.95 870
# 4 0.98 0.94 0.96 814
# 5 0.95 0.95 0.95 759
# 6 0.98 0.97 0.98 827
# 7 0.97 0.96 0.97 880
# 8 0.95 0.94 0.95 813
# 9 0.93 0.95 0.94 838
# accuracy 0.96 8400
# macro avg 0.96 0.96 0.96 8400
# weighted avg 0.96 0.96 0.96 8400
λͺ¨λΈ νκ° κ²°κ³Ό F1 Scoreκ° 0.96μ΄ μΆλ ₯λ κ²μ νμΈν μ μμλ€.
# Test Data Loading
test = pd.read_csv('/content/drive/MyDrive/KDT/kaggle/Digit Recognizer/02. test.csv')
# Test Data Preprocessing
test_data_norm = scaler.transform(test.values)
# μμΈ‘
test_result = model.predict(test_data_norm)
test_result = np.argmax(test_result,axis=1)
# Submission Data Loading
submission = pd.read_csv('/content/drive/MyDrive/KDT/kaggle/Digit Recognizer/03. sample_submission.csv')
# μ λ΅ μ
λ ₯ λ° μΆμΆ
submission['Label'] = test_result
submission.to_csv('Digit_Recognition_DNN.csv', index=False)
ν μ€νΈ λ°μ΄ν°λ₯Ό κ°μ Έμμ νλ ¨ λ°μ΄ν°μ λκ°μ΄ μ μ²λ¦¬λ₯Ό μ§ννμκ³ , μμΈ‘ κ²°κ³Όλ₯Ό μ μΆ λ°μ΄ν°μ μ½μ νμ¬ μ μΆνμλ€.

μ΄ λ°μ΄ν° μ μ κ²½μ° λ§€μ° μ μ μ λ λ°μ΄ν°λ‘ λ°λ‘ μ μ²λ¦¬ μμ μμ΄λ κ½€ λμ μ μλ₯Ό λ°μ μ μμλ€. μ΄λ₯Ό λ°νμΌλ‘ λ μ΄λ €μ΄ μ΄λ―Έμ§ μ²λ¦¬ λ¬Έμ λ κ²½νν΄ λ΄μΌκ² λ€.
https://www.kaggle.com/competitions/digit-recognizer