# 사이킷런 load_digits 데이터 

import pandas as pd
import numpy as np
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error, accuracy_score

from sklearn.datasets import load_digits
from tensorflow.python.keras.callbacks import EarlyStopping

#1. 데이터 

data_sets= load_digits()

x=data_sets.data

y=data_sets['target']
# .reshape(-1, 1)

#판다스 원핫 해보기

y = pd.get_dummies(y)   #

print(x.shape, y.shape)  #(1797, 64) (1797, 10)

x_train, x_test, y_train, y_test = train_test_split(x, y,
                                                    train_size=0.8,
                                                    random_state=443,
                                                    stratify=y,
                                                    shuffle=True,
                                                    )

# print(np.unique(y_train, return_counts=True))

#2. 모델 구성

model = Sequential()
model.add(Dense(100, input_dim=64))
model.add(Dense(80,activation='relu'))
model.add(Dense(60,activation='relu'))
model.add(Dense(40,activation='relu'))
model.add(Dense(20,activation='relu'))
model.add(Dense(10,activation='softmax'))

#3. 컴파일, 훈련
model.compile(loss='categorical_crossentropy', optimizer='adam',
              metrix=['acc']
              )

es = EarlyStopping(monitor='val_loss',
                   mode='min',
                   patience=50,
                   verbose=1)

hist = model.fit(x_train, y_train,
                 epochs = 250,
                 validation_split=0.2,
                 batch_size=300,
                 verbose=1,
                 callbacks=[es])

#4. 평가, 예측

result = model.evaluate(x_test, y_test)
print('result :', result)

y_predict=np.round(model.predict(x_test))
acc = accuracy_score(y_test, y_predict)
print('acc :', acc)